2011-04-12 87 views
4

我有幾個節點具有相同的Name ='UPC',我需要找到當前節點的值。xpath找到當前節點的值

<XML> 
<Attribute> 
     <Name>UPC</Name> 
     <Type>ComplexAttr</Type> 
     <Value>Testing</Value> 
    </Attribute> 
    <Attribute> 
     <Name>UPC</Name> 
     <Type>ComplexAttr</Type> 
     <Value>24a</Value> 
    </Attribute> 
</XML> 

預期輸出: 應該從拉/屬性/值,其中名稱= 'UPC' 和類型= 'ComplexAttr' 的值。

在第一次運行=「測試」 & 在第二次運行值應爲=「24A」

我嘗試使用下面的代碼,但它無法正常工作。該值爲空。

<xsl:attribute name ="value"> 
    <xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][$i]/Value" /> 
</xsl:attribute> 

其中$ I是我通過上面的XML使用循環的變量,它每次運行後遞增。但是,它在每次運行中只給出相同的值'測試'(這是第一個值)。我檢查了變量的值。它每次循環時都在變化。

我也嘗試過使用current()和position(),但是在這種情況下我得到了null。

<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][current()]/Value" /> 

<xsl:value-of select =".//Attribute[Type='ComplexAttr' and Name = 'UPC'][position() = $i]/Value" /> 

有人可以幫我解決這個問題。提前致謝。

+0

此XML樣本的預期輸出是什麼? – 2011-04-12 23:17:32

+0

@Alejandro。我已經添加了上面的預期輸出。謝謝 – JohnXsl 2011-04-13 00:35:24

+0

好問題,+1。請參閱我的答案以獲得解釋和快速的單線XPath表達式解決方案。 – 2011-04-13 03:18:01

回答

4

這是最大的FAQ之一:

[]運算符與比//縮寫更強。

爲了選擇XML文檔中的第一元件,滿足在謂詞中的特定條件,可以使用

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[1]/Value 

爲了選擇XML文檔中的第二元件,該滿足所述謂詞的特定條件下,使用

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[2]/Value 

爲了選擇$i個ELE在XML文檔中滿足謂詞中的特定條件,請使用

(//Attribute[Type='ComplexAttr' and Name = 'UPC'])[position() = $i]/Value 
+0

感謝您的幫助。它像一個魅力...... :-)。我會接受你的答案和+1的解釋。這對於像我這樣的XSLT中的新手來說非常重要... :-) – JohnXsl 2011-04-13 03:49:02

+0

@JohnXsl:不客氣:) – 2011-04-13 03:51:14

2

您不能在XPath表達式中使用變量。嘗試使用恆定的人工,你會看到,它的工作原理:

<xsl:value-of select=".//Attribute[Type='ComplexAttr' and Name='UPC'][2]/Value" /> 

一般情況下,你真的不寫循環的XSLT,即使語法允許它。您可以編寫在特定時間點使用特定上下文調用的模板。如果不瞭解整體計劃的背景,我不確定下一步的最佳步驟。

+0

感謝您的回覆。你是對的。由於常數給出了輸出,因此技術上的變化應該是相同的。這就是我試圖使用變量的原因。我是XSLT的新手,由於時間緊迫,現在我無法在XSLT上花太多時間來解決問題。我試圖遞歸執行它,但它不工作。於是我轉向迭代。如果你喜歡,你可以在這裏查看我之前的帖子http://stackoverflow.com/questions/5638460/xslt-grouping-recursive-problem-part-2。如果您對如何解決我的問題有任何意見或建議,請告訴我。謝謝 – JohnXsl 2011-04-13 01:22:09