Jonas Ricke
Jonas Ricke

Reputation: 51

product of a sequence in XQuery

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

Answers (1)

Martin Honnen
Martin Honnen

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

Related Questions