Как перебрать последовательность в xquery по двое? - PullRequest
1 голос
/ 24 марта 2010

Я хочу перебрать последовательность в xquery и получить 2 элемента за раз. Какой самый простой способ сделать это?

Ответы [ 4 ]

2 голосов
/ 10 марта 2011

Решение XQuery 3.0

Для этого и более сложных вариантов использования подкачки * X5uery 3.0 было создано Window Clause . Но он еще не поддерживается многими процессорами 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 голос
/ 24 марта 2010

Один из вариантов - перебрать все предметы и просто взять предметы, как только предметы достигнут делителя, в данном случае 2. Единственный недостаток - вы не достигнете последней группы предметов, если предметы еще кратные делителя. Например, последний элемент последовательности с нечетным числом элементов не будет возвращен при таком подходе.

for $item at $index in $items
  return
  if ($item mod 2 = 0) then
    ($items[$index - 1], $items[$index])
  else
    ()

Другой вариант - использовать мод и индекс предмета. Используя этот подход, вы можете убедиться, что включили все элементы в последовательность $ 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])
0 голосов
/ 26 апреля 2010
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>
0 голосов
/ 01 апреля 2010
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
    ()
)
...