2011-05-13 79 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