考虑这个 XML 文档:
<foo>
<bar id="aaa"/>
<jam>
<bar id="bbb"/>
</jam>
</foo>
我试图找到<bar>
文档中的第一个元素。
这是我发现的:
测试# | XPath 表达式 | 评价表达式 | 结果 |
---|---|---|---|
1 | //bar |
@id |
aaa ,bbb |
2 | //bar[1] |
@id |
aaa ,bbb |
3 | (//bar)[1] |
@id |
aaa |
我不明白的是为什么 Test #2 返回aaa
,bbb
而不是仅仅aaa
. 就好像[1]
操作员不工作一样。
我的理解是,在测试 #2 中,//bar
表达式将找到两个节点,然后[1]
运算符将选择第一个节点。显然,我错过了一些东西。
测试 #3 似乎证实了这一点,这显然是如何表达我真正想要的。
另外,如果将 XML 文档更改为:
<foo>
<bar id="aaa"/>
<bar id="bbb"/>
</foo>
然后你就得到了我期望看到的:
测试# | XPath 表达式 | 评价表达式 | 结果 |
---|---|---|---|
1 | //bar |
@id |
aaa ,bbb |
2 | //bar[1] |
@id |
aaa |
3 | (//bar)[1] |
@id |
aaa |
[1]
关于应该如何工作,我在这里错过了什么微妙之处?
XPath 规范包含有关
//
缩写语法的注释:IOW,如果您想选择
bar
文档中的第一个元素,您需要使用:代替:
与其他答案不同,我并不认为这是有道理的。
在 中
//bar[1]
,谓词[1]
附加到步骤child::bar
并在该步骤的上下文中进行评估。因此,谓词询问所讨论的节点是否是其父节点的第一个子节点,而不是它是否是 所选择的所有节点中的第一个//bar
。后者就是这个(//bar)[1]
意思。