2012-06-20 112 views
11

我試圖選擇所有具有id="mydiv"的dom元素,但排除也具有class="exclass"的元素。現在我正在做第一部分//*[@id="mydiv"]。我如何添加類排除部分?xpath排除具有類別的元素

P.S.如果你想知道爲什麼我需要選擇多個具有相同ID的元素,我只是在處理一個我無法控制的現有DOM。

+0

你有多個具有相同ID的元素?這是不健康的,你知道的。 http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

回答

17

您可以使用否定:

//*[@id="mydiv and @class!="exclass"] 

如果class屬性可能不是所有的節點上都存在,你需要這樣的:

//*[@id="mydiv" and (not(@class) or @class!="exclass")] 

最後的(有點)奇邏輯可以變成什麼樣邁克爾提出:

//*[@id="mydiv" and not(@class="exclass")] 

雖然,個人而言,XPath無法比較的事實如果缺少屬性,則感覺有點像缺點。

+0

這不是什麼用戶要求。 Downvoting。看到我的答案。 –

+0

@MichaelKay謝謝你指出,我已經更新了我的答案;正如我的更新中提到的那樣,我覺得擁有「任何東西都不能與任何東西相比」是xpath的一個缺點;只是想不出爲什麼該行爲會有用的任何理由:/ –

5

的回答書面問題是

//*[@id="mydiv" and not(@class="exclass")] 

如果有@id屬性,它的值是mydiv條件的前半部分是真實的。如果不存在具有exclass值的@class屬性,也就是說,如果沒有class屬性,或者存在class屬性,並且其值不是「exclass」,則後半部分爲true。

避免使用!=在這種情況下:90%的時間,如果你想寫A=B,你可能想要not(A=B)。在A或B不是單例的情況下,它的含義是不同的,也就是說,它或者是空的,或者可以包含多個值。

+0

TriXPath(如在技巧)規則! – jolt