如何在XSLT中应用或链接多个匹配的模板?

时间:2010-05-07 20:11:40

标签: xml xslt xslt-2.0

我正在使用一个样式表,该样式表使用了许多具有匹配属性的模板:

<xsl:template match="//one" priority="0.7">
   <xsl:param name="input" select="."/>
   <xsl:value-of select="util:uppercase($input)"/>
   <xsl:next-match />
</xsl:template>

<xsl:template match="/stuff/one">
    <xsl:param name="input" select="."/>
    <xsl:value-of select="util:add-period($input)"/>
</xsl:template>

<xsl:function name="util:uppercase">
    <xsl:param name="input"/>
    <xsl:value-of select="upper-case($input)"/>
</xsl:function>

<xsl:function name="util:add-period">
    <xsl:param name="input"/>
    <xsl:value-of select="concat($input,'.')"/>
</xsl:function>

我想要做的是能够“链接”上面的两个函数,以便输出'string'将在输出中呈现为'STRING'。 (使用句号。)我想以这样的方式执行此操作,即不需要知道任何其他模板中的其他模板。因此,举例来说,我希望能够添加“util:add-colon”方法,而无需使用现有模板打开引擎盖和猴子。

我正在玩<xsl:next-match/>指令来完成此任务。将它添加到上面的第一个模板当然会调用util:uppercase和util:add-period,但输出是每个模板输出的聚合(即'STRINGstring。')似乎应该有一种优雅的方式来链接使用类似<xsl:next-match/>之类的任意数量的模板,但每个模板的输出都会提供链中下一个模板的输入。我忽略了一些明显的东西吗?

1 个答案:

答案 0 :(得分:3)

模板链接可以通过在template1中捕获xsl:variable的输出,然后将template2应用于此xsl:变量的内容来完成。

但是,我建议使用功能组合

util:add-period(util:uppercase(.))

此外,如果稍微更改util:add-period(),您可以达到预期的效果:

使用

<xsl:function name="util:add-period" as="xs:string">  
    <xsl:text>.</xsl:text>  
</xsl:function>