XPath的sum()函数怎么计算节点集数值之和

4次阅读

XPath的sum()函数对节点集各节点字符串值转数字后求和,无法转换的节点通常被视作0;语法为sum(node-set),需注意XPath 1.0仅支持节点集、不支持字符串序列。

XPath的sum()函数怎么计算节点集数值之和

XPath 的 sum() 函数用于对节点集(node-set)中每个节点的字符串值转为数字后求和,只适用于能成功转为数值的节点;无法转换的节点(如纯文本“abc”)会被当作 0 处理。

sum() 的基本用法

语法:sum(node-set),其中 node-set 是一个节点集合(比如多个元素、属性或文本节点)。函数会依次取每个节点的字符串值(String()),再尝试转成数字(number()),最后加总。

  • 如果节点是元素,取其**合并后的文本内容**(即所有后代文本节点拼接,去首尾空格)
  • 如果节点是属性(如 @price),直接取其属性值字符串
  • 空字符串、非数字字符串(如 “hello”)转为数字后是 NaN,而 XPath 1.0 中 sum() 遇到 NaN 会返回 NaN;但实际多数解析器(如 libxml2、java XPath API)会把无法转换的项视作 0 —— 行为取决于处理器实现,建议提前过滤或确保数据干净

常见使用场景示例

假设有如下 XML:

   10   25.5   abc     

  • sum(/products/item/price) → 结果通常是 35.5(前两个有效,”abc” 和空格被当作 0)
  • sum(/products/item/price[number(.) = number(.)]) → 加个安全过滤:只对能成功转数字的 price 求和(XPath 1.0 中常用技巧,利用 number("abc") 是 NaN,而 NaN = NaN 为 false)
  • sum(/products/item/@discount) → 对所有 item 元素的 discount 属性值求和(需属性存在且为数字格式)

注意事项与避坑点

  • XPath 1.0 不支持 sum() 直接作用于字符串序列(如 sum(("1","2","3"))),必须是节点集;XPath 2.0+ 才支持序列,但多数浏览器和老系统仍用 1.0
  • 节点为空或仅含空白字符(如 )时,string() 返回空字符串,number("") 是 0
  • 如果想跳过非法值并只加合法数字,推荐先用 number() 判断:例如 sum(/products/item/price[number(.) > 0])(注意这会漏掉负数和零)

基本上就这些。用好 sum() 关键是理解它隐式调用 string() 和 number(),并结合数据质量做前置校验或过滤。

text=ZqhQzanResources