gpt4 book ai didi

xml - 具有动态 QName 的 XSLT 调用模板?

转载 作者:数据小太阳 更新时间:2023-10-29 01:50:03 26 4
gpt4 key购买 nike

我四处搜索以找到解决我的问题的方法,但我有更多问题...

考虑以下 XML:

<dynamicStuff>
<dyn id="name1">...</dyn>
<dyn id="name2">...</dyn>
<dyn id="name3">...</dyn>
<dyn id="name4">...</dyn>
</dynamicStuff>

假设我有一个如下所示的 XSLT 文件:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template name="name1">
...
</xsl:template>

<xsl:template name="name2">
...
</xsl:template>

<xsl:template name="name3">
...
</xsl:template>

<xsl:template name="name4">
...
</xsl:template>

</xsl:stylesheet>

我想做的是从第二个 XSLT 文件动态地确定要调用哪个模板,如下所示:

<xsl:variable name="templateName">
<xsl:value-of select="dyn/@id"/>
</xsl:variable>

<xsl:call-template name="$templateName"/>

遗憾的是它不起作用,相信我,当我说我尝试了很多不同的东西时,虽然它听起来很简单但也不起作用......

我错过了什么吗?

编辑:

我已成功完成以下操作:

<xsl:template name="staticName">
<xsl:param name="id" />

<xsl:if test="$id = 'name1'">....</xsl:if>
<xsl:if test="$id = 'name2'">....</xsl:if>
...
</xsl:template>

这样调用:

<xsl:call-template name="staticName">
<xsl:with-param name="id" select="@id"/>
</xsl:call-template>

不用说这有多不方便......首先我的代码将绑定(bind)到那个 staticName(想象一下我需要在十几个文件中进行这个调用)......其次我会有一堆(un)相关内容在同一个模板中,当它可以更加分离时......升级系统的噩梦 u.u

它做我想做的事,但不是我需要的方式......

提前感谢您对此事的任何了解!

最佳答案

来自 http://www.w3.org/TR/xslt#named-templates

The value of the name attribute is a QName, which is expanded as described in [2.4 Qualified Names].

这意味着既不是表达式也不是 AVT。

无论是逻辑指令还是模式匹配,显式的xsl:call-template 指令都很好:

<xsl:template match="dyn[@id='name1']" mode="dynamic">
<xsl:call-template name="name1"/>
</xsl:template>

另一种方法是命名模板引用...

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="vTemplate" select="document('')/*/xsl:template"/>
<xsl:template match="dyn">
<xsl:apply-templates select="$vTemplate[@name = current()/@id]"/>
</xsl:template>
<xsl:template match="xsl:template[@name='name1']"
name="name1"> one </xsl:template>
<xsl:template match="xsl:template[@name='name2']"
name="name2"> two </xsl:template>
<xsl:template match="xsl:template[@name='name3']"
name="name3"> three </xsl:template>
<xsl:template match="xsl:template[@name='name4']"
name="name4"> four </xsl:template>
</xsl:stylesheet>

输出:

 one  two  three  four 


注意:因为此技术使用 document('') 来处理XSLT 而不是原始的XML 文件,所以正在处理的原始文档在命名模板中不可用。但是,如果需要,您可以显式地将 current() 作为参数传递给模板:

    <xsl:template match="dyn">
<xsl:apply-templates select="$vTemplate[@name = current()/@id]">
<xsl:with-param name="current" select="current()"/>
</xsl:apply-templates>
</xsl:template>

如果需要,$current 可用于访问原始文档:

    <xsl:template match="xsl:template[@name='name1']" name="name1">
<xsl:param name="current"/>
<xsl:value-of select="$current/@id"/>
<xsl:text> becomes one</xsl:text>
</xsl:template>

如果需要,可以使用for-each$current 重新建立为当前节点:

<xsl:template match="xsl:template[@name='name2']" name="name2">
<xsl:param name="current"/>
<xsl:for-each select="$current">
<xsl:value-of select="@id"/>
<xsl:text> becomes two</xsl:text>
</xsl:for-each>
</xsl:template>

关于xml - 具有动态 QName 的 XSLT 调用模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5656129/

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