XPath find all elements with specific child node

XmlXpath

Xml Problem Overview


Could you please help me to find all the elements b which have the child element c in the example below?

<a>
	<b name = "b1"></b>
	<b name = "b2"><c/></b>
	<b name = "b3"></b>
</a>

The xpath query must return the b2 element

The second question is I want to combine 2 conditions: I want to get the element which have name = "b2" and has the element c But this syntax seems not to work: //b[@name='b2' and c]

Xml Solutions


Solution 1 - Xml

Whenever the structure of the XML document is known, it is better to avoid using the // XPath pseudo-operator, as its use can result in big inefficiency (traversal of the whole document tree).

Therefore, I recomment this XPath expression for the provided XML document:

/*/b[c]

This selects any b element that is a child of the top element of the XML document and that has a child-element named c.

UPDATE: The OP asked a second question just minutes ago:

> The second question is I want to combine 2 conditions: I want to get > the element which have name = "b2" and has the element c But this > syntax seems not to work: //b[@name='b2' and c]

The provided XPath expression does select exactly the wanted element.

Here is XSLT - based verification:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>
	
 <xsl:template match="/*">
	 <xsl:copy-of select="//b[@name='b2' and c]"/>
 </xsl:template>
</xsl:stylesheet>

When this transformation is applied on the provided XML document:

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>

the XPath expression is evaluated and the correctly-selected element is copied to the output:

<b name="b2">
   <c/>
</b>

Solution 2 - Xml

It should be as simple as

//b[c]

i.e. find a b anywhere that has a c child.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionnamView Question on Stackoverflow
Solution 1 - XmlDimitre NovatchevView Answer on Stackoverflow
Solution 2 - XmlchorobaView Answer on Stackoverflow