2010-10-22 103 views
10

一本書我讀XML的說,選擇在一個XML文件中具有特定屬性的所有節點,使用語法:XPath表達式對於具有公共屬性,選擇所有節點

//*/@_attribute_ 

我不明白爲什麼需要星號。據我所知,表達式//選擇根節點的所有後代。那麼,例如,// @ lang不會選擇具有名爲「lang」的屬性的根節點的所有後代?我甚至不能解釋星號在上述表達式中的含義(我知道星號通常表示「全部」)。如果有人能爲我分解它,我會非常感激。

感謝

+0

好問題,+1。@我的回答是對@ Alejandro聲明你的XPath表達式是「錯誤的」的一點修正。 @ Alejandro的答案很好,除了這個XPath表達式沒有任何問題。 – 2010-10-23 16:56:17

回答

14

喜,一本書我讀的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。

+0

@Alejandro。 * */@ x' *沒有*錯誤,除了它比它可能長。 – 2010-10-23 16:43:47

12

這個問題的標題是

對於具有公共屬性的選擇所有 節點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文件。

+2

+1感謝您的澄清。我總是喜歡閱讀你的答案。 – Garett 2010-10-25 15:45:35

相關問題