我正在编写一个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()返回了两个文本节点(Foolish)的节点集,normalize-space()不接受。

长话短说,如果要规范元素中的所有文本,请使用.。如果要选择特定的文本节点,请使用text(),但请始终记住,尽管text()具有名称,但它会返回一个节点集,如果该节点集只有一个元素,则该节点集将自动转换为字符串。

关于xpath - normalize-space(.)和normalize-space(text())有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5992177/

10-12 22:17