Xquery返回地图列表而不是地图

时间:2014-05-28 10:24:44

标签: 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
};

我被迫将返回类型声明为map:map*,因为由于某种原因,$ map是一个地图数组而不是地图。该数组包含许多项目,其中每个项目包含我需要的相同地图。因此,当我调用此方法时,我使用第一项。问题是这不是很优雅。我不明白的是为什么我在阵列中获得同一地图的多个副本。我希望代码返回一个地图。我如何重写这个以解决问题?

1 个答案:

答案 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中,然后返回映射。