我有一个像这样的xml:
<span reference="1">Reference Text 1</span>
<term reference="2">Reference Text 2</term>
我需要它变成这样:
<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a>
<i>Reference Text 2</i> <a href="2">[2]</a>
所以,基本上,如果元素reference
属性是一个跨度,我们只需将其保留原样,添加class="referenceText"
。但是,如果它是任何其他元素,那么我们还应该应用为此元素创建的模板。这就是为什么<term>
应该成为<i>
- 我有一个模板:
<xsl:template match="term">
<i><xsl:apply-templates select="@* |node()"/></i>
</xsl:template>
对于所有元素的变换reference
属性我有这个模板:
<xsl:template match="*[@reference]">
<xsl:param name="href" select="./@reference"/>
<xsl:choose>
<xsl:when test="name() = 'span'">
<span class="referenceText">
<xsl:value-of select="."/>
</span>
</xsl:when>
<xsl:otherwise>
<xsl:element name="{name()}">
<xsl:value-of select="."/>
</xsl:element>
</xsl:otherwise>
</xsl:choose>
<xsl:text> </xsl:text><a href="#{$href}">[<xsl:value-of select="./@href"/>]</a>
</xsl:template>
不幸的是,这会产生以下输出:
<span class="referenceText">Reference Text 1</span> <a href="1">[1]</a>
<term>Reference Text 2</term> <a href="2">[2]</a>
So, <term>
没有转换成<i>
。看起来我需要某种递归来将模板重新应用到生成的内容,但我想不出任何东西。
如果您使用的是 XSLT 1.0,则可以捕获变量中的输出,然后使用exslt:节点集 http://www.exslt.org/exsl/functions/node-set/将模板应用于变量的函数。不过,请尽量避免无限递归:)
<xsl:variable name="foo">
...
</xsl:variable>
<xsl:apply-templates select="exslt:node-set($foo)"/>
(EDIT:纳入与此答案相关的其他评论)
为了使用 EXSLT 扩展,第一步是声明其名称空间。 EXSLT 项目网站建议您在<xsl:stylesheet>
node:
使用 EXSLT 中描述的扩展的第一步是为 EXSLT 模块定义相关的命名空间。您应该在样式表中的 xsl:stylesheet 元素上声明命名空间。
<xsl:stylesheet xmlns:exslt="http://exslt.org/common">
//...
</xsl:stylesheet>
除此之外extension-element-prefixes
属性可用于防止扩展名称空间添加到结果文档中:
<xsl:stylesheet xmlns:exslt="http://exslt.org/common" extension-element-prefixes="exslt">
//...
</xsl:stylesheet>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)