我正在使用一个样式表,该样式表使用了许多具有匹配属性的模板:
<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/>
之类的任意数量的模板,但每个模板的输出都会提供链中下一个模板的输入。我忽略了一些明显的东西吗?
答案 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>