用户xsl:call-template,其值为xsl:param

时间:2012-12-20 11:21:47

标签: xslt xslt-1.0

我正在开发一些实用程序xslt模板,我想制作一个模板,您可以根据参数调用另一个模板。

我想要实现的目标:

<xsl:template name="OuterTemplate.AlternatingRow">
    <xsl:param name="Position" />
    <xsl:param name="CallTemplate" />
    <xsl:if test="$Position mod 2 = 0">
        <xsl:if test="$CallTemplate != ''">
            <xsl:call-template name="$CallTemplate"></xsl:call-template>
        </xsl:if>
    </xsl:if>
</xsl:template>

但我一直收到错误,因为<xsl:call-template name="$CallTemplate"></xsl:call-template>不是允许的操作。

这甚至可能吗?用谷歌搜索时找不到这个。

3 个答案:

答案 0 :(得分:3)

根据XSLT规范,name的{​​{1}}属性必须是文字qname,它不能是变量引用等表达式。

答案 1 :(得分:3)

虽然Ian Roberts接受的答案是正确的,但在XSLT 1.0和XSLT 2.0中可以模拟将“函数”(模板)作为参数传递给另一个函数

这已在FXSL库中完成,用于使用XSLT(1.0和2.0)进行函数式编程。

您可以在此处详细了解FXSL的基本主要思想(适用于XSLT 2.0): http://conferences.idealliance.org/extreme/html/2006/Novatchev01/EML2006Novatchev01.html

对于XSLT 1.0: http://conferences.idealliance.org/extreme/html/2003/Novatchev01/EML2003Novatchev01.html

我们的想法是,不是模板名称,而是作为参数传递一个节点(比如$pFun),该节点由实现所需功能的模板唯一匹配。然后在被调用的模板中调用“传递给参数”模板:

<xsl:apply-templates select="$pFun">
 <!-- Any necessary <xsl:with-param> here -->
</xsl:apply-templates>

答案 2 :(得分:1)

XSLT的动态发送机制是xsl:apply-templates,您可以在Dimitre Novatchev的FXSL库中找到基于此功能的巧妙方法。