gpt4 book ai didi

xslt - 如何根据变量调用命名模板?

转载 作者:行者123 更新时间:2023-12-03 21:23:19 26 4
gpt4 key购买 nike

我不知道这是否可能,但我想知道如何做到这一点......

假设我们有以下 XSL:

<xsl:template name="foo">
Bla bla bla
</xsl:template>
...
<xsl:template name="bar">
Bla bla bla
</xsl:template>
...
<xsl:template match="/">
<xsl:if test="$templateName='foo'">
<xsl:call-template name="foo"/>
</xsl:if>
<xsl:if test="$templateName='bar'">
<xsl:call-template name="bar"/>
</xsl:if>
</xsl:template>

是否可以将 XSL 更改为读取类似...
<xsl:template match="/">
<xsl:call-template name="$templateName"/>
</xsl:template>

最佳答案

不可能完全按照您的描述进行,但是如果您希望能够在运行时根据您在其他地方设置的某个值来选择模板,那么有一个技巧可以做到这一点。这个想法是让你的命名模板也以不同的模式匹配一​​个具有相应名称的节点(这样它不会扰乱你的正常转换),然后匹配它。例如:

<xsl:stylesheet ... xmlns:t="urn:templates">

<!-- Any compliant XSLT processor must allow and ignore any elements
not from XSLT namespace that are immediate children of root element -->
<t:templates>
<t:foo/>
<t:bar/>
</t:templates>

<!-- document('') is the executing XSLT stylesheet -->
<xsl:variable name="templates" select="document('')//t:templates" />

<xsl:template name="foo" match="t:foo" mode="call-template">
Bla bla bla
</xsl:template>

<xsl:template name="bar" match="t:foo" mode="call-template">
Bla bla bla
</xsl:template>

<xsl:template match="/">
<xsl:variable name="template-name" select="..." />
<xsl:apply-templates select="$templates/t:*[local-name() = $template-name]"
mode="call-template"/>
</xsl:template>

请注意,您可以使用 <xsl:with-param><xsl:apply-templates> ,所以你可以用它做任何你可以用普通 <xsl:call-template> 做的事情.

此外,上面的代码比您可能需要的要长一些,因为它试图避免使用任何 XSLT 扩展。如果您的处理器支持 exslt:node-set() ,那么你可以直接使用 <xsl:element> 生成节点,并使用 node-set()将生成的树片段转换为要匹配的普通节点,而无需 document('')黑客。

如需更多信息,请参阅 FXSL - 它是基于此概念的 XSLT 函数式编程库。

关于xslt - 如何根据变量调用命名模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1233702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com