如何在添加空节点时避免“无效的词汇值”

时间:2013-06-17 12:09:20

标签: xquery

let $a := <product>
<p1>100</p1>
<p2>100</p2>
<p3/>
</product>
for $i in $a 
return $i/p1 + $i/p2 + $i/p3

为什么在我希望显示总和时,我会在此处获得无效的词汇值?

1 个答案:

答案 0 :(得分:2)

您的上一行return $i/p1 + $i/p2 + $i/p3评估为return xs:double($i/p1) + xs:double($i/p2) + xs:double($i/p3)。这适用于p1p2,但不适用于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())