我想迭代xquery中的一个序列,一次抓取2个元素。最简单的方法是什么?
答案 0 :(得分:2)
XQuery 3.0解决方案
对于这个和更复杂的分页用例,Window Clause已在XQuery 3.0中创建。但是,许多XQuery处理器还没有支持它。
窗口示例
以下是一个可以在try.zorba上执行的工作示例:
for tumbling window $pair in (2, 4, 6, 8, 10, 12, 14)
start at $s when fn:true()
end at $e when $e - $s eq 1
return <window>{ $pair }</window>
<强>结果强>
<window>2 4</window><window>6 8</window><window>10 12</window><window>14</window>
答案 1 :(得分:1)
一种选择是迭代所有物品,只需在物品到达除数后取出物品,在这种情况下为2.一个缺点是,如果物品不均匀,您将无法到达最后一组物品除数的倍数。例如,使用这种方法不会返回具有奇数个元素的序列的最后一个元素。
for $item at $index in $items
return
if ($item mod 2 = 0) then
($items[$index - 1], $items[$index])
else
()
另一种选择是使用mod和项目的索引。使用这种方法,您可以确保在$ items序列中包含所有元素,方法是将小于组中项目数的一个元素添加到计数中。
let $group-size := 2
return
for $index in (1 to fn:count($items)+($group-size - 1))[. mod $group-size = 0]
return
($items[$index - 1] , $items[$index])
答案 2 :(得分:0)
for $item at $index in $items
return
(
if ($index mod 2 eq 0) then
(
$items[xs:integer(xs:integer($index) - 1)], $items[xs:integer($index)]
)
else
()
)
答案 3 :(得分:0)
let $s := ("a","b","c","d","e","f")
for $i in 1 to xs:integer(count($s) div 2)
return
<pair>
{($s[$i*2 - 1],$s[$i*2])}
</pair>
返回
<pair>a b</pair>
<pair>c d</pair>
<pair>e f</pair>