Reputation: 51
i'm trying to get the product of a sequence in XQuery with this code
let $productNenner := 1
let $productNenner := sum(for$x in doc("bruch.xml")/product/fraction
return data($x/numerator) * $productNenner)
return $productNenner
Well, it doesn't work. Think it's because variables are immutable in xquery.. But how can i get the product? My XML Code ist looking like
<product>
<fraction>
<numerator>1</numerator>
<denominator>2</denominator>
</fraction>
<fraction>
<numerator>3</numerator>
<denominator>4</denominator>
</fraction>
<fraction>
<numerator>5</numerator>
<denominator>6</denominator>
</fraction>
</product>
I shall build the product of the diffrent fractions like 1/2 * 3/4 * 5/6. Hopefully there is someone that could help me. Thanks :)
Upvotes: 2
Views: 247
Reputation: 167516
Seems like a job for fold-left
(https://www.w3.org/TR/xpath-functions/#func-fold-left):
fold-left(/product/fraction, 1, function($a, $b) { $b/numerator div $b/denominator * $a })
Or implement it yourself:
declare function local:fold-product(
$seq as item()*,
$zero as item()*)
as item()* {
if (fn:empty($seq))
then $zero
else local:fold-product(tail($seq), head($seq)/numerator div head($seq)/denominator * $zero)
};
local:fold-product(/product/fraction, 1)
https://xqueryfiddle.liberty-development.net/3Nqn5Y6
Upvotes: 3