#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. хорошо, теперь он запущен! не могу сказать, почему это не сработало в первую очередь, но большое вам спасибо за вашу помощь!