【问题标题】:How to call template for each dictionary elements?如何为每个字典元素调用模板?
【发布时间】:2017-07-12 10:28:19
【问题描述】:

这是我的 xml:

<A>
  <D>dd</D>
  <E>ee</E>
  <B>
    <C>1</C>
    <C>2</C>
  </B>
</A>

这是我的 xsl。对于相同的参数,我只需要调用几次 template1 和 template2:

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

     <xsl:template match="/A">
        <xsl:call-template name="items1">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>
         <xsl:call-template name="items2">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>
         ...
     </xsl:template>

     <xsl:template name="template1 ">
       <xsl:param name="key"/>
       <xsl:param name="value"/>
       <xsl:value-of select="/D"/>
       <xsl:value-of select="$key"/>
       <xsl:value-of select="$value"/>
       ...
     </xsl:template>

    <xsl:template name="template2">
     <xsl:param name="key"/>
     <xsl:param name="value"/>
     <xsl:value-of select="/E"/>
     <xsl:value-of select="$key"/>
     <xsl:value-of select="$value"/>
     ...
    </xsl:template>

</xsl:stylesheet>

现在,我必须为 template1 调用我的模板大约 350 次,为 template2 调用 350 次,我有很多键值对。

我想用键值对制作一个字典并在模板1和模板2上迭代它

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

       <xsl:variable name="values">
            <item key="A" value="aa"/>
            <item key="B" value="bb"/>
            ...
        </xsl:variable>

     <xsl:template match="/A">

         <xsl:for-each select="$values">
           <xsl:call-template name="items1">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>    
         </xsl:for-each>

         <xsl:for-each select="$values">
           <xsl:call-template name="items2">
           <xsl:with-param name="key">aa</xsl:with-param>
           <xsl:with-param name="value">bb</xsl:with-param>
        </xsl:call-template>     
         </xsl:for-each>
         ...
     </xsl:template>

    <xsl:template name="template1 ">
       <xsl:param name="key"/>
       <xsl:param name="value"/>
       <xsl:value-of select="/D"/>
       <xsl:value-of select="$key"/>
       <xsl:value-of select="$value"/>
       ...
     </xsl:template>

    <xsl:template name="template2">
     <xsl:param name="key"/>
     <xsl:param name="value"/>
     <xsl:value-of select="/E"/>
     <xsl:value-of select="$key"/>
     <xsl:value-of select="$value"/>
     ...
    </xsl:template>

</xsl:stylesheet>

我的问题是解决我的问题是个好主意。如何在模板中获取根节点,现在当前节点是“项目”。我想在我的模板中获得价值 od D 节点。

【问题讨论】:

  • It display @key and @value at foreach but doesn't call to template. 不清楚。请发布minimal reproducible example,以便我们重现问题。
  • @michael.hor257k 还有一个问题,如何将模板中的当前节点更改为根节点?
  • 我不知道你在问什么。我建议您提供我们可以用来重现您的问题的代码。你给我们的只是断章取义的无用的sn-ps。
  • @michael.hor257k 现在你明白我的意思了吗?
  • 大部分时间我还在猜测。你看到我的答案的补充了吗?

标签: xslt


【解决方案1】:

如果没有看到完整的图片,很难回答您的问题。没有它我只能猜你想做什么:

<xsl:for-each select="$prodDict/item">
    <xsl:call-template name="Item">
        <xsl:with-param name="param1" select="@key"/>
        <xsl:with-param name="param" select="@value"/>
    </xsl:call-template>
</xsl:for-each>

请注意,这需要 XSLT 2.0 或更高版本。


补充:

如何在模板中获取根节点,现在当前节点为“item”。

一个方便的方法是将根节点放在一个全局变量中,这样就可以从任何地方访问它。这是一个简化的示例:

XML

<A>
  <D>dd</D>
  <E>ee</E>
  <B>
    <C>1</C>
    <C>2</C>
  </B>
</A>

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:variable name="values">
    <item key="A" value="aa"/>
    <item key="B" value="bb"/>
</xsl:variable>

<xsl:variable name="xml" select="/" />

<xsl:template match="/">
    <result>
        <xsl:for-each select="$values/item">
            <xsl:call-template name="template1">
                <xsl:with-param name="param1" select="@key"/>
                <xsl:with-param name="param2" select="@value"/>
            </xsl:call-template>
        </xsl:for-each>
    </result>
</xsl:template>

<xsl:template name="template1 ">
    <xsl:param name="param1"/>
    <xsl:param name="param2"/>
    <item>
        <d>
            <xsl:value-of select="$xml/A/D"/>
        </d>
        <key>
            <xsl:value-of select="$param1"/>
        </key>
        <value>
            <xsl:value-of select="$param2"/>
        </value>
    </item> 
</xsl:template>

</xsl:stylesheet>

结果

<?xml version="1.0" encoding="UTF-8"?>
<result>
   <item>
      <d>dd</d>
      <key>A</key>
      <value>aa</value>
   </item>
   <item>
      <d>dd</d>
      <key>B</key>
      <value>bb</value>
   </item>
</result>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-09
    • 2014-09-10
    • 2014-05-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    相关资源
    最近更新 更多