¿Cuál es el XPath correcto para elegir los atributos que contienen “foo”?

Dado este XML, qué XPath devuelve todos los elementos cuyo atributo prop contiene Foo (los tres primeros nodos):

       

 //a[contains(@prop,'Foo')] 

Funciona si uso este XML para recuperar los resultados.

  a b c a  

Este sitio es ideal para probar este tipo de cosas

http://www.xmlme.com/XpathTool.aspx

Editar: Otra cosa a tener en cuenta es que mientras el XPath anterior devolverá la respuesta correcta para ese xml particular, si quiere garantizar que solo obtenga los elementos “a” en el elemento “blah”, debe como otros han mencionado también usar

 /bla/a[contains(@prop,'Foo')] 

Esto buscará todos los elementos “a” en su documento xml completo, independientemente de estar nested en un elemento “blah”

 //a[contains(@prop,'Foo')] 

Agregué esto en aras de la minuciosidad y en el espíritu de stackoverflow. 🙂

Esta XPath le proporcionará todos los nodos que tengan atributos que contengan ‘Foo’ independientemente del nombre del nodo o nombre del atributo:

 //attribute::*[contains(., 'Foo')]/.. 

Por supuesto, si está más interesado en los contenidos del atributo en sí, y no necesariamente en su nodo padre, simplemente suelte el / …

 //attribute::*[contains(., 'Foo')] 
 descendant-or-self::*[contains(@prop,'Foo')] 

O:

 /bla/a[contains(@prop,'Foo')] 

O:

 /bla/a[position() <= 3] 

Disecado:

 descendant-or-self:: 

El Eje: busca a través de cada nodo debajo y del nodo en sí. A menudo es mejor decir esto que //. He encontrado algunas implementaciones donde // significa en cualquier lugar (descendente o propio del nodo raíz). El otro usa el eje predeterminado.

 * or /bla/a 

La etiqueta: una coincidencia de comodín y / bla / a es una ruta absoluta.

 [contains(@prop,'Foo')] or [position() <= 3] 

La condición dentro de []. @prop es la abreviatura de attribute :: prop, ya que el atributo es otro eje de búsqueda. Alternativamente, puede seleccionar los primeros 3 usando la función de posición ().

John C es el más cercano, pero XPath distingue entre mayúsculas y minúsculas, por lo que el XPath correcto sería:

 /bla/a[contains(@prop, 'Foo')] 

¿Has probado algo como esto?

// a [contiene (@prop, “Foo”)]

Nunca he usado la función contains antes, pero sospecho que debería funcionar como se anuncia …

Si también necesita hacer coincidir el contenido del enlace, use el texto ():

//a[contains(@href,"/some_link")][text()="Click here"]

/ bla / a [contiene (@prop, “foo”)]

Para el código anterior … // * [contains (@ prop, ‘foo’)]

prueba esto:

// a [contiene (@ prop, ‘foo’)]

eso debería funcionar para cualquier etiqueta “a” en el documento