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

当我希望显示总和时,为什么我会在这里得到无效的词法值?

4

1 回答 1

2

您的最后一行return $i/p1 + $i/p2 + $i/p3被评估为return xs:double($i/p1) + xs:double($i/p2) + xs:double($i/p3). 这适用于p1and 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())
于 2013-06-17T13:02:01.693 回答