我有以下功能
declare private function local:get-map() as map:map*
{
let $map := map:map()
for $chart in xdmp:directory("/charts/")
for $panel in $chart/delphi:chart/delphi:panels/delphi:panel
for $dataline in $panel/delphi:datalines/delphi:dataline
let $datasetHref := $dataline/delphi:link[@rel="dataset"]/@href
let $axisId := $dataline/delphi:dimensions/delphi:dimension[@field="y"]/@axis
let $label := $panel/delphi:axes[@dimension="y"]/delphi:axis[@id=$axisId]/@label
let $l := map:get ($map, $datasetHref)
let $updateMap := if (fn:exists ($l)) then () else map:put ($map, $datasetHref, $label)
return $map
};
我被迫将返回类型声明为map:map*
,因为由于某种原因,$ map是一个地图数组而不是地图。该数组包含许多项目,其中每个项目包含我需要的相同地图。因此,当我调用此方法时,我使用第一项。问题是这不是很优雅。我不明白的是为什么我在阵列中获得同一地图的多个副本。我希望代码返回一个地图。我如何重写这个以解决问题?
答案 0 :(得分:5)
它返回一系列地图,因为每个" for" s的每次迭代都会返回它。试试这个:
declare private function local:get-map() as map:map
{
let $map := map:map()
let $populate :=
for $chart in xdmp:directory("/charts/")
for $panel in $chart/delphi:chart/delphi:panels/delphi:panel
for $dataline in $panel/delphi:datalines/delphi:dataline
let $datasetHref := $dataline/delphi:link[@rel="dataset"]/@href
let $axisId := $dataline/delphi:dimensions/delphi:dimension[@field="y"]/@axis
let $label := $panel/delphi:axes[@dimension="y"]/delphi:axis[@id=$axisId]/@label
let $l := map:get ($map, $datasetHref)
return if (fn:exists ($l)) then () else map:put ($map, $datasetHref, $label)
return $map
};
这是FLWOR语句在它自己的let中,然后返回映射。