请问能否帮助我找到在下面示例中具有子元素 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文档使用以下XPath表达式:
/*/b[c]
这个选择器选择了XML文档顶层元素的任何一个子元素b
,并且该元素具有名为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>
当应用此转换到提供的 XML 文档时:
<a>
<b name = "b1"></b>
<b name = "b2"><c/></b>
<b name = "b3"></b>
</a>
评估XPath表达式并将正确选择的元素复制到输出中:
<b name="b2">
<c/>
</b>
//some-element-deep-within-the-dom
会搜索 每个 //some-element-deep-within-the-dom
,但如果 //some-element-deep-within-the-dom
被移动到 DOM 中的其他位置,使用它是否更灵活、更不容易破坏脚本呢? - oldboy/
、/*
、//*[not(*)]
等。 - Dimitre Novatchev这应该很简单
//b[c]
即在任何地方查找一个具有c
子元素的b
。
//b[@name='b2' and c]
选择了a
的第二个子节点--正如它应该做的那样。 - Dimitre Novatchev