如何避免在MarkLogic中传递地图作为参考?

时间:2018-04-10 06:02:58

标签: marklogic marklogic-8

我正在使用ML 8.0-8

有没有办法不将Map作为参考传递给函数。

我的意思是如果我在函数中的地图中进行任何更新,它不应该反映在实际的地图中。

示例:

function call($map as map:map) {
     'add one more key in the $map'
}

declare $actualMap
call($actualMap)
print $actualMap

调用函数中的更新不应反映在$ actualMap

1 个答案:

答案 0 :(得分:4)

你基本上必须克隆它。您可以通过XQuery中的单行程序,通过序列化和解析它来实现这一点:

let $clonedMap := map:map(document{ $map }/*)

请注意,map:map可以保存无法序列化的项目,例如函数引用。在这种情况下,您需要重建map:map。例如:

let $clonedMap := map:new(map:keys($map) ! map:entry(., map:get($map, .)))

第二种方法实际上可能更快,但它没有处理地图:递归地映射,而第一种方法会。您可以使用typeswitch在递归函数中包装第二个以进行补偿。

HTH!