XSLT如何在标签内转换标签?

时间:2010-03-17 17:55:10

标签: xslt

我有以下XML

<title>
    This is a <highlight>test</highlight> thanks.
</title>

并希望转换为

<span class="title">this is a <span class="highlight">test</span> thanks.</span>

我试试这个xslt,只能在标题标签内找到文字,我怎样才能转换高亮标签?

<span class="title"><xsl:value-of select="title"/></span>

2 个答案:

答案 0 :(得分:4)

<xsl:template match="title">
  <span class="title">
    <xsl:apply-templates />
  </span>
</xsl:template>

<xsl:template match="highlight">
  <span class="highlight">
    <xsl:apply-templates />
  </span>
</xsl:template>

或者,如果您愿意,可将其折叠为单个模板:

<xsl:template match="title|highlight">
  <span class="{name()}">
    <xsl:apply-templates />
  </span>
</xsl:template>

关键点是<xsl:apply-templates /> - 它通过适当的模板运行当前节点的所有子节点。在上部变体中,适当的模板是分开的,在较低的变体中,一个模板是递归调用的。

XSLT中定义了一个复制文本节点的默认规则。所有文本都由<apply-templates>通过此规则运行,因此文本节点会自动显示在输出中。

答案 1 :(得分:2)

如果您想要节点及其所有子节点的完整副本,请使用xsl:copy-of代替xsl:value-of

<span class="title"><xsl:copy-of select="title"/></span>

但是对于您要做的事情,我会为title元素创建一个模板,为highlight元素创建一个模板:

<xsl:template match="title">
     <span class="title"><xsl:value-of select="." /></span>
     <xsl:apply-templates />
</xsl:template>

<xsl:template match="highlight">
     <span class="highlight"><xsl:value-of select="." /></span>
</xsl:template>