Xpath,为什么两者都匹配?
Xpath, why does it matches both?
<root>
<a>
<b>
<ba>
<baa>RM</baa>
<bab>*DB:ZA:4</bab>
</ba>
</b>
<c>
<ca>M</ca>
<cb>1</cb>
</c>
</a>
<a>
<b>
<ba>
<baa>RM</baa>
<bab>*DB:ZA:4</bab>
</ba>
</b>
<c>
<ca>S</ca>
<cb>1</cb>
</c>
</a>
</root>
以及以下 xPath:
//a[//bab/text() = '*DB:ZA:4' and //ca/text() = 'S']
这 returns 两个 'a' 节点。但我只想要 ca='S'
我可以通过使用 .//ca/text() = 'S'
来实现。但我不知道为什么。有人可以解释吗?
xpath 是否丢失了 'and' 之后的上下文?
我使用了这个 XPath-Tester:http://videlibri.sourceforge.net/cgi-bin/xidelcgi
//ca/text() = 'S'
从文档的根部开始,因此它总是 select 一个内容为 'S' 的文本节点,无论哪个 a
元素是上下文.
改用.//ca/text()
,因为这会在当前节点的上下文中搜索。
//
将 return 元素放置在文档中的任何位置,从根开始。 .//
将相对于当前节点进行搜索。这可能会产生误导,因为您可能认为在 a[] 中使用它已经是相对的了。绝对表达式 /
和 ./
也是一样。
因为像 element[//anotherElement]
- returns element
这样的定位器,但确保存在某个地方 anotherElement
。
和定位器 element[.//anotherElement]
- returns 元素 element
有后代 anotherElement
.
在这种情况下,添加点会将搜索从绝对路径更改为相对路径。
<root>
<a>
<b>
<ba>
<baa>RM</baa>
<bab>*DB:ZA:4</bab>
</ba>
</b>
<c>
<ca>M</ca>
<cb>1</cb>
</c>
</a>
<a>
<b>
<ba>
<baa>RM</baa>
<bab>*DB:ZA:4</bab>
</ba>
</b>
<c>
<ca>S</ca>
<cb>1</cb>
</c>
</a>
</root>
以及以下 xPath:
//a[//bab/text() = '*DB:ZA:4' and //ca/text() = 'S']
这 returns 两个 'a' 节点。但我只想要 ca='S'
我可以通过使用 .//ca/text() = 'S'
来实现。但我不知道为什么。有人可以解释吗?
xpath 是否丢失了 'and' 之后的上下文?
我使用了这个 XPath-Tester:http://videlibri.sourceforge.net/cgi-bin/xidelcgi
//ca/text() = 'S'
从文档的根部开始,因此它总是 select 一个内容为 'S' 的文本节点,无论哪个 a
元素是上下文.
改用.//ca/text()
,因为这会在当前节点的上下文中搜索。
//
将 return 元素放置在文档中的任何位置,从根开始。 .//
将相对于当前节点进行搜索。这可能会产生误导,因为您可能认为在 a[] 中使用它已经是相对的了。绝对表达式 /
和 ./
也是一样。
因为像 element[//anotherElement]
- returns element
这样的定位器,但确保存在某个地方 anotherElement
。
和定位器 element[.//anotherElement]
- returns 元素 element
有后代 anotherElement
.
在这种情况下,添加点会将搜索从绝对路径更改为相对路径。