2011-05-13 84 views
17

我正在编写一个XPath表达式,而且我修复了一个奇怪的错误,但以下两个XPath表达式有什么区别?normalize-space(。)和normalize-space(text())之间的区别是什么?

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

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

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

+0

从我自己的测试'normalize-space()'和'normalize-space(。)'具有相同的效果。 – CJ7 2017-01-03 22:32:00

回答

36

那么,真正的问题是:.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(),但它返回的节点集只有在具有单个元素时才会自动转换为字符串。

+1

实际上'normalize-space(text())'会返回一个空字符串,因为它取得了根文本。 'normalize-space(// text())'将返回_Foo_,因为它通过获取第一个节点并将其转换为String并在其上运行'normalize-space'来转换NodeSet。 – 2011-08-25 14:41:30

+0

@Matthijs Bierman你试过了吗?我已经和我说的完全一样。 (在Xpath 2.0中,我将添加并假设上下文节点是''元素。) – biziclop 2011-08-25 14:55:21

+0

是的,我有(我不确定)。但我在XPath 1.0中尝试过。标准的JAXP,但与Xerces 2.11.0 :)。 – 2011-08-29 13:59:49