我正在开发一些实用程序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>
不是允许的操作。
这甚至可能吗?用谷歌搜索时找不到这个。
答案 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库中找到基于此功能的巧妙方法。