Есть ли способ группировки записей по диапазону позиций при вводе? - PullRequest
0 голосов
/ 18 мая 2019

Есть ли способ сгруппировать ввод по диапазону позиции?В моем случае у меня есть функция, которая потребляет несколько строк.Мне нужно сгруппировать их по диапазону статических позиций (1-3, 4-6, 7-9 и т. Д.), А затем выполнить некоторый код для каждой из этой группы в цикле for.Я не знаю, сколько строк передается.Оно может меняться в зависимости от ввода.

Я пытался выполнить итерацию для $ x при $ i in ..., но не смог сделать это правильно

 declare function bs:concat-strings
   ( $multipleStringInput as item()+ )  {
     let $firstString := $multipleStringInput[position() = 1]
     let $secondString := $multipleStringInput[position() = 2]
     let $thirdString := $multipleStringInput[position() = 3]
     let $concat :=
                     concat(
                            $firstString, 
                            $secondString, 
                            $thirdString)
     return bs:next-function($concat)
  } ;

Так что моя цель - сгруппировать это множествоСтроки в переменные меньшего размера на 3, чтобы иметь возможность работать с ними отдельно и получить к ним, как указано выше, с константами [position () = 1], [position () = 2], [positon () = 3], затем объединить их и передатькаждая следующая функция ИЛИ как-то менять положение [1,2,3] -> [4,5,6] в каждой итерации.

например:

INPUT: 'Cat', 'лайки »,« рыба »,« собака »,« лайки »,« кости »

ВЫХОД: bs: next-function ('Catlikesfish') bs: next-function ('Doglikesbones')

1 Ответ

2 голосов
/ 18 мая 2019

Используйте предложение tumbling window https://www.w3.org/TR/xquery-31/#id-windows, например,

for tumbling window $window in ('Cat', 'likes', 'fish', 'Dog', 'likes', 'bones')
start at $s when $s mod 3 = 1
return
  string-join($window)

Чтобы вызвать вашу функцию для каждого элемента, используйте оператор карты !:

(for tumbling window $window in ('Cat', 'likes', 'fish', 'Dog', 'likes', 'bones')
start at $s when $s mod 3 = 1
return
  string-join($window)
  )
  ! bs:next-function(.)
...