XQuery 中的运算符“=>”有什么作用?

Ale*_*and 6 xquery marklogic marklogic-9

当我查找 XQuery 示例时,有时会看到使用的运算符=>

我试图寻找它的含义,但找不到任何东西。由于我使用的是 MarkLogic,因此它可能仅适用于 MarkLogic,但我对此表示怀疑。

从示例中我知道它以某种方式将功能链接在一起,但我想知道发生了什么。

这些是我发现的一些例子:

let $map := map:map()
  =>map:with("some-key",<info>45683</info>)
return <result>{$map}</result>
Run Code Online (Sandbox Code Playgroud)
let $employees := op:from-view("main", "employees")
let $expenses  := op:from-view("main", "expenses")
let $totalexpenses  := op:col("totalexpenses")
return $employees
   => op:join-inner($expenses, op:on(
                    op:view-col("employees", "EmployeeID"),
                    op:view-col("expenses", "EmployeeID")))
   => op:group-by(op:view-col("employees", "EmployeeID"),
                 ("FirstName", "LastName", 
                  op:view-col("expenses", "Category"),
                  op:sum($totalexpenses, 
                  op:view-col("expenses", "Amount"))))
   => op:order-by(op:view-col("employees", "EmployeeID")) 
   => op:result() 
Run Code Online (Sandbox Code Playgroud)

Leo*_*ler 8

它是箭头运算符,它允许您从外部向函数调用提供第一个参数。因此,如果您有函数调用foo($a, $b, $c),则可以等效地将其写为$a => foo($b, $c). 如果你有很多嵌套的函数调用作为第一个参数,这很方便:

string-join(reverse(tokenize(upper-case('a;b;c'), ';')), '_')
Run Code Online (Sandbox Code Playgroud)

使用箭头运算符,这可以写成一个很好的管道

'a;b;c' => upper-case() => tokenize(';') => reverse() => string-join('_')
Run Code Online (Sandbox Code Playgroud)

给出相同的结果"C_B_A"

箭头运算符的一个缺点是,当您想一目了然地找出 XQuery 代码中的函数调用引用了哪个函数时,必须将其考虑在内。如果您声明了两个函数local:foo($seq) {...}and local:foo($seq, $accum) {...},那么$asdf => local:foo($x)看起来它调用的是单参数版本,但实际上调用的是双参数变体。

  • 它也很容易与 bang 运算符混淆,例如`//x!大写(.)`。区别在于 (a) bang 运算符将 RHS 应用于 LHS 序列中的每个项目,并且 (b) 不能省略参数:注意“大写(.)”。另外 (c) bang 运算符可以具有 RHS 上的任何表达式,而 arrow 运算符只能具有函数调用。 (4认同)