2011-09-23 70 views
1

我有一個結構化的XML這種結構:如何中斷不連續元素的每個循環的XSLT?

<root> 
    <item/> 
    <item/> 
    <something/> 
    <item/> 
</root> 

如果我用的是這樣的:

<xsl:for-each select="/root/item"> 

它會拾取所有列表裏面的item元素。我想在第二個item之後中斷循環,因爲在第二個和第三個之間有一個something元素。

我怎樣才能得到這個?

+0

你不看這個http://stackoverflow.com/questions/470045/how-to-break-a-for-each-loop-in-xslt? – Mansuro

回答

0

你實際上不可能分出一個xsl:for-each循環。你需要構建你的循環,以便首先選擇你想要的元素。

在這種情況下,要選擇那些沒有前面的兄弟,是不是也是一個項目元素的所有項目元素。

<xsl:for-each select="/root/item[not(preceding-sibling::*[not(self::item)])]"> 
    <xsl:value-of select="position()" /> 
</xsl:for-each> 

當這樣使用時,它應該只選擇前兩個元件。

0

在XSLT沒有一個「突破」出來的<xsl:for-each>或出<xsl:apply-templates>任何可能性,但是使用了<xsl:message terminate="yes"/>你可能不希望。這是由於XSLT是一種功能語言,而且在任何功能語言中都沒有任何「執行順序」的概念 - 例如,代碼可以在選定的所有節點上並行執行) 。

解決的辦法是在select屬性中指定一個表達式,選擇,正好是需要的節點。

使用

<xsl:for-each select="/*/*[not(self::item)][1]/preceding-sibling::*"> 
<!-- Processing here --> 
</xsl:for-each> 

這將選擇用於處理所有前面元素頂部元件的第一個子元素的兄弟姐妹不是item - 這意味着相鄰item元素是的起始組頂級元素的第一個孩子。