declare function local:sieve($primes as xs:integer*,$nums as xs:integer* ) as xs:integer* { let $prime := $nums[1] return if ($prime * $prime gt $nums[last()]) then ($primes,$nums) else local:sieve(($primes,$prime), $nums[. mod $prime != 0]) }; let $N := 1000 return <primes> { local:sieve((),2 to $N) } </primes>