在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>
答案 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())
。