XPath 方括号运算符产生意外结果

问题描述 投票:0回答:1

考虑这个 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

我不明白的是为什么测试 #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 xslt
1个回答
0
投票

[1]
指示相对于上下文节点的位置,因此
/foo/descendant::bar[1]
将返回预期结果,因为
descendant
ax 生成节点集(与
(//bar)[1]
相同)。

//bar[1]
返回两者,因为它们具有与 wich 不同的上下文节点来建立位置。换句话说,两者的上下文都有position()=1。

© www.soinside.com 2019 - 2024. All rights reserved.