Updating counter in XQuery

marklogic, xquery

Solution

Try using 'at':

for $d at $p in $collection
return 
element counter { $p }

This will give you the position of each '$d'. If you want to use this together with the `order by` clause, this won't work since the position is based on the initial order, not on the sort result. To overcome this, just save the sorted result of the FLWOR expression in a variable, and use the `at` clause in a second FLWOR that just iterates over the first, sorted result.

let $sortResult := for $item in $collection
                   order by $item/id
                   return $item

for $sortItem at $position in $sortResult
return <item position="{$position}"> ... </item>

Problem

I want to create a counter in xquery. My initial attempt looked like the following: ``` let $count := 0 for $prod in $collection let $count := $count + 1 return <counter>{$count }</counter> ``` Expected result: ``` <counter>1</counter> <counter>2</counter> <counter>3</counter> ``` Actual result: ``` <counter>1</counter> <counter>1</counter> <counter>1</counter> ``` The `$count` variable either failing to update or being reset. Why can't I reassign an existing variable? What would be a better way to get the desired result?

Original source