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

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(),并结合数据质量做前置校验或过滤。










