摘要: 在XPath中,經常使用text()和string(),而我一般都是想到哪個用哪個,究竟他們之間有什么不同,沒有在意過。
本質區別
text()是一個node test,而string()是一個函數,data()是一個函數且可以保留數據類型。此外,還有點號(.)表示當前節點。
使用要點
XML例子: <book><author>Tom John</author></book>
用例 | 舉例 |
---|---|
text() | book/author/text() |
string() | book/author/string() |
data() | book/author/data() |
. | book/author/. |
特殊用例
XML例子:
-
<book>
-
<author>Tom <em>John</em> cat</author>
-
<pricing>
-
<price>20</price>
-
<discount>0.8</discount>
-
</pricing>
-
</book>
text()
經常在XPath表達式的最后看到text(),它僅僅返回所指元素的文本內容。
-
let $x := book/author/text()
-
return $x
返回的結果是Tom cat,其中的John不屬於author
直接的節點內容。
string()
string()函數會得到所指元素的所有節點文本內容,這些文本講會被拼接成一個字符串。
-
let $x := book/author/string()
-
return $x
返回的內容是”Tom John cat”
data()
大多數時候,data()函數和string()函數通用,而且不建議經常使用data()函數,有數據表明,該函數會影響XPath的性能。
-
let $x := book/pricing/string()
-
return $x
返回的是200.8
-
let $x := book/pricing/data()
-
return $x
這樣將返回分開的20和0.8,他們的類型並不是字符串而是xs:anyAtomicType,於是就可以使用數學函數做一定操作。
-
let $x := book/pricing/price/data()
-
let $y := book/pricing/discount/data()
-
return $x*$y
比如上面這個例子,就只能使用data(),不能使用text()或 string(),因為XPath不支持字符串做數學運算。
總結
text()不是函數,XML結構的細微變化,可能會使得結果與預期不符,應該盡量少用,data()作為特殊用途的函數,可能會出現性能問題,如無特殊需要盡量不用,string()函數可以滿足大部分的需求。