如何在xquery中迭代两个序列?

时间:2010-03-24 17:51:25

标签: xquery

我想迭代xquery中的一个序列,一次抓取2个元素。最简单的方法是什么?

4 个答案:

答案 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>