Operador XPath OR para nós diferentes

144

Como posso fazer com o XPath:

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

//titlenão vai funcionar, porque eu também tenho//bookstore/magazine/title

ps Eu vi muitos exemplos, mas principalmente com atributos ou estrutura de nó único.

user569008
fonte
5
OU é inclusivo de ambos os lados. O que você está procurando é o operador XOR. Você está confundindo o uso da palavra OU em inglês com operadores lógicos.
Zoran Pavlovic
10
Nesse caso, não faz diferença se você usa ou ou xor, pois não é possível combinar os dois lados.
21913 Dan Hulme

Respostas:

219

Todos os titlenós com zipcodeou booknó como pai:

Versão 1:

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

Versão 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stephan
fonte
5
"|" não é realmente um "operador OR" no XPath. Ele permite que você crie um conjunto de nós composto por substratos de uma árvore XML inteira. "// book | // cd" significa que, entre todos os nós filhos e descendentes do nó raiz, encontre todos os nomeados 'book' e encontre também todos os nomes 'cd'. Se na descida do nó raiz houver apenas nós de livro, seu conjunto de nós conterá apenas nós de livro. Se na descida do nó raiz houver apenas nós de cd, o conjunto de nós conterá apenas nós de cd. Se na descida do nó raiz houver dois nós de livro e cd, o conjunto de nós conterá os nós de livro e CD.
23411 Stephan
1
Sim, eu entendi o que "|" operador é. Minha pergunta inicial é sobre o operador OR. Portanto, se houver livros e CDs, ele encontrará apenas livros; se não houver livros, mas apenas CDs, ele encontrará CDs.
user569008
19
@ user569008: |é o operador do conjunto de união .
1
Portanto, não há resposta para minha pergunta / nenhum operador OR no XPath para nós?
user569008
3
Operadores lógicos (OR, XOR e AND) são os mesmos em todas as linguagens de programação, mas a linguagem natural os interpreta levemente diferentes. É melhor remover a ambiguidade ao discutir questões relacionadas a eles. Além disso, com XPath é melhor não pensar em seu resultado como sendo a ou b , mas sim que ela pode ser localizado por a ou b . Lógico orsignifica que ele pode ser localizado por a or b or both. Lógico xor(OR exclusivo) significa que ele pode ser localizado por either a or b, but not both. Lógico andsignifica que ele pode ser localizado por both a and b.
NeXus
52

Se você deseja selecionar apenas um dos dois nós com o operador union, você pode usar esta solução: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

azurkin
fonte
realmente o (e )[1]meios para selecionar apenas um dos dois?!?!
Oldboy
@ Anthony Sim, ele selecionará um dos dois, se os dois nós existirem, ou o único que existir.
Azurkin
ok, interpretei mal sua declaração. funciona como qualquer outro operador "ou", de modo que, se a primeira condição retornar verdadeira, a segunda será ignorada, sim?
Oldboy
@ Anthony No. Não há condições aqui. Existem nós. E "|" - é um operador de união de nós. Ele cria um conjunto de nós a partir de caminhos especificados e não garante a ordem dos nós. Se o nó com o caminho especificado não existir, ele simplesmente estará ausente em um conjunto de nós. Em seguida, a construção "[1]" obtém o primeiro nó de um conjunto de nós.
11265 azurkin
O que quero dizer é que ele funciona de maneira semelhante a um operador orou em outras línguas |, de modo que, se os dois nós existissem, sempre retornaria o primeiro nó?
Oldboy
3

É o elemento tem dois xpath. Então você pode escrever dois xpaths como abaixo:

xpath1 | xpath2

Por exemplo:

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