2009-01-17 130 views
20

我有嵌套的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> 

这并不规模非常好,因为有时候我需要访问的一些信息,并最终创造了每一件一个变量。有更容易的方法吗?

回答

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> 
+0

+1,但它可能是值得编辑的变量名,以使其功能更加清晰。 – AnthonyWJones 2009-01-17 12:50:20

+0

完成。感谢您的意见。 – Welbog 2009-01-17 12:53:17

8

Welbog已经回答得很好 - 但只是要注意你似乎做一个笛卡尔(跨)加入 - 是故意的吗?如果你正在尝试做一个常规连接(与谓语等),那么你要要考虑<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 grouping

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>