Can XPath return only nodes that have a child of X

2020-02-08 07:19发布

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'.

标签: xml xslt xpath
3条回答
劳资没心,怎么记你
2楼-- · 2020-02-08 07:35

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>
查看更多
等我变得足够好
3楼-- · 2020-02-08 07:42

Here it is, in all its glory

/pets/*[bar]

English: Give me all children of pets that have a child bar

查看更多
淡お忘
4楼-- · 2020-02-08 07:47
/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]
查看更多
登录 后发表回答