Is it possible to use XPath to select only the nodes that have a particular child elements? For example, from this XML I only want the elements in pets that have a child of 'bar'. So the resulting dataset would contain the lizard
and pig
elements from this example:
<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>
This Xpath gives me all pets: "/pets/*"
, but I only want the pets that have a child node of name 'bar'
.
Here it is, in all its glory
/pets/*[bar]
English: Give me all children of pets
that have a child bar
/pets/child::*[child::bar]
My pardon, I did not see the comments to the previous reply.
But in this case I'd rather prefer using the descendant::
axis, which includes all elements down from specified:
/pets[descendant::bar]
Just in case you wanted to be more specific about the children - you can also use selectors on them.
Example:
<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>
Now, you only care about all pets
having any child bar
that has an attribute att
with value baz
. You can use the following xpath expression:
//pets/*[descendant::bar[@att='baz']]
Result
<lizard>
<bar att="baz">lizard should be returned, because it has a child of bar</bar>
</lizard>