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

时间:2012-06-04 12:20:12

标签: xml xpath

你能帮我找一下下面例子中包含子元素c的所有元素吗?

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

xpath查询必须返回b2元素

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

2 个答案:

答案 0 :(得分:50)

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

因此,我推荐使用提供的XML文档的XPath表达式:

/*/b[c]

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

更新:OP在几分钟前问了第二个问题:

  

第二个问题是我想要结合两个条件:我想得到   name =“b2”且具有元素c的元素但是这个   语法似乎不起作用://b[@name='b2' and c]

提供的XPath表达式确实精确选择了想要的元素。

以下是基于XSLT的验证

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

评估XPath表达式并将正确选择的元素复制到输出中:

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

答案 1 :(得分:20)

应该像

一样简单
//b[c]

即。在任何有b孩子的地方找到c