let $a := <product>
<p1>100</p1>
<p2>100</p2>
<p3/>
</product>
for $i in $a
return $i/p1 + $i/p2 + $i/p3
为什么在我希望显示总和时,我会在此处获得无效的词汇值?
答案 0 :(得分:2)
您的上一行return $i/p1 + $i/p2 + $i/p3
评估为return xs:double($i/p1) + xs:double($i/p2) + xs:double($i/p3)
。这适用于p1
和p2
,但不适用于p3
:
xs:double($i/p3) = xs:double(<p3/>)
= xs:double(xs:untypedAtomic('')) (: atomization :)
= xs:double('')
由于+
返回空序列()
,如果其中一个参数是空序列,那么您的方法无论如何都不会有效。您可以使用fn:sum($sequence)
,对元素内的文本节点求和:
let $a :=
<product>
<p1>100</p1>
<p2>100</p2>
<p3/>
</product>
for $i in $a
return sum(($i/p1/text(), $i/p2/text(), $i/p3/text()))
最后一行甚至可以缩短为:
return sum($i/(p1, p2, p3)/text())