XPath bookstore/book[1]
selecciona el primer nodo del libro en bookstore
.
¿Cómo puedo seleccionar el primer nodo que coincide con una condición más complicada, por ejemplo, el primer nodo que coincide /bookstore/book[@location='US']
Utilizar:
(/bookstore/book[@location='US'])[1]
Primero obtendrá los elementos del libro con el atributo de ubicación igual a 'US'. Luego seleccionará el primer nodo de ese conjunto. Tenga en cuenta el uso de paréntesis, que algunas implementaciones requieren.
Tenga en cuenta que esto no es lo mismo que a /bookstore/book[1][@location='US']
menos que el primer elemento también tenga ese atributo de ubicación.
/bookstore/book[@location='US'][1]
no devuelve todos los libros de 'EE. UU.'. Lo he probado varias veces y en implementaciones xpath de diferentes idiomas./bookstore/book[@location='US'][1]
devuelve el primer libro "EE. UU." en una librería. Si hay varias librerías, devolverá la primera de cada una. Esto es lo que solicitó el OP (el primer nodo en la librería). Su versión solo devuelve un libro de todas las librerías (el primer partido)./bookstore/book[@location='US'][1]
funciona solo con estructura simple.Agregue un poco más de estructura y las cosas se rompen.
Con
/bookstore/category/book[@location='US'][1]
rendimientosno "el primer nodo que coincide con una condición más complicada".
/bookstore/category/book[@location='US'][2]
no devuelve nadaCon paréntesis puede obtener el resultado de la pregunta original:
(/bookstore/category/book[@location='US'])[1]
day
(/bookstore/category/book[@location='US'])[2]
funciona como se esperaba.fuente
/bookstore/book[1]
y NO(/bookstore/book)[1]
. El caso que proporcionó no es el mismo que el que solicitó OP. Presumiblemente, OP aceptó mi respuesta ya que hizo lo que esperaba (y solicitó).'(//div[text() = "'+ name +'"])[1]/following-sibling::*/div/text()'
. En caso de que haya muchos nodos coincidentesname
.Como explicación a la respuesta de Jonathan Fingland:
[position()=1 and @location='US']
) deben ser verdaderas como un todo[position()=1][@location='US']
) deben ser verdaderas una tras otra[position()=1][@location='US']
! =[@location='US'][position()=1]
while
[position()=1 and @location='US']
==[@location='US' and position()=1]
[position()=1]
se puede abreviar a[1]
Puede construir expresiones complejas en predicados con los operadores booleanos "
and
" y "or
", y con las funciones booleanas XPathnot()
,true()
yfalse()
. Además, puede ajustar las subexpresiones entre paréntesis.fuente
La forma más fácil de encontrar el primer nodo de libro en inglés (en todo el documento), teniendo en cuenta un archivo XML estructurado más complicado, como:
es la expresión xpath:
fuente
Entonces, dado lo anterior; puedes seleccionar el primer libro con
Y este encontrará el primero en cualquier lugar que tenga una ubicación en EE. UU. [A1]
Devolvería el conjunto de nodos con todos los libros con ubicación US. [A1, B1, C2]
Devolvería la primera ubicación de libro de EE. UU. Que existe en una categoría en cualquier parte del documento. [B1]
devolverá el primer libro con la ubicación de EE. UU. que existe en cualquier lugar debajo de la librería de elementos raíz; haciendo que la parte / bookstore sea realmente redundante. [A1]
En respuesta directa:
Le devolverá el primer nodo para el elemento del libro con la ubicación US que está debajo de la librería [A1]
Por cierto, si quisieras, en este ejemplo, encontrar el primer libro de EE. UU. Que no fue hijo directo de una librería:
fuente
Use el índice para obtener el nodo deseado si xpath es complicado o si hay más de un nodo presente con el mismo xpath.
Ej:
Puede dar el número del nodo que desea.
fuente
si se proporciona espacio de nombres en el xml dado, es mejor usarlo.
fuente
por ej.
Y
fuente
Con la ayuda de un probador de xpath en línea , estoy escribiendo esta respuesta ...
Para esto:
el siguiente xpath:
salidas:
Como 1 significa seleccionar todos los elementos td que son el primer hijo de su propio padre directo.
Pero el siguiente xpath:
salidas:
fuente