2010-07-09 70 views
1

我有下面的XML:Xpath的路徑幫助

<products> 
    <product>  
     <name>Flat Panel Monitor</name> 
     <code>LS123</code> 
     <attributes> 
      <attribute> 
       <group>Color</group> 
       <values> 
        <value>Red</value> 
        <value>Blue</value> 
        <value>Green</value> 
       </values> 
      </attribute> 
      <attribute> 
       <group>Warranty</group> 
       <values> 
        <value>5 Year</value> 
       </values> 
      </attribute> 
     </attributes> 
    </product> 
</products> 

什麼Xpath的,我會用它來獲取所有值的與「顏色」的組節點值的屬性節點? /product/attributes/attribute/values/value的標準Xpath將返回保修組內的所有值,包括值,但我需要將它們分開。

我猜在僞代碼我所說的是獲得所有「價值」,其中父節點「價值」是節點「組」的值與「顏色」的兄弟姐妹 - 希望這是可能的?

謝謝。

+0

我愛的事實,這個問題已經主義及其的三個截然不同不同的工作答案。 – 2010-07-09 11:16:21

回答

4

您需要使用方括號來過濾節點,即: /product/attributes/attribute[group='Color']/values/value

+2

「方括號」保羅的意思是**謂詞**。 – 2010-07-09 10:57:46

+1

謝謝喬希,這是一個相當有價值的答案。我應該包括這個術語,以便他能夠查看它。 – 2010-07-09 11:18:05

3

你只要求有Color一個group「叔叔」的value節點,所以就把這作爲對你有XPath的條件已經摸索出:

/product/attributes/attribute/values/value[../../group = 'Color'] 

這是說,對於一個value節點是有效的,它必須有一個家長帶同價值Color孩子父母。

+0

由Paul Butcher提出,在其共同的祖先''上應用一個謂詞更爲正確。它也更具性能,因爲引擎不需要深入樹中,然後返回到祖先。 – 2010-07-09 11:00:05

+0

@Josh,是的,這是一個更好的答案。 – AakashM 2010-07-09 11:04:08

0
//values[preceding-sibling::group[text()="Color"]]/value 
1

還有另一個選擇:

//value[ancestor::attribute[group='Color']]