2011-01-07 110 views
21

XML文檔:XPath運算符「!=」。它是如何工作的?

<doc> 
    <A> 
     <Node>Hello!</Node> 
    </A> 

    <B>  
     <Node/> 
    </B> 

    <C> 
    </C> 

    <D/> 
</doc> 

你會如何評價以下XPath查詢?

/doc/A/Node != 'abcd' 
/doc/B/Node != 'abcd' 
/doc/C/Node != 'abcd' 
/doc/D/Node != 'abcd' 

我希望所有這以評估真正

然而,這裏的結果:

/doc/A/Node != 'abcd'  true 
/doc/B/Node != 'abcd'  true 
/doc/C/Node != 'abcd'  false 
/doc/D/Node != 'abcd'  false 

這是預期的行爲?或者它是我的XPath提供程序(jaxen)的錯誤?

+0

好問題,+1。請參閱我的回答以獲得解釋和「一定要記住」的規則和解決方案。:) – 2011-01-07 20:00:16

回答

1

XPath spec

如果要比較一個對象是一個節點集合,而另一個是一個字符串,則比較爲真,當且僅當有在節點 - 節點設置爲使得對節點的字符串值和另一個字符串執行比較的結果爲true。

這意味着如果節點集爲空(如您的情況C和D),則布爾表達式的結果將爲假,因爲不存在不等式可應用的節點。

可以解決此問題,並得到你想要使用像一個表達式的結果:

count(/doc/C/Node) = 0 or /doc/C/Node != 'abcd' 
+1

+1引用規範-1好推薦不好... – 2011-01-07 20:17:25

42

建議:切勿使用!=運算符來比較差距,其中一個或兩個參數是節點集。

By definition表達

$node-set != $value 

評估爲true()恰好當在$node-set這樣的至少一個節點,其字符串值不等於的$value字符串值。

使用這個定義

$empty-nodeset != $value 

總是false(),因爲沒有即使在$empty-nodeset爲其不等式成立一個節點。

解決方案

使用

not($node-set = $value) 

然後你得到的所有結果true(),通緝

+0

+1。這個技巧已經救了我很多神經。 – Flack 2011-01-07 20:01:32

相關問題