56

您能帮我找到下面示例中所有具有子元素 c 的元素 b 吗?

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

xpath 查询必须返回 b2 元素

第二个问题是我想结合 2 个条件:我想获取具有 name = "b2" 并且具有元素 c 的元素 但是这种语法似乎不起作用: //b[@name='b2' and c]

4

2 回答 2

66

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

因此,我为提供的 XML 文档推荐了这个 XPath 表达式:

/*/b[c]

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

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

第二个问题是我想结合 2 个条件:我想获取具有 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>
于 2012-06-04T12:42:24.497 回答
26

它应该像这样简单

//b[c]

即找到一个bc孩子的地方。

于 2012-06-04T12:30:02.047 回答