Если вас устраивает сторона функционального программирования в XQuery, вы можете создать весь вывод в виде двух вложенных «циклов» (т. Е. fold
s ), один поверх клавиш, а другойнад значениями, которые являются массивами:
(: the input :)
let $input := map { 'a-key': 'a-value', 'b-key': ['b-value-1', 'b-value-2'] }
(: utility function that adds a single key/value pair to the output array :)
let $update-arr :=
function($arr, $k, $v) {
array:append(array:put($arr, 1, ($arr(1), $k)), $v)
}
(: nested folds over keys and values :)
return fold-left(map:keys($input), [()], function($arr, $key) {
let $k := substring-before($key, '-key')
let $val := $input($key)
return typeswitch($val)
case array(*)
return array:fold-left($val, $arr, function($arr2, $v) {
$update-arr($arr2, $k, $v)
})
default
return $update-arr($arr, $k, $val)
})
Вы можете даже сокращать регистр array(*)
как return array:fold-left($val, $arr, $update-arr(?, $k, ?))
, если хотите.
Результат - [("a", "b", "b"), "a-value", "b-value-1", "b-value-2"]
, как и ожидалось.