1

我正在开发一些实用程序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>是不允许的操作。

这甚至可能吗?谷歌搜索时找不到太多关于此的信息。

4

3 回答 3

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/Novatatchev01/EML2006Novaatchev01.html

对于这里的 XSLT 1.0:http: //conferences.idealliance.org/extreme/html/2003/Novaatchev01/EML2003Novaatchev01.html

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

<xsl:apply-templates select="$pFun">
 <!-- Any necessary <xsl:with-param> here -->
</xsl:apply-templates>
于 2012-12-20T14:30:57.103 回答
3

根据 XSLT 规范, 的name属性<xsl:call-template>必须是文字 qname,不能是变量引用等表达式。

于 2012-12-20T11:34:24.143 回答
1

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

于 2012-12-20T14:27:14.517 回答