2008-09-19 13 views
32

¿Es posible usar XPath para seleccionar solo los nodos que tienen elementos secundarios en particular? Por ejemplo, de este XML solo quiero los elementos en mascotas que tienen un hijo de 'barra'. Por lo que el conjunto de datos resultante contendría los lizard y pig elementos de este ejemplo:¿Puede XPath devolver solo nodos que tengan un hijo de X?

<pets> 
    <cat> 
    <foo>don't care about this</foo> 
    </cat> 
    <dog> 
    <foo>not this one either</foo> 
    </dog> 
    <lizard> 
    <bar>lizard should be returned, because it has a child of bar</bar> 
    </lizard> 
    <pig> 
    <bar>return pig, too</bar> 
    </pig> 
</pets> 

Este Xpath me da todas las mascotas: "/pets/*", pero sólo quiere que los animales que tienen un nodo hijo del nombre 'bar'.

+1

No subestime las especificaciones de W3C en cuanto a la legibilidad y utilidad. Probablemente sea más rápido buscar las respuestas a preguntas como estas en the spec, que es muy legible y completo, con muchos ejemplos. – Confusion

Respuesta

45

aquí está, en todo su esplendor

/pets/*[bar] 

Inglés: Dame todos los niños de pets que tiene un niño bar

21
/pets/child::*[child::bar] 

Mi perdón, no vi los comentarios a la respuesta anterior.

Pero en este caso prefiero prefiero usar el eje descendant::, que incluye todos los elementos desde especificada:

/pets[descendant::bar] 
4

Sólo en caso de que quería ser más específico sobre los hijos - también se puede utilizar selectores en ellos.

Ejemplo:

<pets> 
    <cat> 
     <foo>don't care about this</foo> 
    </cat> 
    <dog> 
     <foo>not this one either</foo> 
    </dog> 
    <lizard> 
     <bar att="baz">lizard should be returned, because it has a child of bar</bar> 
    </lizard> 
    <pig> 
     <bar>don't return pig - it has no att=bar </bar> 
    </pig> 
</pets> 

Ahora, sólo se preocupan por todo pets tener cualquier niño barque tiene un atributo con el valor attbaz. Puede utilizar la siguiente expresión XPath:

//pets/*[descendant::bar[@att='baz']] 

Resultado

<lizard> 
    <bar att="baz">lizard should be returned, because it has a child of bar</bar> 
</lizard> 
+0

¿Qué tal querer todas las mascotas que tengan elemento tiene un texto específico()? Parece que no puedo entender eso ... – jeremfg

Cuestiones relacionadas