我需要将地图添加到库模块。大部分功能使用的地图。我有一个填充地图的功能。
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()
中的代码对我来说有点尴尬,特别是对于那些虚拟变量的使用。什么是更好的方法来做到这一点?
答案 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在同一文档中出现的引用。在这两种情况下,都会从索引中检索所有值,因此不需要从磁盘加载文档。