2016-05-18 43 views
0

鑑於這種XML:的XPath不能得到整個樹匹配的子

<Orders> 
    <Order> 
     <Item name="xyz"/> 
    </Order> 
    <Order> 
     <Item name="123"/> 
    </Order> 
</Orders> 

爲什麼/訂單/訂單[項目[@名稱= '123']回:

<Order> 
    <Item name="123" /> 
</Order> 

但是/訂單[訂單[Item [@ name ='123']]]返回:

<Orders> 
    <Order> 
     <Item name="xyz" /> 
    </Order> 
    <Order> 
     <Item name="123" /> 
    </Order> 
</Orders> 

在第二種情況下,名稱上的匹配被忽略。

做什麼的XPath我需要找回:

<Orders> 
    <Order> 
     <Item name="123" /> 
    </Order> 
</Orders> 
+0

Jim Garrison已經給了你一個很好的解釋,如果你想限制孩子的節點出現,請看[這個問題](http://stackoverflow.com/questions/7115917/xpath-select-node-but - 不是特定的孩子元素) – t0mppa

回答

0

簡短的回答是,由於XML發佈後,您不能使用XPath獲取輸出。

XPath是用於定位XML(尤其是XPath 1.0)的一部分。請注意,開標籤,內容和相應的結束標籤被視爲一個單元,一個元素節點。因此,只包含一個您期望返回的子元素的<Orders>元素不是原始XML的一部分,因此無法使用XPath返回。

XPath是一種處理XML文檔的部分內容的語言,該語言旨在供XSLT和XPointer使用。 [參考:XPath 1.0 Spec]

2

究其原因,第二個例子返回它的作用是因爲你的表達

/Orders[Order[Item[@name='123']]] 

說:

  1. 定位Orders節點
  2. 包含一個Order nmde
  3. Tha T包含一個Item節點
  4. 如果這一Item節點有一個屬性name與價值123

請注意,您關注Orders節點上,所以這就是返回,即整個Orders節點。

你想要的東西在源文檔中不存在,所以你要求轉換發生。我的XPath有點生疏,但我不相信XPath本身能夠做到這一點。您可能需要使用XSLT將XML轉換爲您所需的。