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.


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

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]


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"]
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.