Как получить HTML-текст в XML через XSL

Похоже, exclude-result-prefixes не относится к xsl:copy-of. Когда я запускаю следующий XML, его вывод имеет пространство имен в теге <table>, что не является желаемым поведением в моем случае. Конечной целью является получение элемента DataItem, который может содержать текст типа XML/HTML и не должен изменяться по какой-либо причине. Итак, как лучше всего получить DataItem как есть?

XML

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="test.xsl" ?>
<root>
  <E2ETraceEvent xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
    <ApplicationData>
      <TraceData>
        <DataItem>
          <table>
            <tr>
              <td>This should not be a table</td>
              <td>It must be a text</td>
            </tr>
          </table>
        </DataItem>
      </TraceData>
    </ApplicationData>
  </E2ETraceEvent>
</root>

XSL

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:te="http://schemas.microsoft.com/2004/06/E2ETraceEvent"
                exclude-result-prefixes="te">
  <xsl:output method="html" indent="no"/>
  <xsl:template match="/">
      <html>
        <body>
          <table>
            <thead>
              <tr>
                <td>Data</td>
              </tr>
            </thead>
            <tbody>
              <xsl:for-each select="//te:E2ETraceEvent">
              <tr>
                <td>
                  <table>
                    <xsl:for-each select=".//te:TraceData//te:DataItem">
                      <tr>
                        <td>
                          <xmp>
                            <xsl:copy-of select="*" />
                          </xmp>
                        </td>
                      </tr>
                    </xsl:for-each>
                  </table>
                </td>
              </tr>
              </xsl:for-each>
            </tbody>
          </table>
        </body>
      </html>
  </xsl:template>  
</xsl:stylesheet>

Выход

<table xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent">
        <tr>
          <td>This should not be a table</td>
          <td>It must be a text</td>
        </tr>
      </table>

Желаемый результат

<table>
        <tr>
          <td>This should not be a table</td>
          <td>It must be a text</td>
        </tr>
      </table>

person cilerler    schedule 06.02.2015    source источник


Ответы (1)


Итак, как лучше всего получить DataItem как есть?

Лучший способ получить исходный узел как есть — скопировать его. Однако копировать означает копировать, включая пространства имен.

Если вам не нужно пространство имен (т. е. вы не хотите получать исходный узел как есть), вы не можете копировать существующие узлы. Вместо этого вы должны построить новые. Итак, вместо того, чтобы делать:

<xsl:copy-of select="*"/>

do:

<xsl:apply-templates select="*"/>

а потом:

<xsl:template match="*"> 
    <xsl:element name="{local-name()}">
        <xsl:apply-templates/>
    </xsl:element>
</xsl:template>

Обратите внимание, что этот вариант не копирует атрибуты.

person michael.hor257k    schedule 06.02.2015
comment
Спасибо за оперативный и подробный ответ. Когда я говорю как есть, я имею в виду исходный файл (XML), а не обработанный XSL. Исходя из того, что вы сказали, невозможно получить все как есть без пространства имен. Что ж, если следующая лучшая вещь - создать новый, то это нормально, но я ищу решение, чтобы получить именно то, что XML предоставляет между тегами, даже пробел должен оставаться пробелом, а не удаляться и/или добавляться в результат. Как вы думаете, что-нибудь, что может вызвать проблему по этому вопросу? (помимо отсутствующих атрибутов) Спасибо! - person cilerler; 06.02.2015
comment
Боюсь, вы можете неправильно понять одну очень простую вещь: в вашем исходном XML элемент <table> и все его потомки находятся в пространстве имен xmlns="http://schemas.microsoft.com/2004/06/E2ETraceEvent". Так как в исходниках обязательно будет указано пространство имен. - person michael.hor257k; 06.02.2015
comment
Аппс, мне жаль, что ты прав, мне было плохо. На самом деле я только что ответил на чужой вопрос stackoverflow.com/questions/28349678/, но понял, что мой ответ также создаст новую проблему, о которой я упоминал здесь, и мне стало любопытно. Поскольку я не часто имею дело с XSL, я хотел бы завершить путешествие. Поэтому я хотел бы знать ваши мысли о Вы думаете, что-нибудь, что может вызвать проблему по этому вопросу? (кроме отсутствующих атрибутов) Еще раз спасибо. - person cilerler; 06.02.2015
comment
Нашел свой ответ по адресу stackoverflow.com/questions/12465002/ Еще раз спасибо! - person cilerler; 06.02.2015