2012-06-20 34 views
11

Tôi đang cố gắng chọn tất cả các phần tử dom có ​​id="mydiv" nhưng loại trừ các phần tử có số class="exclass". Ngay bây giờ tôi đang làm phần đầu tiên //*[@id="mydiv"]. Làm cách nào để thêm phần loại trừ lớp học?xpath để loại trừ các phần tử có lớp

P.S. Trong trường hợp bạn đang tự hỏi tại sao tôi cần phải chọn nhiều yếu tố có cùng một id, tôi chỉ đang làm việc trên một DOM hiện có mà tôi không thể kiểm soát.

+0

Bạn có nhiều phần tử có cùng id? Điều đó không lành mạnh, bạn biết đấy. http://stackoverflow.com/questions/2487074/what-are-the-side-effects-of-using-multiple-instances-of-a-single-id-name-in-htm – jolt

Trả lời

17

Bạn có thể sử dụng phủ định:

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

Nếu thuộc tính class có thể không tồn tại trên tất cả các nút, bạn cần điều này:

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

cuối cùng (hơi) lẻ logic có thể được biến thành những gì Michael đề xuất:

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

Mặc dù, cá nhân, thực tế là XPath không thể so sánh tiện ích nếu thuộc tính bị thiếu cảm thấy hơi giống như thiếu sót.

+0

Điều này không hoàn toàn là gì người dùng đã yêu cầu. Downvoting. Xem câu trả lời của tôi. –

+0

@MichaelKay Cảm ơn bạn đã chỉ ra điều đó, tôi đã cập nhật câu trả lời của mình; như đã đề cập trong bản cập nhật của tôi, tôi cảm thấy rằng có một "không gì có thể không được so sánh với bất cứ điều gì" là một phần của một thiếu sót của xpath; chỉ không thể nghĩ ra bất kỳ lý do nào tại sao hành vi đó sẽ hữu ích:/ –

5

Câu trả lời cho những câu hỏi như viết là

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

Nửa đầu của tình trạng này là đúng sự thật nếu có một thuộc tính @ id và giá trị của nó là mydiv. Phần thứ hai là true nếu không có thuộc tính @class với lớp exclass giá trị: nghĩa là, nếu không có thuộc tính class, hoặc nếu có một thuộc tính class và giá trị của nó là một cái gì đó khác với "exclass".

Tránh sử dụng! = Trong trường hợp này: 90% thời gian, nếu bạn nghĩ đến việc viết A=B, bạn có thể muốn not(A=B). Ý nghĩa là khác nhau trong trường hợp A hoặc B không phải là một singleton, nghĩa là, nơi nó hoặc là rỗng, hoặc có thể chứa nhiều giá trị.

+0

Quy tắc TriXPath (như trong thủ thuật)! – jolt

Các vấn đề liên quan