2010-02-16 45 views
6

只是一個關於xpath的'not'和'!='在以下內容中的區別的簡單問題。XPath - 'not'和'!='之間的區別

服用XML:

<years> 
    <year value="2010"></year> 
    <year value="2010"></year> 
    <year value="2010"></year> 
    <year value="2009"></year> 
</years> 

我要選擇獨特年。我努力了一段時間來實現這一目標,但最終卻得到了管理,但是卻以一種我沒有想到的奇怪的方式。

以下XPath是我的意圖正確,並返回2009年的兩個特殊的一年節點2010

years/year[not(@value = preceding-sibling::year/@value)] 

以下只返回2009年的節點。

years/year[@value != preceding-sibling::year/@value] 

它們之間唯一的區別是!=,而不是運營商。我思考了這一段時間,我找不到能夠令人滿意地向其他人解釋的區別。

也許有人可以幫忙。

乾杯

史蒂夫

回答

8

第二個示例不起作用,因爲如果將它應用於前3個節點中的每個節點,它將永遠不匹配。對於第一個<year>,沒有前面的兄弟姐妹的值可能會嘗試比較,所以它無法匹配。對於第二個和第三個,它們的前一個節點確實具有相同的值,所以不等式測試失敗並且不再導致匹配。

not(...)版本的作品,因爲在第一個節點,整個@value = preceding-sibling::year/@value失敗是由於缺乏前面的兄弟,而這個失敗的not倒,給你的第一個節點上的匹配。

+0

太棒了!這是一個完美的答案,非常簡單。非常感謝 - 今晚我可以輕鬆入睡,也許這會在未來幫助其他人。我認爲我沒有足夠的聲望點給你投票,但是我會一次。 乾杯 史蒂夫 –

0

我是對的XPath無親,但我認爲「不」 retunrns的含事情的反轉值和!=返回兩個compareable事物之間的比較值

+0

但肯定'not(x = y)'與'x!= y'是一樣的。顯然這不是,但我不明白爲什麼。 –

8

在XPath,a != bnot(a = b)有很大的不同

這也是爲什麼

從規範了用於XPath 1.0:

如果要比較兩個對象都是 節點集,那麼比較將是 當且僅當存在在 一個節點的第一個節點集和節點在 第二節點集,使得結果 執行 兩個節點的字符串值的比較爲 爲true。

這意味着如果a和b中任何元素之間存在匹配,則節點集的(a = b)爲真。
(a!= b)表示DOES中的某個元素與b中的某個元素不匹配。所以對於節點組A =(1,2),B =(1,2)。 bOTH a = b和a!= b將返回true。

在你的情況下發生的事情是,(2010 != empty set)永遠是假的,而
not (2010 = empty set)總是正確的。考慮上面的匹配規則。

+0

嗨凱爾, 感謝您抽出時間。這是一個擴展的答案,但是與上面的Max S.一樣,這很棒。 –