加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

xml – 带动态QName的XSLT调用模板?

发布时间:2020-12-16 23:50:04 所属栏目:百科 来源:网络整理
导读:我四处寻找找到问题的解决方案,但我还有更多问题…… 考虑以下XML: dynamicStuff dyn id="name1".../dyn dyn id="name2".../dyn dyn id="name3".../dyn dyn id="name4".../dyn /dynamicStuff 并假设我有一个XSLT文件,如下所示: xsl:stylesheet version="1.
我四处寻找找到问题的解决方案,但我还有更多问题……

考虑以下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>

我想要做的是从SECOND 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>

针说这有多么不方便……首先我的代码将被绑定到那个staticName(想象一下我需要在十几个文件中调用这个函数)…其次我会在里面有一堆(un)相关的内容相同的模板,当它可能更加分离…一个噩梦升级系统uu

它做我想要的但不是我需要的方式……

提前感谢您对此事的任何启示!

从 http://www.w3.org/TR/xslt#named-templates起

The value of the name attribute is a
07001,
which is expanded as described in
[07002].

这意味着既不是表达也不是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


注意:由于此技术使用文档(”)来处理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>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读