let $a := <product>
<p1>100</p1>
<p2>100</p2>
<p3/>
</product>
for $i in $a
return $i/p1 + $i/p2 + $i/p3
当我希望显示总和时,为什么我会在这里得到无效的词法值?
let $a := <product>
<p1>100</p1>
<p2>100</p2>
<p3/>
</product>
for $i in $a
return $i/p1 + $i/p2 + $i/p3
当我希望显示总和时,为什么我会在这里得到无效的词法值?
您的最后一行return $i/p1 + $i/p2 + $i/p3
被评估为return xs:double($i/p1) + xs:double($i/p2) + xs:double($i/p3)
. 这适用于p1
and 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())