摘要:在XPath中,经常使用text()和string(),而我一般都是想到哪个用哪个,究竟他们之间有什么不同,没有在意过。
本质区别
text()是一个节点test,而string()是一个函数,data()是一个函数且可以保留数据类型。此外,还有点号(。)表示当前节点。
使用要点
XML例子: <book><author>Tom John</author></book>
用例 | 举例 |
---|---|
文本() | 书籍/作者/文() |
串() | 书籍/作者/串() |
数据() | 书籍/作者/数据() |
。 | 书籍/作者/。 |
特殊用例
XML例子:
-
<book>
-
<author>Tom <em>John</em> cat</author>
-
<pricing>
-
<price>20</price>
-
<discount>0.8</discount>
-
</pricing>
-
</book>
文本()
经常在的XPath表达式的最后看到文本(),它仅仅返回所指元素的文本内容。
-
let $x := book/author/text()
-
return $x
返回的结果是Tom cat,其中的John不属于直接author
的节点内容。
串()
串()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。
-
let $x := book/author/string()
-
return $x
返回的内容是“汤姆约翰猫”
数据()
大多数时候,数据()函数和串()函数通用,而且不建议经常使用的数据()函数,有数据表明,该函数会影响的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不支持字符串做数学运算。
总结
文本()不是函数,XML结构的细微变化,可能会使得结果与预期不符,应该尽量少用,数据()作为特殊用途的函数,可能会出现性能问题,如无特殊需要尽量不用,串()函数可以满足大部分的需求。