Operatore XPath OR per nodi diversi


144

Come posso fare con XPath:

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

Semplicemente //titlenon funzionerà perché anch'io ho//bookstore/magazine/title

ps ho visto molti o esempi ma principalmente con attributi o struttura a singolo nodo.


5
OR è comprensivo di entrambe le parti. Quello che stai cercando è l'operatore XOR. Stai combinando l'uso inglese della parola OR con operatori logici.
Zoran Pavlovic,

10
In questo caso non fa alcuna differenza se si utilizza o o xor in quanto non è possibile abbinare entrambe le parti.
Dan Hulme,

Risposte:


219

Tutti i titlenodi con zipcodeo booknodo come genitore:

Versione 1:

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

Versione 2:

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

5
"|" non è in realtà un "operatore OR" in XPath. Ti consente di creare un set di nodi composto da sottostri di un intero albero XML. "// libro | // cd" significa tra tutti i nodi figlio e discendente del nodo radice trovare tutti quelli che si chiamano "libro", quindi trovare anche tutti i nomi "cd". Se nella discendenza del nodo radice sono presenti solo nodi libro, il set di nodi conterrà solo nodi libro. Se nella discendenza del nodo principale sono presenti solo nodi cd, il set di nodi conterrà solo nodi cd. Se nella discendenza del nodo principale sono presenti sia nodi libro che nodi cd, il set di nodi conterrà nodi libro e nodi cd.
Stephan,

1
Sì, ho capito cosa "|" operatore è. La mia domanda iniziale riguarda l'operatore OR. Quindi, se ci sono libri e cd troverà solo libri, se non ci sono libri, ma solo cd, troverà cd.
user569008

19
@ user569008: |è l' operatore del set di unione .

1
Quindi, non c'è una risposta per la mia domanda / nessun operatore OR in XPath per i nodi?
user569008

3
Gli operatori logici (OR, XOR, AND) sono gli stessi in tutti i linguaggi di programmazione ma il linguaggio naturale li interpreta in modo leggermente diverso. È meglio rimuovere l'ambiguità quando si discute di problemi ad essi correlati. Inoltre, con XPath è meglio non pensare al vostro risultato come essere a o b , ma piuttosto che potrebbe essere localizzato a o b . Logico orsignifica che potrebbe essere individuato da a or b or both. Logico xor(eXclusive OR) significa che potrebbe essere individuato da either a or b, but not both. Logico andsignifica che potrebbe essere individuato da both a and b.
neXus

52

Se si desidera selezionare solo uno dei due nodi con l'operatore union, è possibile utilizzare questa soluzione: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]


veramente il (e )[1]significa selezionare solo uno dei due?!?!
oldboy,

@Anthony Sì, selezionerà uno dei due, se esistono entrambi i nodi, oppure selezionerà l'unico esistente.
Azurkin,

ok, ho frainteso la tua affermazione. funziona come qualsiasi altro operatore "o", quindi se la prima condizione ritorna vera, la seconda viene esclusa, sì?
Oldboy,

@Anthony No. Non ci sono condizioni qui. Ci sono nodi E "|" - è un operatore di unione dei nodi. Crea un set di nodi da percorsi specificati e non garantisce l'ordine dei nodi. Se il nodo con il percorso specificato non esiste, è semplicemente mancante in un set di nodi. Quindi, il costrutto "[1]" ottiene il primo nodo da un set di nodi.
Azurkin,

il mio punto è che funziona in modo simile a un operatore oro in altre lingue un |operatore, in modo che se esistessero entrambi i nodi, restituirebbe sempre il primo nodo?
oldboy,

3

Se l'elemento ha due xpath. Quindi puoi scrivere due xpath come di seguito:

xpath1 | xpath2

Per esempio:

//input[@name="username"] | //input[@id="wm_login-username"]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.