XQuery: создать массив карт

#xquery

#xquery

Вопрос:

Я не понимаю, как динамически создавать массив карт в Xquery, который в конце должен быть сериализован как JSON:

Я могу создать простой / статический массив карт следующим образом

 let $array := [map{"id": "4711"}, map{"id": "4712"}]
 

Я могу добавить еще одну карту, подобную этой:

 let $array := array:append($array, map {"id": "4713"})
 

используя следующее

 return 
 serialize($array, 
        <output:serialization-parameters>
            <output:method>json</output:method>
        </output:serialization-parameters>)
 

результаты, в [{"id":"4711"},{"id":"4712"},{"id":"4713"}] которых для меня идеальный JSON.

Но у меня есть произвольное количество карт для добавления в этот массив на основе последовательности, например:

 let $mylist := ("4714", "4715")
 

В результате я хотел бы получить следующее:

 [{"id":"4711"},{"id":"4712"},{"id":"4713"},{"id":"4714"},{"id":"475"}]
 

Я пытаюсь добиться этого с помощью:

 let $array := array:append($array, 
    for $n in $mylist
    return map {"id": $n}
)  
 

Но это возвращает результат:

 [{"id":"4711"},{"id":"4712"},{"id":"4713"},[{"id":"4714"},{"id":"4715"}]]
 

Итак, очевидно, что цикл for создает другой массив и добавляет его к существующему. Как мне этого избежать?

Ответ №1:

Я думаю, что это должно сделать следующее:

 let $mylist := ("4714", "4715")
return array{ $mylist ! map{'id': .} }
 

На мой взгляд, это немного неудачный array{} синтаксис специального назначения, а не просто функция.

Вы также можете сделать это с помощью

 array:join( $mylist ! [map{'id': .}] )
 

Комментарии:

1. спасибо за ваше предложение! К сожалению, оба решения возвращают сообщение об ошибке: exerr: ОШИБКА org.exist.xquery. XPathException: ошибка: XPST0003 ожидает двоеточие, найдено ‘,’

2. после замены запятой на двоеточие, вот так: return array{ $mylist ! map{'id': .} } сообщение об ошибке исчезло, но значения не возвращаются

3. После исправления опечатки это работает для меня. Как вы его запускаете?

4. У меня есть eXist-db, с помощью редактора Oxygen я создал файл xquery и определил для него сценарий преобразования (transformer — это exist-db).

5. хорошо, теперь он запущен! не могу сказать, почему это не сработало в первую очередь, но большое вам спасибо за вашу помощь!