在Marklogic中的xquery库模块中创建全局映射变量

时间:2014-12-02 11:32:12

标签: dictionary xquery marklogic

我需要将地图添加到库模块。大部分功能使用的地图。我有一个填充地图的功能。

declare variable $map as map:map :=local:populateMap();

declare function local:populateMap() {
  let $map:=map:map()
   let $dummy1:=for $id in cts:search(/document/id,cts:element-query(xs:QName("document"),cts:and-query(())),"unfiltered" )
      let $dummy2:=map:put($map,$id/fn:string(),someValueCorrespondingToCurrentId)
       return ()
   return $map     

};

other functions that use the map

我的文件如下:

<document>
 <id>id</id>
<otherElements>
 ...........
</otherElements> 
</document>

local:populateMap()中的代码对我来说有点尴尬,特别是对于那些虚拟变量的使用。什么是更好的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

如果使用函数式编程语言找到以下语法更具可读性和更多样式:

declare function local:populateMap() {
  map:new((
    for $id in cts:search(/document/id,cts:element-query(xs:QName("document"),cts:and-query(())),"unfiltered" )
    return map:entry($id/string(), someValueCorrespondingToCurrentId)
  ))
};

此代码使用给定的地图条目创建新地图。在为每次迭代提供的代码示例中,应创建一个新映射。

答案 1 :(得分:1)

假设您在/ document / id:

上有路径范围索引
declare function local:populateMap() {
  map:new((
    cts:values(
      cts:path-reference("/document/id"))
    ) ! map:entry(., someValueCorrespondingToCurrentId)
  ))
};

假设someValueCorrespondingToCurrentId来自与id相同的文档,并且还有一个范围索引。

declare function local:populateMap() {
  map:new((
    cts:values(cts:path-reference("/document/id"))) ! 
      map:entry(., 
        cts:values(
          cts:SOMETHING-reference(
            reference-spec, 
            (), 
            "limit=1", 
            cts:path-range-query("/document/id", "=", .)
          )
        )
      )
  ))
};

The "!" operator简洁地替换了你的内部FLWOR,而map:new和map:条目取代了外部的。在上面的第二个代码块中,我查找了cts:* - 与当前id在同一文档中出现的引用。在这两种情况下,都会从索引中检索所有值,因此不需要从磁盘加载文档。