簡體   English   中英

XPath:多個謂詞與邏輯 And 運算符

[英]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) 如果XY是數字然后它被解釋為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.

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