我正在编写一个XPath表达式,但遇到一个我修复的奇怪错误,但是以下两个XPath表达式之间有什么区别?
"//td[starts-with(normalize-space()),'Posted Date:')]"
和
"//td[starts-with(normalize-space(text()),'Posted Date:')]"
主要,第一个XPath表达式将捕获什么?因为我得到了很多奇怪的结果。那么
text()
在匹配中有什么作用?另外,如果我说normalize-space()
和normalize-space(.)
会有区别吗? 最佳答案
好吧,真正的问题是:.
和text()
有什么区别?.
是当前节点。并且如果您在需要字符串的地方使用它(即作为normalize-space()
的参数),则引擎会自动将节点转换为该节点的字符串值,对于一个元素而言,该字符串值就是该元素内所有已链接的文本节点。 (因为我猜这个问题确实与元素有关。)
另一方面,text()
仅选择作为当前节点的直接子级的文本节点。
因此,例如给出XML:
<a>Foo
<b>Bar</b>
lish
</a>
并假设
<a>
是您的当前节点,normalize-space(.)
将返回Foo Bar lish
,但是normalize-space(text())
将失败,因为text()
返回了两个文本节点(Foo
和lish
)的节点集,normalize-space()
不接受。长话短说,如果要规范元素中的所有文本,请使用
.
。如果要选择特定的文本节点,请使用text()
,但请始终记住,尽管text()
具有名称,但它会返回一个节点集,如果该节点集只有一个元素,则该节点集将自动转换为字符串。关于xpath - normalize-space(.)和normalize-space(text())有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5992177/