【问题标题】:What is the difference between normalize-space(.) and normalize-space(text())?normalize-space(.) 和 normalize-space(text()) 有什么区别?
【发布时间】:2011-05-13 12:57:57
【问题描述】:

我正在编写一个 XPath 表达式,但我修复了一个奇怪的错误,但是以下两个 XPath 表达式有什么区别?

"//td[starts-with(normalize-space()),'Posted Date:')]"

和

"//td[starts-with(normalize-space(text()),'Posted Date:')]"  

主要是,第一个 XPath 表达式会捕获什么?因为我得到了很多奇怪的结果。那么text() 在匹配中做了什么?另外,如果我说normalize-space()和normalize-space(.)有区别吗?

【问题讨论】:

  • 来自我自己的测试normalize-space()和normalize-space(.)有同样的效果。

标签: xpath


【解决方案1】:

好吧,真正的问题是:. 和 text() 之间有什么区别?

. 是当前节点。如果你在需要字符串的地方使用它(即作为normalize-space()的参数),引擎会自动将节点转换为节点的字符串值,对于一个元素来说,它是连接元素内的所有文本节点。 (因为我猜这个问题实际上是关于元素的。)

text() 另一方面,只选择作为当前节点的直接子节点的文本节点。

例如,给定 XML:

<a>Foo
    <b>Bar</b>
  lish
</a>

并假设&lt;a&gt; 是您的当前节点,normalize-space(.) 将返回Foo Bar lish,但normalize-space(text()) 将失败,因为text() 返回两个文本节点(Foo 和lish)的节点集, normalize-space() 不接受。

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

【讨论】:

  • 其实normalize-space(text())会返回一个空字符串,因为它取的是根目录下的文本。 normalize-space(//text()) 将返回 Foo,因为它通过获取第一个节点并将其转换为字符串并在其上运行 normalize-space 来转换您的 NodeSet。
  • @Matthijs Bierman 你试过了吗?我有,它的工作原理和我说的完全一样。 (在 Xpath 2.0 中,我将添加并假设上下文节点是 &lt;a&gt; 元素。)
  • 试试 text()[normalize-space()]
  • @MatthijsBierman 你在哪里试过?哪个网站?我在问,以便我们可以亲自尝试以更好地理解。
  • 我最终得到了类似 normalize-space(s:td[2]/s:a[1]/text()[1]) 的东西,这就像一个魅力
猜你喜欢
  • 1970-01-01
  • 2016-06-11
  • 2019-04-13
  • 1970-01-01
  • 2010-12-22
  • 2013-03-23
  • 2017-05-21
  • 2019-08-26
  • 1970-01-01
相关资源
最近更新 更多