如何在XQuery中填充地图?

时间:2015-11-06 09:11:46

标签: xquery basex

我在以下link

中有一个XML文件

我想填充一张带有电影ID和相应评级平均值的地图。我正在尝试使用此site

中的以下命令
select * from mytable where contains(*,'trying') -- match
select * from mytable where contains(*,'trying and out') -- no match
select * from mytable where contains(*,'trying and your') -- no match
select * from mytable where contains(*,'trying and system') -- match

然而,它没有运行。我得到一个例外,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

我得到了单独的地图

1 个答案:

答案 0 :(得分:2)

正如我的评论中所述,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()函数时都会创建新地图。