对于Stackoverflow问题/答案中的一小部分,我发现像//div[.='hello']
这样的xpath。有人可以解释.
在表达式中的确切角色以及何时使用它吗?
答案 0 :(得分:1)
表达式
//div[. = 'hello']
将找到字符串值为" hello"的所有div元素。元素的字符串值被定义为所有元素的后代文本节点的串联,因此以下所有元素都匹配:
<div>hello</div>
<div>hel<i>lo</i></div>
<div>h<i>el</i>lo</div>
text()
不同 - 它是一个位置路径步骤,它提取当前上下文节点的所有文本节点子节点的集合。所以
//div[text() = 'hello']
找到至少有一个文本节点子元素的div元素,其值为&#34; hello&#34; (记住节点集上的=
有一个隐含的存在量词) - 这将匹配上面的第一个例子而不是第二个或第三个例子,并且还匹配像
<div>foo bar baz<br/>hello</div>
因为一个文本节点的子节点是&#34;你好&#34;。
如果要将函数应用于路径表达式返回的值,它会变得更加毛茸茸,例如考虑
<div>
<!-- some comment -->
hello
</div>
表达式//div[contains(., 'hello')]
会找到此元素,但//div[contains(text(), 'hello')]
不会!此示例中的div有两个文本节点子节点(一个包含注释前的换行符和空格,另一个包含&#34; hello&#34;及其周围的空格),因此XPath 2.0将引发类型错误,因为你&#39 ;我给它一个两个项目的序列,它期望一个字符串。但XPath 1.0将接受表达式,并通过静默忽略集合中除第一个节点之外的所有节点将双节点集转换为字符串,从而无法匹配。
我很少需要在样式表中使用text()
,除非我正在编写一个关于逐个处理单个文本节点的模板 - 在谓词中它几乎总是{{1而不是你真正想要的.
。
答案 1 :(得分:0)
我可以找到它,它会在节点中查找与文本匹配的元素。
对于HTML代码段:
<a ui-sref="main.home" href="#/home" class="">Home</a>
如果我使用以下xpath,它会搜索带有文本Home
//a[.='Home']
但它看起来与//a[text()='Home']
如果有人知道//a[.='Home']
与//a[text()='Home']
的区别/优于{{1}},请解释。
答案 2 :(得分:-1)
1)如果XPATH包含
./
等效于当前节点。
例如://tbody[@id='tableID']/tr[./td[3][text()='Sample']]
----位于tbody
下,ID为&#39; tableID&#39;,tr
td
,文字为Sample
2)//div[.='hello']
相当于//div[text()='hello']
例如://button[contains(.,'Apply changes')]
----带文字的按钮包含&#34;应用更改&#34;