Operador XPath OR para diferentes nodos

144

¿Cómo puedo hacer con XPath:

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

Simplemente //titleno funcionará porque también tengo//bookstore/magazine/title

ps. Vi muchos ejemplos, pero principalmente con atributos o estructura de nodo único.

usuario569008
fuente
55
O incluye ambos lados. Lo que está buscando es el operador XOR. Estás combinando el uso de la palabra OR en inglés con operadores lógicos.
Zoran Pavlovic
10
En este caso no hace ninguna diferencia si se utiliza o o XOR ya que no es posible hacer coincidir ambos lados.
Dan Hulme

Respuestas:

219

Todos los titlenodos con zipcodeo booknodo como padre:

Versión 1:

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

Versión 2:

//bookstore/book/title|//bookstore/city/zipcode/title
Stephan
fuente
55
"|" no es realmente un "operador OR" en XPath. Le permite construir un conjunto de nodos compuesto por subárboles de un árbol XML completo. "// book | // cd" significa que entre todos los nodos secundarios y descendientes del nodo raíz, encuentre todos los llamados 'book' y luego encuentre todos los llamados 'cd'. Si en la descendencia del nodo raíz solo hay nodos de libro, su conjunto de nodos solo contendrá nodos de libro. Si en la descendencia del nodo raíz solo hay nodos de CD, su conjunto de nodos solo contendrá nodos de CD. Si en la descendencia del nodo raíz hay nodos book y cd, su conjunto de nodos contendrá nodos book y cd.
Stephan
1
Sí, entendí qué "|" operador es. Mi pregunta inicial es sobre el operador OR. Por lo tanto, si hay libros y CD, solo encontrará libros, si no hay libros, sino solo CD, encontrará CD.
user569008
19
@ user569008: |es el operador de conjunto de unión .
1
Entonces, ¿no hay respuesta para mi pregunta / no hay operador OR en XPath para nodos?
user569008
3
Los operadores lógicos (OR, XOR y AND) son los mismos en todos los lenguajes de programación, pero el lenguaje natural los interpreta de forma ligeramente diferente. Es mejor eliminar la ambigüedad cuando se discuten temas relacionados con ellos. Por otra parte, con XPath que lo mejor es no pensar en su resultado como siendo aob , sino que podría ser localizado por aob . Lógico orsignifica que podría ser localizado por a or b or both. Lógico xor(OR exclusivo) significa que podría ser localizado por either a or b, but not both. Lógico andsignifica que podría ser localizado por both a and b.
neXus
52

Si desea seleccionar solo uno de los dos nodos con operador de unión, puede usar esta solución: (//bookstore/book/title | //bookstore/city/zipcode/title)[1]

azurkin
fuente
realmente el (y )[1]significa seleccionar solo uno de los dos?!?!
oldboy
@Anthony Sí, seleccionará uno de los dos, si ambos nodos existen, o seleccionará el único que existe.
azurkin
Está bien, interpreté mal tu declaración. funciona como cualquier otro operador "u", de modo que si la primera condición devuelve verdadero, entonces la segunda se omite, ¿sí?
oldboy
@ Anthony No. No hay condiciones aquí. Hay nodos Y "|" - es un operador de unión de nodos. Crea un conjunto de nodos a partir de rutas especificadas y no garantiza el orden de los nodos. Si el nodo con la ruta especificada no existe, simplemente falta en un conjunto de nodos. Luego, la construcción "[1]" obtiene el primer nodo de un conjunto de nodos.
azurkin
mi punto es que funciona de manera similar a un operador oren otros idiomas |, de modo que si existieran ambos nodos, ¿siempre devolvería el primer nodo?
oldboy
3

Es el elemento tiene dos xpath. Luego puedes escribir dos xpaths como a continuación:

xpath1 El | xpath2

P.ej:

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