Xquery 如何使用sum()将空值处理为0?

Xquery 如何使用sum()将空值处理为0?,xquery,Xquery,在XQuery中,我希望对不为null的值求和(实际上将null计为0)。我试过下列方法,但没有成功 sum(data(//Line/Total)) 我得到这个错误 无法将非类型数据组:强制转换为双精度 如何一步到位 sum(data(//Line[Total !='']/Total)) 示例XML: <Order> <Line> <Total>1</Total> </Line> <

在XQuery中,我希望对不为null的值求和(实际上将null计为0)。我试过下列方法,但没有成功

sum(data(//Line/Total))
我得到这个错误

无法将非类型数据组:强制转换为双精度

如何一步到位

sum(data(//Line[Total !='']/Total))
示例XML:

<Order>
    <Line>
          <Total>1</Total>
    </Line>
    <Line>
      <Total>1</Total>
    </Line>
    <Line>
      <Total></Total>
    </Line>
</Order>

1.
1.

使用谓词确保在
sum()
中只包含可作为
number()计算的值。确保
number()
值等于它的
number()
值,因为
NaN
将不等于
NaN

sum(/Order/Line/Total[number() = number()]) 
或者确保该值可以按
xs:double

sum(/Order/Line/Total[. castable as xs:double])
空值(如果没有通过XML模式更具体地定义)没有附加特定类型,因此是非常通用的类型
untypedAtomic
。因此,无法派生任何类型——这就是为什么您会收到错误消息,无法对其进行强制转换

您必须以某种方式排除这些空值@Mads Hansen建议对那些可以转换为
xs:double
的元素进行过滤,这是一个非常优雅的解决方案,我会支持。要仅删除空值,还可以测试未存储任何数据的元素:

sum(/Order/Line/Total[data()])

但是请注意,元素中包含无法解析为数字的字符串、未删除的空白等。

在这种情况下,使用文本节点而不是元素可能比较方便:
sum(/Order/Line/Total/text())

第一个建议不正确。请注意,
number()。“不过,我喜欢你的第三个建议。”詹瑟拉特说得对。谢谢你发现了。使用示例数据进行快速验证已经奏效,但恰好产生了所需的输出。要筛选出空项和仅空白项,可以使用
sum(/Order/Line/Total[normalize space(.)])
上下文项始终是单个项,因此空项(.)始终为false。确实如此。那太晚了。将答案更改为更合理的答案,实际查看元素。