xml - herramienta - ¿XPath puede devolver solo los nodos que tienen un hijo de X?
xpath wildcard (3)
Aquí está, en todo su esplendor
/pets/*[bar]
Inglés: Dame todos los hijos de pets
que tengan un bar
niños
¿Es posible usar XPath para seleccionar solo los nodos que tienen un elemento hijo particular? Por ejemplo, de este XML solo quiero los elementos en mascotas que tienen un hijo de ''barra''. Por lo tanto, el conjunto de datos resultante contendría los elementos de lizard
y pig
de este ejemplo:
<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 solo quiero las mascotas que tienen un nodo hijo con el nombre ''bar''
.
En caso de que quisiera ser más específico sobre los niños, también puede usar 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, solo te importa que todas las pets
tengan cualquier bar
niños que tenga un atributo att
con valor baz
. Puede usar 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>
/pets/child::*[child::bar]
Perdón, no vi los comentarios a la respuesta anterior.
Pero en este caso prefiero usar el eje descendant::
, que incluye todos los elementos de abajo especificados:
/pets[descendant::bar]