你能帮我找一下下面例子中包含子元素c的所有元素吗?
<a>
<b name = "b1"></b>
<b name = "b2"><c/></b>
<b name = "b3"></b>
</a>
xpath查询必须返回b2元素
第二个问题是 我想结合两个条件:我想得到名称=“b2”并具有元素c的元素 但是这种语法似乎不起作用: // b [@ name ='b2'和c]
答案 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
。