Xquery 如何使用sum()将空值处理为0?
在XQuery中,我希望对不为null的值求和(实际上将null计为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> <
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。确实如此。那太晚了。将答案更改为更合理的答案,实际查看元素。