2017-04-24 88 views
2

我想了解下面的例子爲什麼不//返回文檔節點?

<?xml version="1.0" encoding="UTF-8"?> 

<c> 
    <a> 
    <b att1="5"> 
     <c/> 
    </b> 
    <d/> 
    </a> 
    <a att1="10"> 
    <d> 
     <c/> 
    </d> 
    <b/> 
    </a> 
</c> 

現在我運行XPath查詢

//*[c] 

,我採取的意思是「有一個孩子是一個C的所有節點」。但是,這隻會返回<b><d>節點,該節點具有<c>子級,而不會像我期望的那樣返回Document節點。誰能解釋爲什麼?

回答

3

因爲//*等於/descendant-or-self::node()/*。請注意,在前一個XPath中由self::node()引用的文檔節點,因此該XPath選擇的最外面的節點將是文檔節點的子節點(歸因於/*),它是根元素c,它沒有直接子節點c,因此沒有被選中。

您希望/descendant-or-self::node()[c]包含文檔節點,相當於//.[c],請參閱the demo

+0

好的很清楚,謝謝! – anonnona

+1

我會加上'「*」'表示'child :: *','child :: *'只選擇元素節點。所以即使你編寫'self :: *',它也不會選擇文檔節點,因爲文檔節點不是一個元素。 –

相關問題