如何复制任何类型的模板上下文元素的所有子节点

时间:2011-06-01 09:55:53

标签: xslt xslt-1.0

我正在使用XSLT将XML转换为HTML。

我有以下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 个答案:

答案 0 :(得分:31)

获取当前匹配节点(包括文本节点)的所有内容的正确方法是:

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

这将复制所有后代。

答案 1 :(得分:5)

尝试使用<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>

当应用于您的示例x​​ml文件时返回:

<?xml version="1.0" encoding="UTF-8"?>
<output>
    <span class="highlight">displayed highlighted</span>
</output>

答案 2 :(得分:0)

<xsl:value-of>声明按顺序获取元素中所有文本节点的连接内容,并且根本不输出任何元素。

我建议改用<xsl:apply-templates>。在找到文本节点的地方,它将按原样输出内容,但您需要定义一个模板来处理span标记以将其转换为html标记。如果该span标记是一个html标记,那么严格来说,你应该为你自己的文档结构和html分别设置名称空间。