一本書我讀XML的說,選擇在一個XML文件中具有特定屬性的所有節點,使用語法:XPath表達式對於具有公共屬性,選擇所有節點
//*/@_attribute_
我不明白爲什麼需要星號。據我所知,表達式//選擇根節點的所有後代。那麼,例如,// @ lang不會選擇具有名爲「lang」的屬性的根節點的所有後代?我甚至不能解釋星號在上述表達式中的含義(我知道星號通常表示「全部」)。如果有人能爲我分解它,我會非常感激。
感謝
一本書我讀XML的說,選擇在一個XML文件中具有特定屬性的所有節點,使用語法:XPath表達式對於具有公共屬性,選擇所有節點
//*/@_attribute_
我不明白爲什麼需要星號。據我所知,表達式//選擇根節點的所有後代。那麼,例如,// @ lang不會選擇具有名爲「lang」的屬性的根節點的所有後代?我甚至不能解釋星號在上述表達式中的含義(我知道星號通常表示「全部」)。如果有人能爲我分解它,我會非常感激。
感謝
喜,一本書我讀的XML說 ,要選擇在一個XML文件 具有特定屬性的所有節點, 使用語法:
//*/@attribute
這是錯誤的。這將擴大到:
/descendant-or-self::node()/child::*/attribute::attribute
含義:節點的任何元素孩子的所有attribute
屬性爲根文件本身或其descendats的一個
您需要:
/descendant::*[attribute::attribute]
或簡稱
//*[@attribute]
關於*
:格式是名稱測試不是節點類型測試。在XPath 1.0中沒有元素類型測試。在XPath 2.0中,您有element()
。那麼,爲什麼只選擇元素?那麼,它不會。該軸有一個主節點類型,從http://www.w3.org/TR/xpath/#node-tests:
每個軸都有主節點類型。 如果一個軸可以包含元素,那麼 主節點類型是元素;否則,它是該軸可以包含的節點 的類型。因此,
- 對於屬性軸,主節點類型是屬性。
- 對於名稱空間軸,主節點類型是名稱空間。
- 對於其他軸,主節點類型是元素。
這就是爲什麼*
,child::*
,self::*
,descendant::*
等選擇的元素,但@*
或attribute::*
namespace::*
或選擇的屬性或在範圍的命名空間。
關於謂詞([@attribute]
部分):該表達式用每個節點在上一步中進行選擇時進行評估。它期望用於過濾的布爾值。節點集的布爾值(這是attribute::attribute
的結果)對於空節點集是錯誤的,否則爲true。
@Alejandro。 * */@ x' *沒有*錯誤,除了它比它可能長。 – 2010-10-23 16:43:47
這個問題的標題是:
對於具有公共屬性的選擇所有 節點XPath表達式
但是無處問題的文本討論如何壽找到的所有節點有一個共同的屬性 - 所以標題可能不正確。
要查找具有x
(順便說一句,只有元素節點可以有屬性),使用命名的屬性相同的所有節點:
//@x
:
//*[@x]
使用
選擇XML文檔中名爲x
的所有屬性。這可能是最短的表達方式。
沒有什麼錯:
//*/@x
除了它略長。
這是的縮寫:
/descendant-or-self::node()/child::*/attribute::x
並且還選擇了XML文檔中的所有x
屬性。
有人可能認爲此表達式不會選擇文檔中頂層元素的x
屬性。這是一種錯誤的結論,因爲第一位置步驟:
/descendant-or-self::node()
選擇每節點在文檔中,包括根(/
)本身。
這意味着:
/descendant-or-self::node()/child::*
選擇每個元素,包括頂部元件(這是一個良好的XML文檔中的根節點的唯一子)。
所以,當最後一個位置一步/@x
最後加入,這將選擇所有由前兩個位置到此爲止選擇的所有節點的x
屬性 - 那就是在XML中的所有元素節點的所有屬性x
文件。
+1感謝您的澄清。我總是喜歡閱讀你的答案。 – Garett 2010-10-25 15:45:35
好問題,+1。@我的回答是對@ Alejandro聲明你的XPath表達式是「錯誤的」的一點修正。 @ Alejandro的答案很好,除了這個XPath表達式沒有任何問題。 – 2010-10-23 16:56:17