2009-01-17 173 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>