Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2227113
  • 博文数量: 287
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2130
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-31 14:30
个人简介

自己慢慢积累。

文章分类

全部博文(287)

分类: Python/Ruby

2018-07-26 10:52:46

转自:https://blog.csdn.net/weixin_39285616/article/details/78463091

weixin_39285616的博客

XPath中的text()和string()区别

摘要: 在XPath中,经常使用text()和string(),而我一般都是想到哪个用哪个,究竟他们之间有什么不同,没有在意过。

本质区别

text()是一个node test,而string()是一个函数,data()是一个函数且可以保留数据类型。此外,还有点号(.)表示当前节点。

使用要点

XML例子: 
Tom John

用例 举例
text() book/author/text()
string() book/author/string()
data() book/author/data()
. book/author/.

特殊用例

XML例子:

		
  1. <book>
  2. <author>Tom <em>Johnem> catauthor>
  3. <pricing>
  4. <price>20price>
  5. <discount>0.8discount>
  6. pricing>
  7. book>

text()

经常在XPath表达式的最后看到text(),它仅仅返回所指元素的文本内容。

		
  1. let $x := book/author/text()
  2. return $x

返回的结果是Tom cat,其中的John不属于author直接的节点内容。

string()

string()函数会得到所指元素的所有节点文本内容,这些文本讲会被拼接成一个字符串。

		
  1. let $x := book/author/string()
  2. return $x

返回的内容是”Tom John cat”

data()

大多数时候,data()函数和string()函数通用,而且不建议经常使用data()函数,有数据表明,该函数会影响XPath的性能。

		
  1. let $x := book/pricing/string()
  2. return $x

返回的是200.8

		
  1. let $x := book/pricing/data()
  2. return $x

这样将返回分开的20和0.8,他们的类型并不是字符串而是xs:anyAtomicType,于是就可以使用数学函数做一定操作。

		
  1. let $x := book/pricing/price/data()
  2. let $y := book/pricing/discount/data()
  3. return $x*$y

比如上面这个例子,就只能使用data(),不能使用text()或 string(),因为XPath不支持字符串做数学运算。

总结

text()不是函数,XML结构的细微变化,可能会使得结果与预期不符,应该尽量少用,data()作为特殊用途的函数,可能会出现性能问题,如无特殊需要尽量不用,string()函数可以满足大部分的需求。

阅读(1673) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~