我四处寻找找到问题的解决方案,但我还有更多问题......
考虑以下XML:
<dynamicStuff>
<dyn id="name1">...</dyn>
<dyn id="name2">...</dyn>
<dyn id="name3">...</dyn>
<dyn id="name4">...</dyn>
</dynamicStuff>
Run Code Online (Sandbox Code Playgroud)
并假设我有一个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>
Run Code Online (Sandbox Code Playgroud)
我想要做的是从SECOND XSLT文件动态确定要调用哪个模板,如下所示:
<xsl:variable name="templateName">
<xsl:value-of select="dyn/@id"/>
</xsl:variable>
<xsl:call-template name="$templateName"/>
Run Code Online (Sandbox Code Playgroud)
可悲的是它不起作用,相信我,当我说我尝试了很多不同的东西,虽然它听起来很简单,它也不起作用......
我错过了什么吗?
编辑:
我已成功完成以下操作:
<xsl:template name="staticName">
<xsl:param name="id" />
<xsl:if test="$id = 'name1'">....</xsl:if>
<xsl:if test="$id = 'name2'">....</xsl:if>
...
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
以这种方式打电话:
<xsl:call-template name="staticName">
<xsl:with-param name="id" select="@id"/>
</xsl:call-template>
Run Code Online (Sandbox Code Playgroud)
针说这有多么不方便......首先我的代码将被绑定到那个staticName(想象一下我需要在十几个文件中调用这个函数)...其次我会在里面有一堆(un)相关的内容相同的模板,当它可能更加分离...一个噩梦升级系统uu
它做我想要的但不是我需要的方式......
提前感谢您对此事的任何启示!
小智 6
来自http://www.w3.org/TR/xslt#named-templates
这意味着既不是表达也不是AVT.
xsl:call-template无论是通过逻辑指令还是模式匹配,显式指令都很好:
<xsl:template match="dyn[@id='name1']" mode="dynamic">
<xsl:call-template name="name1"/>
</xsl:template>
Run Code Online (Sandbox Code Playgroud)
另一种方法是命名模板引用...
<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>
Run Code Online (Sandbox Code Playgroud)
输出:
one two three four
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
如果需要,$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>
Run Code Online (Sandbox Code Playgroud)
如果需要,$current可以使用以下命令重新建立当前节点for-each:
<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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8108 次 |
| 最近记录: |