2013-02-05 80 views
-1

我有一個包含多行數據的XML。簽入for-each循環xsl 1.0

<abc> 
<def>some text1</def> 
<xyz>stack overflow</xyz> 
</abc> 
<abc> 
<def>some text2</def> 
<xyz>stack overflow 2)</xyz> 
</abc> 
<abc> 
<def>some text</def> 
<xyz>stack overflow 3)</xyz> 
</abc> 

現在我想寫這個代碼XSL 1.0在那裏將開始無論是在元素值/文本「2)」只存在或不檢查每一行即。 在循環過程中,如果第一次遇到文本「2」,它應該打印「XSL_1.0編程」值並退出循環。

+1

[你有什麼嘗試?](http://whathaveyoutried.com) –

+0

我試圖使用位置和布爾函數,但沒有取得任何成果,因爲我們可以檢查直到值「2)」來臨或沒有爲 。但是,只要達到目標,我就無法打破循環。我沒有得到打破循環的想法。 – Kundan

+0

你會如此友善地向我們展示你試過的東西嗎? – JLRishe

回答

2

您正在以錯誤的方式處理這個問題 - XSLT不是一種過程式語言,無法「退出循環」。相反,您需要考慮如何以更具說明性的方式來識別您感興趣的節點。例如,XPath表達式

abc[contains(., '2)')] 

標識包含所述字符串的所有abc元件「2)」在它們的後代文本節點的任何地方,所以

(abc[contains(., '2)')])[1] 

將只提取第一個這樣的元素,或空如果沒有匹配的元素,則設置節點集。如果你想處理abc元素直至幷包括含「2)」,但沒有任何以下的人,你可以使用類似

<xsl:for-each select="abc[not(preceding-sibling::abc[contains(., '2)')])]"> 
+0

我必須在xsl:when條件中添加此語句,其中此語法不可接受。 – Kundan

+0

@Kundan請編輯問題並向我們展示您到目前爲止所使用的XSLT代碼。就像我說的,XSLT沒有「突破循環」的概念,您必須確定在啓動for-each或apply-templates之前要處理的節點。 –

+0

XSL_1.0編程 元件> 此循環WIL工作。 但我希望當它得到2)第一次時,它應該打印文本值,並沒有進一步執行。 – Kundan

0

這個怎麼樣第一個:

<xsl:if test="abc[contains(xyz, '2)')]"> 
    <xsl:text>XSL_1.0 Programming</xsl:text> 
</xsl:if> 
+0

再次,同樣的事情如下。這種解決方案可以多次使用,但我需要的是當它第一次獲得價值時,那麼只有打印和循環應該被打破。每當它遇到值2),那麼文本應該只打印一次而不是多次打印。 – Kundan

+0

這正是它會做的:只打印一次該值。我建議你使用這個'for-each'循環,而不是它。如果這不符合您的要求,請**向我們展示您的XSLT **,因爲我要求您在35分鐘前完成。 – JLRishe

1

由於Ian Roberts解釋說,在XSLT中沒有突破循環的概念。你必須事先決定你想要處理什麼節點,聽起來你只是在第一個abc元素中有趣的元素,其中包含'2''。

它可能實際上最好使用xsl:apply-templates這裏。

<xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" /> 

因此,這將選擇所有沒有前面'2)'元素的元素。

接下來,您可以添加模板匹配ABC元素取決於XYZ元素的內容。例如,輸出「XSL_1.0編程」,如果它有一個「2)」中執行以下操作

<xsl:template match="abc[contains(xyz, '2)')]"> 
    <xsl:text>XSL_1.0 Programming</xsl:text> 
</xsl:template> 

以下是完整的XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="text"/> 

    <xsl:template match="/*"> 
     <xsl:apply-templates select="abc[not(preceding-sibling::abc[contains(xyz, '2)')])]" /> 
    </xsl:template> 

    <xsl:template match="abc"> 
     <xsl:value-of select="concat(xyz, '&#10;')" /> 
    </xsl:template> 

    <xsl:template match="abc[contains(xyz, '2)')]"> 
     <xsl:text>XSL_1.0 Programming&#10;</xsl:text> 
    </xsl:template> 
</xsl:stylesheet> 

當應用於以下XML(注它有一個根元素)

<root> 
<abc> 
<def>some text1</def> 
<xyz>stack overflow</xyz> 
</abc> 
<abc> 
<def>some text2</def> 
<xyz>stack overflow 2)</xyz> 
</abc> 
<abc> 
<def>some text3</def> 
<xyz>stack overflow</xyz> 
</abc> 
<abc> 
<def>some text</def> 
<xyz>stack overflow 3)</xyz> 
</abc> 
</root> 

以下是輸出

stack overflow 
XSL_1.0 Programming