【问题标题】:How do I access elements from the outer loop from within nested loops?如何从嵌套循环中访问外部循环中的元素?
【发布时间】:2009-01-17 12:41:43
【问题描述】:

我已经嵌套了 xsl:for 循环:

<xsl:for-each select="/Root/A">
    <xsl:for-each select="/Root/B">
        <!-- Code -->
    </xsl:for>
</xsl:for>

如何从内部循环中访问外部循环中当前节点的属性?

我不断发现自己在编写这样的代码:

<xsl:for-each select="/Root/A">
    <xsl:variable name="someattribute" select="@SomeAttribute"/>
    <xsl:for-each select="/Root/B">
        <!-- Now can use $someattribute to access data from 'A' -->
    </xsl:for>
</xsl:for>

这不能很好地扩展,因为有时我需要访问多条信息并最终为每条信息创建一个变量。有没有更简单的方法?

【问题讨论】:

    标签: xslt scope for-loop


    【解决方案1】:

    您可以将整个 /Root/A 结构存储在一个变量中,并引用该变量,而不是为您需要访问的每个属性和子元素创建一个新变量。

    <xsl:for-each select="/Root/A/">
        <xsl:variable name="ROOT_A" select="."/>
        <xsl:for-each select="/Root/B/">
             <!-- Variable is accessed like this: $ROOT_A/@someAttribute
                  Just like a normal XML node -->
        </xsl:for-each>
    </xsl:for-each>
    

    【讨论】:

    • +1,但可能值得编辑变量名称以使其功能更清晰。
    • 这就是我通常会做的事情;-p
    【解决方案2】:

    Welbog 已经很好地回答了这个问题 - 但只是要注意你似乎在进行笛卡尔(交叉)连接 - 这是故意的吗?如果您尝试进行常规连接(使用谓词等),那么您想查看&lt;xsl:key/&gt; - 即声明一个键:

    <xsl:key name="BIndex" match="/Root/B" use="SomeChildNode"/>
    

    然后在你的谓词中消费:

    <xsl:for-each select="/Root/A/">
        <xsl:variable name="ROOT_A" select="."/>
        <xsl:for-each select="key('BIndex', LocalNode)">
         <!-- -->
        </xsl:for-each>
    </xsl:for-each>
    

    这应该等同于(但比)谓词:

        <xsl:for-each select="/Root/B[SomeChildNode = current()/LocalNode]">
    

    如果您对数据进行分组,请查看Muenchian grouping

    【讨论】:

    • 感谢您的提示。我对 XSLT 还比较陌生,还不完全确定自己在做什么。一旦我得到工作,我会看看你的建议,看看是否有更简单的方法。
    • 注意:我花了一些功夫来破译上面的“笛卡尔连接与谓词连接部分”。因此,只需为刚接触它的人记下不同之处。基本上,如果 A 中有“m”个节点,B 中有“n”个节点,笛卡尔连接将产生 m*n 个节点,而谓词连接连接特定键,即加入 A 和 B,其中 A.key = B.key.
    • 要检查当前的元素名称(for循环遍历的元素),您可以使用name(current()) - 不要尝试current()/name(),这是不允许的。
    【解决方案3】:

    以下也可以使用:

        <xsl:for-each select="ns:attribute">
            <name><xsl:value-of select="ns:name" /></name>              
            <xsl:for-each select="ns:value">
            <value><xsl:value-of select="."/></value>       
            </xsl:for-each>
        </xsl:for-each>      
    

    用于解析 XML 文档..

     <ns:attribute>
          <ns:name>name</ns:name>
          <!--1 or more repetitions:-->
          <ns:value>Rahul</ns:value>
          <ns:value>Sushovan</ns:value>
    </ns:attribute>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2021-03-06
      • 2012-11-21
      • 2020-04-12
      • 2020-09-15
      • 2012-04-21
      相关资源
      最近更新 更多