我在以下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
我得到了单独的地图
答案 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()
函数时都会创建新地图。