Operator XPath OR dla różnych węzłów

144

Jak mogę to zrobić z XPath:

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

Po prostu //titlenie zadziała, bo ja też//bookstore/magazine/title

ps Widziałem wiele przykładów, ale głównie z atrybutami lub strukturą pojedynczego węzła.

user569008
źródło
5
LUB obejmuje obie strony. To, czego szukasz, to operator XOR. Mylisz angielskie użycie słowa OR z operatorami logicznymi.
Zoran Pavlovic
10
W tym przypadku nie ma znaczenia, czy używasz lub lub xor , ponieważ nie jest możliwe, aby dopasować obie strony.
Dan Hulme

Odpowiedzi:

219

Wszystkie titlewęzły z zipcodelub bookwęzłem jako nadrzędnym:

Wersja 1:

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

Wersja 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stephan
źródło
5
"|" w rzeczywistości nie jest operatorem „OR” w XPath. Pozwala on na zbudowanie zestawu węzłów złożonego z podrzędnych drzew całego drzewa XML. „// książka | // cd” oznacza, że ​​wśród wszystkich węzłów potomnych i potomków węzła głównego znajdź wszystkie o nazwie „książka”, a następnie znajdź również wszystkie o nazwie „cd”. Jeśli w zstępstwie węzła głównego znajdują się tylko węzły książek, zestaw węzłów będzie zawierał tylko węzły książek. Jeśli w podrzędności węzła głównego są tylko węzły cd, twój zestaw węzłów będzie zawierał tylko węzły cd. Jeśli w zstępstwie węzła głównego znajdują się zarówno węzły book, jak i cd, twój zestaw węzłów będzie zawierał zarówno węzły book, jak i cd.
Stephan
1
Tak, zrozumiałem, co "|" operator jest. Moje pierwsze pytanie dotyczy operatora OR. Tak więc, jeśli są książki i płyty CD, znajdzie tylko książki, jeśli nie ma książek, ale tylko płyty CD, znajdzie płyty CD.
user569008
19
@ user569008: |jest operatorem zbioru sum .
1
Więc nie ma odpowiedzi na moje pytanie / brak operatora OR w XPath dla węzłów?
user569008
3
Operatory logiczne (OR, XOR, AND) są takie same w każdym języku programowania, ale język naturalny interpretuje je nieco inaczej. Podczas omawiania kwestii z nimi związanych najlepiej jest usuwać niejasności. Ponadto z XPath to najlepiej nie myśleć o wyniku jako istota a lub b , ale raczej to, że może być umieszczony przez A lub B . Logiczne oroznacza, że ​​można go zlokalizować a or b or both. Logiczne xor(eXclusive OR) oznacza, że ​​może zostać zlokalizowany przez either a or b, but not both. Logiczne andoznacza, że ​​można go zlokalizować both a and b.
neXus
52

Jeśli chcesz wybrać tylko jeden z dwóch węzłów z operatorem unii, możesz skorzystać z tego rozwiązania: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

azurkin
źródło
naprawdę (i )[1]oznacza wybranie tylko jednego z dwóch?!?!
oldboy
@Anthony Tak, wybierze jeden z dwóch, jeśli istnieją oba węzły, lub wybierze jedyny, który istnieje.
azurkin
okej, źle zinterpretowałem twoje stwierdzenie. działa jak każdy inny operator „lub”, więc jeśli pierwszy warunek zwróci prawdę, to drugi jest pomijany, tak?
oldboy,
@Anthony Nie. Tutaj nie ma żadnych warunków. Istnieją węzły. I „|” - jest operatorem sumy węzłów. Tworzy zestaw węzłów z określonych ścieżek i nie gwarantuje kolejności węzłów. Jeśli węzeł o określonej ścieżce nie istnieje, po prostu brakuje go w zestawie węzłów. Następnie konstrukcja „[1]” pobiera pierwszy węzeł z zestawu węzłów.
azurkin
Chodzi mi o to, że działa podobnie do operatora orlub w innych językach |, więc gdyby istniały oba węzły, zawsze zwracałby pierwszy węzeł?
oldboy,
3

Jeśli element ma dwie ścieżki xpath. Następnie możesz napisać dwie ścieżki x, jak poniżej:

xpath1 | xpath2

Na przykład:

//input[@name="username"] | //input[@id="wm_login-username"]
Subrahmanya Prasad
źródło