Toán tử XPath OR cho các nút khác nhau


144

Tôi có thể làm gì với XPath:

//bookstore/book/title or //bookstore/city/zipcode/title

Tôi //titlesẽ không làm việc vì tôi cũng có//bookstore/magazine/title

ps Tôi đã thấy rất nhiều hoặc ví dụ nhưng chủ yếu là với các thuộc tính hoặc cấu trúc nút đơn.


5
HOẶC bao gồm cả hai bên. Những gì bạn đang tìm kiếm là toán tử XOR. Bạn đang kết hợp cách sử dụng tiếng Anh của từ HOẶC với các toán tử logic.
Zoran Pavlovic

10
Trong trường hợp này nó làm cho không có sự khác biệt cho dù bạn sử dụng hoặc hoặc xor vì nó không thể phù hợp với cả hai bên.
Dan Hulme

Câu trả lời:


219

Tất cả titlecác nút có zipcodehoặc booknút là cha:

Phiên bản 1:

//title[parent::zipcode|parent::book]

Phiên bản 2:

//bookstore/book/title|//bookstore/city/zipcode/title

5
"|" không thực sự là một "toán tử OR" trong XPath. Nó cho phép bạn xây dựng một nút được tạo từ các nhánh của toàn bộ cây XML. "// book | // cd" có nghĩa là trong số tất cả các nút con và hậu duệ của nút gốc tìm tất cả các nút có tên 'book', sau đó tìm tất cả có tên 'cd'. Nếu trong hậu duệ của nút gốc chỉ có các nút sách, tập hợp nút của bạn sẽ chỉ chứa các nút sách. Nếu trong hậu duệ của nút gốc chỉ có các nút cd, tập hợp nút của bạn sẽ chỉ chứa các nút cd. Nếu trong hậu duệ của nút gốc có cả nút sách và nút cd, tập hợp nút của bạn sẽ chứa cả nút sách và nút cd.
Stephan

1
Vâng, tôi đã hiểu những gì "|" điều hành là. Câu hỏi ban đầu của tôi là về toán tử OR. Vì vậy, nếu có sách & đĩa, nó sẽ chỉ tìm sách, nếu không có sách, mà chỉ có đĩa, nó sẽ tìm thấy đĩa.
dùng569008

19
@ user569008: |toán tử tập hợp .

1
Vì vậy, không có câu trả lời cho câu hỏi của tôi / không có toán tử OR trong XPath cho các nút?
dùng569008

3
Các toán tử logic (OR, XOR, AND) giống nhau trong mọi ngôn ngữ lập trình nhưng ngôn ngữ tự nhiên diễn giải chúng hơi khác nhau. Tốt nhất là xóa bỏ sự mơ hồ khi thảo luận về các vấn đề liên quan đến chúng. Hơn nữa, với XPath tốt nhất là không nghĩ đến kết quả của bạn như a hoặc b , nhưng đúng hơn là nó có thể được xác định bằng cách a hoặc b . Hợp lý orcó nghĩa là nó có thể được định vị bởi a or b or both. Hợp lý xor(eXinating OR) có nghĩa là nó có thể được định vị bởi either a or b, but not both. Hợp lý andcó nghĩa là nó có thể được định vị bởi both a and b.
neXus

52

Nếu bạn muốn chỉ chọn một trong hai nút với toán tử union, bạn có thể sử dụng giải pháp này: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


thực sự ()[1]có nghĩa là chỉ chọn một trong hai?!?!
oldboy

@Anthony Có, nó sẽ chọn một trong hai, nếu cả hai nút tồn tại hoặc nó sẽ chọn một nút duy nhất tồn tại.
azurkin

được rồi, tôi hiểu sai lời tuyên bố của bạn nó hoạt động như bất kỳ toán tử "hoặc" nào khác, để nếu điều kiện thứ nhất trả về đúng, thì thứ hai được bỏ qua, yeah?
oldboy

@Anthony số Không có điều kiện ở đây. Có nút. Và "|" - là một toán tử liên kết nút. Nó tạo ra một nút từ các đường dẫn được chỉ định và không đảm bảo thứ tự các nút. Nếu nút có đường dẫn được chỉ định không tồn tại, nó chỉ đơn giản là thiếu trong một nút. Sau đó, "[1]" xây dựng lấy nút đầu tiên từ một nút.
azurkin

Quan điểm của tôi là nó hoạt động tương tự như một orhoặc trong các ngôn ngữ khác một |toán tử, để nếu cả hai nút tồn tại, nó sẽ luôn trả về nút đầu tiên?
oldboy

3

Nó là phần tử có hai xpath. Sau đó, bạn có thể viết hai xpath như dưới đây:

xpath1 | xpath2

Ví dụ:

//input[@name="username"] | //input[@id="wm_login-username"]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.