我不明白如何在Xquery中动态创建 map数组,最后应序列化为JSON:
我可以像这样创建一个简单/静态的 map数组
let $array := [map{"id": "4711"}, map{"id": "4712"}]
我可以添加另一张这样的 map:
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循环会创建另一个数组,并将其追加到现有数组中。我该如何避免呢?
我认为以下应该这样做:
let $mylist := ("4714", "4715")
return array{ $mylist ! map{'id': .} }
在我看来,使用array{}
特殊语法而不只是一个函数有点遗憾。
你也可以使用
array:join( $mylist ! [map{'id': .}] )
感谢您的建议!不幸的是,两个解决方案均返回错误消息:exerr:ERROR org.exist.xquery.XPathException:err:XPST0003期望冒号,发现为“,”
将逗号更改为冒号后,如下所示:
return array{ $mylist ! map{'id': .} }
错误消息消失了,但是没有返回任何值修正错字后,它对我有用。你好吗?
我有一个eXist-db,使用Oxygen Editor创建了一个xquery文件并为其定义了转换方案(转换程序是exist-db)。
好的,现在就开始运行吧!不能说为什么一开始它不起作用,但是非常感谢您的帮助!