2010-05-07 90 views
3

我上採用了許多模板與之相匹配的樣式表的工作屬性:如何在XSLT中應用或鏈接多個匹配模板?

<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」。 (和期間)。我想這樣做,不需要知道任何其他模板中的其他模板。因此,例如,我希望能夠添加「util:add-colon」方法,而無需使用現有模板打開引擎蓋和猴子。

我正在玩<xsl:next-match/>指令來完成這一點。將它添加到上面的第一個模板當然會調用util:uppercase和util:add-period,但輸出是每個模板輸出的聚集(即'STRINGstring')。好像應該有一個優雅的方式來鏈接任意數量的模板一起使用像<xsl:next-match/>這樣的東西,但是每個模板的輸出都會提供鏈中下一個模板的輸入。我忽略了一些明顯的東西?

回答

3

鏈接模板可以通過在xsl:variable中捕獲template1的輸出,然後將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>