簡體   English   中英

XPath - 'not'和'!='之間的區別

[英]XPath - Difference between 'not' and '!='

關於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]

它們之間唯一的區別是!=而不是運算符。 我已經思考了一段時間,我找不到可以令人滿意地向其他人解釋的差異。

也許有人可以幫忙。

干杯

史蒂夫

第二個示例不起作用,因為如果將它應用於前3個節點中的每個節點,它永遠不會匹配。 對於第一個<year> ,沒有先前的兄弟,其值可能會嘗試與之比較,因此無法匹配。 對於第二個和第三個,它們的前一個節點具有相同的值,因此不相等測試失敗並導致不再匹配。

not(...)版本可以正常工作,因為在第一個節點中,由於缺少前面的兄弟,整個@value = preceding-sibling::year/@value失敗,而這個失敗因為not反轉,給你一個在第一個節點上匹配。

在XPath中, a != bnot(a = b)非常不同

這就是原因

從XPath 1.0的規范:

如果要比較的兩個對象都是節點集,那么當且僅當第一個節點集中有一個節點而第二個節點集中有一個節點時才進行比較,以便在該節點上執行比較的結果兩個節點的字符串值為true。

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

在你的情況下,發生的事情是(2010 != empty set)總是假的,而
not (2010 = empty set)始終為真。 考慮上面的匹配規則。

我不是xpath的專業人士,但我認為'not'重新計算包含事物的倒置值,而!=返回兩個可比較事物之間的比較值

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM