Как скопировать все дочерние узлы любого типа элемента контекста шаблона
я преобразую 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.