[英]XPath: multiple predicates vs logical And operator
當我們有多個術語來定位一個元素時,我們可以使用一個帶有邏輯and運算符的謂詞,或者使用多個謂詞,每個謂詞中有一個術語。
例如,在此頁面上,我們可以找到指向包含selenium
的問題的鏈接,這些鏈接包含此 XPath:
"//a[@class='s-link'][contains(@href,'selenium')]"
有了這個
"//a[@class='s-link' and contains(@href,'selenium')]"
我想知道這兩種方法之間是否有任何區別?
如果兩個謂詞都不是位置的,則這些表達式是等價的。 如果 (a) 其值是數字,或 (b) 其值取決於動態上下文中的當前 position(出於實際目的,這意味着如果它是調用position()
函數的表達式),則謂詞是位置的。
假設滿足此條件,則沒有充分的理由偏愛一種表達方式而不是另一種表達方式。 當然,某些 XPath 處理器可能比另一個處理器更快地評估其中一個,但這不太可能是一個顯着差異,它同樣有利於兩者中的任何一個。
go 在以影響錯誤處理的方式優化結構方面,提供給處理器的自由度存在細微差異,並且這些規則在 XPath 版本之間略有不同,但這在實踐中不太可能很重要。
等價性不適用於位置謂詞,因為 (a) 當您編寫A[X][Y]
時, Y
中的position()
值不同於X
中的值,以及 (b) 如果X
或Y
是數字然后它被解釋為position()=X
(或position()=Y
),這不適用於and
的操作數:您不能將A[@code][1]
重寫為A[@code and 1]
。
計算這些表達式的算法可能有所不同,但結果是相同的。 如果第二個條件包含position()
或last()
,情況就會有所不同:
//a[@class='s-link'][position() > 1]
給出除第一個之外的所有s-link
錨點(因為position()
是節點集中的 position //a[@class='s-link']
)而//a[@class='s-link' and position() > 1]
給出第一個錨點之后的所有s-link
錨點(因為position()
是節點集中的 position //a
)。 此外,您可以使用//a[@class='s-link'][1]
select 第一個s-link
錨點,但不能使用//a[@class='s-link' and 1]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.