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
とp2
では機能しますが、 では機能しませんp3
:
xs:double($i/p3) = xs:double(<p3/>)
= xs:double(xs:untypedAtomic('')) (: atomization :)
= xs:double('')
+
引数の 1 つが空のシーケンスである場合、空のシーケンスを返すため、どちら()
の方法でも機能しませんでした。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())