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

Xpath Xquery返回地图列表而不是地图,xpath,xquery,marklogic,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:data

我有以下功能

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是一个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
};

它在自己的let中执行FLWOR语句,然后返回映射

它返回一个映射序列,因为每个“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
};

它在自己的let中执行FLWOR语句,然后返回映射

这不起作用——它给了我同样的问题。你确定这就是解决方案吗?看来你在评论之后接受了答案;这是不是意味着你现在可以用了?关键是“return$map”不是带有for语句的FLWOR的一部分。这不起作用-它给了我同样的问题。你确定这就是解决方案吗?看来你在评论之后接受了答案;这是不是意味着你现在可以用了?关键是“return$map”不是带有for语句的FLWOR的一部分。