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

nam*_*nam 44 xml xpath

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

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>
Run Code Online (Sandbox Code Playgroud)

xpath查询必须返回b2元素

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

Dim*_*hev 54

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

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

/*/b[c]
Run Code Online (Sandbox Code Playgroud)

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

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

第二个问题是我想要结合两个条件:我想得到名称="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>
Run Code Online (Sandbox Code Playgroud)

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

<a>
    <b name = "b1"></b>
    <b name = "b2"><c/></b>
    <b name = "b3"></b>
</a>
Run Code Online (Sandbox Code Playgroud)

计算XPath表达式并将正确选择的元素复制到输出:

<b name="b2">
   <c/>
</b>
Run Code Online (Sandbox Code Playgroud)


cho*_*oba 21

它应该如此简单

//b[c]
Run Code Online (Sandbox Code Playgroud)

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