Sac*_*nth 1 xpath xquery marklogic
我有以下功能
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
};
Run Code Online (Sandbox Code Playgroud)
我被迫声明返回类型,map:map*
因为由于某种原因,$ map是一个地图数组而不是地图.该数组包含许多项目,其中每个项目包含我需要的相同地图.因此,当我调用此方法时,我使用第一项.问题是这不是很优雅.我不明白的是为什么我在数组中获得同一个地图的多个副本.我希望代码返回一个地图.我如何重写这个以解决问题?
它返回一系列地图,因为每个"for"的每次迭代都返回它.试试这个:
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
};
Run Code Online (Sandbox Code Playgroud)
这将FLWOR语句放在自己的let中,然后返回映射.