Operator XPath ATAU untuk node yang berbeda

144

Bagaimana saya bisa melakukan dengan XPath:

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

Tidak //titleakan berhasil karena saya juga punya//bookstore/magazine/title

ps Saya melihat banyak atau contoh tetapi terutama dengan atribut atau struktur simpul tunggal.

pengguna569008
sumber
5
ATAU termasuk kedua belah pihak. Apa yang Anda cari adalah operator XOR. Anda menggabungkan penggunaan bahasa Inggris dari kata ATAU dengan operator logis.
Zoran Pavlovic
10
Dalam hal ini tidak ada bedanya apakah Anda menggunakan atau atau xor karena tidak mungkin untuk mencocokkan kedua belah pihak.
Dan Hulme

Jawaban:

219

Semua titlenode dengan zipcodeatau booksimpul sebagai induk:

Versi 1:

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

Versi 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stephan
sumber
5
"|" sebenarnya bukan "ATAU operator" di XPath. Ini memungkinkan Anda untuk membangun nodeset yang terdiri dari subtree dari seluruh pohon XML. "// book | // cd" berarti di antara semua simpul anak dan keturunan dari simpul akar, temukan semua yang bernama 'buku' lalu temukan juga semua yang bernama 'cd'. Jika dalam turunan node root hanya ada node buku, set simpul Anda hanya akan berisi node buku. Jika dalam turunan dari simpul root hanya ada cd node, set simpul Anda hanya akan berisi cd node. Jika dalam turunan node root ada buku dan cd node, set simpul Anda akan berisi buku dan cd node.
Stephan
1
Ya, saya mengerti apa "|" operator. Pertanyaan awal saya adalah tentang operator OR. Jadi, jika ada buku & CD hanya akan menemukan buku, jika tidak ada buku, tetapi hanya CD, ia akan menemukan CD.
user569008
19
@ user569008: |adalah operator set union .
1
Jadi, tidak ada jawaban untuk pertanyaan saya / tidak ada operator ATAU di XPath untuk node?
user569008
3
Operator logis (OR, XOR, AND) adalah sama di setiap bahasa pemrograman tetapi bahasa alami menafsirkannya sedikit berbeda. Cara terbaik untuk menghapus ambiguitas saat mendiskusikan masalah yang terkait dengannya. Selain itu, dengan XPath yang terbaik tidak memikirkan hasil Anda sebagai menjadi a atau b , melainkan bahwa itu bisa ditemukan dengan a atau b . Logikanya orberarti dapat ditemukan oleh a or b or both. Logical xor(eXclusive OR) berarti dapat ditemukan oleh either a or b, but not both. Logikanya andberarti dapat ditemukan oleh both a and b.
neXus
52

Jika Anda ingin memilih hanya satu dari dua node dengan operator gabungan, Anda dapat menggunakan solusi ini: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

Azurkin
sumber
benar-benar (dan )[1]berarti memilih hanya satu dari keduanya?!?!
oldboy
@Anthony Ya, itu akan memilih salah satu dari dua, jika kedua node ada, atau itu akan memilih satu-satunya yang ada.
azurkin
oke, saya salah mengartikan pernyataan Anda. beroperasi seperti operator "atau" lainnya, sehingga jika kondisi pertama mengembalikan true, maka yang kedua dilewati, ya?
oldboy
@Anthony No. Tidak ada kondisi di sini. Ada beberapa node. Dan "|" - adalah operator serikat node. Itu menciptakan nodeset dari jalur yang ditentukan, dan tidak menjamin urutan node. Jika node dengan jalur yang ditentukan tidak ada, itu hanya hilang dalam sebuah nodeset. Kemudian, "[1]" membangun get node pertama dari sebuah nodeset.
azurkin
maksud saya adalah fungsinya mirip dengan oratau dalam bahasa lain |operator, sehingga jika kedua node ada, ia akan selalu mengembalikan node pertama?
oldboy
3

Itu elemen memiliki dua xpath. Maka Anda dapat menulis dua xpath seperti di bawah ini:

xpath1 | xpath2

Misalnya:

//input[@name="username"] | //input[@id="wm_login-username"]
Subrahmanya Prasad
sumber