The code below should (it's been edited) use map to create an element for A
B C D within the parent reviewData.

The call to local:getReview is expensive though, so to avoid calling it
twice I am returning a sequence as the content of the element constructor.

xquery version "3.0";

declare variable $coll:='/db/apps/spark/';

declare function local:getReviews($type as xs:string+) as element(review)* {
  $type ! collection($coll || .))/descendant::review
};

<stats date="{current-date()}">
  <reviewData>{('','A','B','C','D') !
              element {if (.) then . else 'total'}

{local:getReviews(.)/(count(.),count(distinct-values(thing/@link)))}</reviewData>}
 </stats>

What I would like to do is cache the result of calling local:getReviews so
that I am not pushed into returning a sequence just so as to avoid multiple
expensive calls to local:getReviews.

>From my reading of the spec you should be able to have  a FLOWR expression
on the right side of the map operator which if I could do it would give me

  <reviewData>{('','A','B','C','D') !  let $reviews:=local:getReviews(.)
              element {if (.) then . else 'total'}

{$reviews/(count(.),count(distinct-values($reviews/thing/@link)))}</reviewData>}

following which I would dress up the output in the way I want.

Trying to put the let where I did however gives me
unexpected token: $ (while expecting closing tag for element construct

hence I am not sure whether my reading of the spec is wrong or whether it's
an implementation issue (this happened on eXist) or a general screw up due
to my rusty XQuery
_______________________________________________
[email protected]
http://x-query.com/mailman/listinfo/talk

Reply via email to