21

我嵌套了 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>

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

4

3 回答 3

26

您可以将整个 /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>
于 2009-01-17T12:44:21.720 回答
8

Welbog已经很好地回答了它 - 但只是要注意你似乎正在做一个 cartesion (cross) join - 这是故意的吗?如果您正在尝试进行常规连接(使用谓词等),那么您想要查看<xsl:key/>- 即声明一个键:

<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 分组

于 2009-01-17T13:00:11.517 回答
0

也可以使用以下内容:

    <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>
于 2015-12-10T07:39:26.713 回答