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

时间:2016-01-28 20:32:56

标签: xquery

在XQuery中,我想对非空值进行求和(实际上将null计为0)。我试过以下没有成功。

sum(data(//Line/Total))

我收到此错误

  

无法转换untypedAtomic:加倍

如何一步完成?

sum(data(//Line[Total !='']/Total))

示例XML:

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

3 个答案:

答案 0 :(得分:1)

使用谓词确保number()中仅包含可评估为sum()的值。确保number()值等于number()值,因为NaN不等于NaN

sum(/Order/Line/Total[number() = number()]) 

或确保该值可以转换为xs:double

sum(/Order/Line/Total[. castable as xs:double])

答案 1 :(得分:1)

空值(如果没有更具体地通过XML模式定义)没有附加特定类型,因此非常类型untypedAtomic。从这一点来看,不能派生出任何类型 - 这就是为什么你得到它无法生成的错误信息。

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

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

但请注意包含无法解析为数字的字符串的元素,未删除的空格,...

答案 2 :(得分:0)

这可能是使用文本节点而不是元素的情况:sum(/Order/Line/Total/text())