Как скопировать все дочерние узлы любого типа элемента шаблона контекста - PullRequest
13 голосов
/ 01 июня 2011

Я преобразую XML в HTML с помощью XSLT.

У меня есть следующая структура XML:

<root>
    <element>
        <subelement>
            This is some html text which should be <span class="highlight">displayed highlighted</span>.
         </subelement>
    </element>
</root>

Я использую следующий шаблон для преобразования:

<xsl:template name="subelement">
  <xsl:value-of select="." />
</xsl:template>

К сожалению, я теряю <span> -тэги.

Есть ли способ сохранить их, чтобы HTML-код отображался правильно (выделен)?

Ответы [ 3 ]

32 голосов
/ 01 июня 2011

Правильный способ получить все содержимое текущего совпадающего узла (включая текстовые узлы):

    <xsl:template match="subelement">
       <xsl:copy-of select="node()"/>
    </xsl:template>

Это скопирует все потомство.

6 голосов
/ 01 июня 2011

Попробуйте использовать <xsl:copy-of... вместо <xsl:value-of..., например:

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

Обратите внимание на *, который остановит вывод <subelement></subelement> битов на результаты, вместо использования ., который будет включать <subelement></subelement> бит.

Например, таблица стилей xsl:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:template match="root/element">
        <output>
            <xsl:apply-templates select="subelement"/>
        </output>
    </xsl:template>

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

</xsl:stylesheet>

при применении к вашему примеру XML-файла возвращает:

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <span class="highlight">displayed highlighted</span>
</output>
0 голосов
/ 01 июня 2011

Объявление <xsl:value-of> принимает объединенное содержимое всех текстовых узлов в элементе в последовательном порядке и не выводит никаких элементов вообще.

Я бы рекомендовал вместо этого использовать <xsl:apply-templates>.Там, где он находит текстовый узел, он выводит содержимое как есть, но вам нужно будет определить шаблон для обработки тегов span, чтобы преобразовать их в HTML-теги.Если этот тег span является html-тегом, то, строго говоря, у вас должны быть отдельные пространства имен для вашей собственной структуры документа и html.

...