在FLWOR中执行功能而不使用' let'

时间:2014-09-04 22:01:27

标签: xquery marklogic

假设我创建了一张地图:

let $map := map:map()

如何在不使用let的情况下在地图中放置内容?通常我必须做像

这样的事情
let $map := map:map()
let $useless-var := map:put($map, $key, $value)

似乎奇怪的是,如果我想执行某些操作并且我不关心返回值,我仍然需要存储结果。我在这里缺少什么?

注意:重要的部分不是map(),而是我不能运行函数而不将结果存储在某个无意义的变量中。

5 个答案:

答案 0 :(得分:2)

一种方法是将函数作为序列中的项执行,其中序列中只有一个项(通常是第一个或最后一个)为赋值或返回提供实际值,如:

let $roundedX := (
    math:floor($x),
    local:function1(...),
    local:function2(...)[false()],
    ...
    )
...
return (
    local:functionA(...),
    local:functionB(...)[false()],
    ...,
    $roundedX * 10
    )

如果函数返回一个你要丢弃的值,只需使用一个假谓词,就像上面的两个函数一样。

当然,这种方法仅适用于有副作用的功能。

答案 1 :(得分:1)

除非您需要,否则不要使用FLWOR。在我看来,FLWOR表达式有些过度使用。我经常看到如下表达式:

let $a := current-time()
return $a

......什么时候写得好:

current-time()

另请参阅:http://blakeley.com/blogofile/2012/03/19/let-free-style-and-streaming/

答案 2 :(得分:0)

在MarkLogic 7中,您可以使用地图构造函数以递归方式生成地图。我想这可能是你想要的:

let $map := map:new( 
  (1 to 10) ! map:entry(., .)
)

或者您执行map:put作为另一个序列的一部分,或者在返回地图之前在return语句中执行:

let $map := map:map()
let $not-useless-var := ...
return (map:put($map, string($not-useless-var), $not-useless-var), $map)

答案 3 :(得分:0)

在简单的XQuery中(忽略像XQuery scripting extension这样的扩展)没有副作用,所以在不使用返回值的情况下调用函数是没有意义的。

您可能缺少的是map:put()返回地图并添加了额外的项目,会改变原始地图。所以你的$useless-var实际上并没用。

编辑:其实我不确定MarkLogic的map:put()是否会改变地图。 (如果确实如此,那真的很糟糕。)我在考虑提出的XQuery 3.1地图(我在BaseX中使用过),这绝对是不可变的。

答案 4 :(得分:0)

由于您的问题的焦点是关于在不存储中间结果的情况下运行函数,您可能会发现地图运算符(!)有用:

local:build-sequence() ! local:do-something-to-each(.)

这对处理序列很有用。如果你正在考虑更多地处理某些事情的结果,那么答案可能就是接受XQuery的功能性:

local:produce-result(
  local:build-parameter(),
  local:retrieve-config()
)

不确定您正在寻找什么,但希望这些帮助。