如何在 XQuery 中填充地图?

How to populate a map in XQuery?

我在下面有一个XML文件link

我想用电影 ID 及其相应评分的平均值填充地图。我正在尝试从此 site

中执行以下命令
for $doc in db:open("movies","movies.xml")/movies/movie
let $map:= map:map()
let $key := map:put($map, $doc/@id, avg($doc/ratings/child::node()))
return $map 

然而,它没有 运行。我得到一个例外,Expecting variable declaration。我做错了什么?

编辑:

我正在尝试以下命令

let $map:=map{}
for $doc in db:open("movies","movies.xml")/movies/movie
return
map:put($map,  
  $doc/@id,avg($doc/ratings/child::node())
)

我得到单独的地图

如我的评论所述,MarkLogic 使用的映射语法与 XQuery 3.1 术语 map 无关。 MarkLogic 在官方 XQuery 规范定义它之前实现了这个映射结构(这个结构相当新)。因此,只有当您使用 MarkLogic 时,您才能使用 MarkLogic 文档中记录的地图,它是专有扩展。

另一方面,BaseX 支持 XQuery 3.1 构造 map。因此你应该遵循什么是documented at the BaseX documentation。这使得它实际上更短并且没有副作用。你可以例如做:

map:merge(for $movie in db:open("movies","movies.xml")/movies/movie return map:entry($movie/@id, avg($movie/ratings/child::node())))

您也可以使用 map:put,但对于此用例来说意义不大,因为每次调用 map:put() 函数时都会创建一个新地图。