XPath查找具有特定子节点的所有元素

你能帮我find所有在下面的例子中具有子元素c的元素b吗?

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

xpath查询必须返回b2元素

第二个问题是我想结合两个条件:我想获得具有名称=“b2”的元素,并具有元素c但是这个语法似乎不工作:// b [@ name ='b2'and c]

每当知道XML文档的结构时,最好避免使用XPath伪操作符 ,因为它的使用会导致很大的低效率(遍历整个文档树)。

因此,我为所提供的XML文档推荐了这个XPathexpression式:

 /*/b[c] 

这将select任何b元素,它是XML文档顶部元素的子元素,并且具有名为c的子元素。

更新 :OP在几分钟前问了一个secons问题:

第二个问题是我想结合两个条件:我想获得具有名称=“b2”的元素,并具有元素c但是这个语法似乎不工作: //b[@name='b2' and c]

提供的XPathexpression式确实select了想要的元素。

这是基于XSLT的validation

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

在提供的XML文档上应用此转换时:

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

计算XPathexpression式,并将正确select的元素复制到输出中:

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

它应该如此简单

 //b[c] 

即find一个有孩子的地方。