Как скопировать все дочерние узлы любого типа элемента контекста шаблона

я преобразую 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 ответов


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

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

это скопирует все descendent.


попробуйте использовать <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>

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

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