首页 > 解决方案 > 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 循环会创建另一个数组并将其附加到现有数组中。我该如何避免呢?

标签: xquery

解决方案


我认为以下应该做到这一点:

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

array{}在我看来,这是一种特殊用途的语法,而不仅仅是一个函数,这有点不幸。

你也可以这样做

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

推荐阅读