【问题标题】:How to pass the map variable to the external function like eval and invoke in marklogic xquery如何将映射变量传递给外部函数,如 eval 并在 marklogic xquery 中调用
【发布时间】:2020-07-29 06:28:47
【问题描述】:

xdmp:eval($s, (), "world"))

我想将 map 作为参数传递给外部函数,而不是作为上述代码中的第二个参数的默认值。

【问题讨论】:

  • 您的示例代码看起来不正确。您正在为$vars 传递一个空序列,并将字符串“world”作为$options 传递,并有一个额外的括号。如果从示例中建模,可能意味着发布xdmp:eval($s, (xs:QName("my:x"), "world")),那么您的要求可能会更清楚。

标签: xquery marklogic


【解决方案1】:

如果$s 有例如declare variable $v1 external; 在序言中然后我认为您可以使用xdmp:eval($s, map:new(map:entry('{}v1', some-expression))),或者,正如评论中指出的那样,甚至xdmp:eval($s, map:new(map:entry('v1', some-expression))) 将评估some-expression 的结果作为变量$v1 的值传递,例如xdmp:eval($s, map:new(map:entry('v1', 'foo'))) 传入字符串值foo

【讨论】:

  • 您可以省略不带前缀变量的键名中的{}
【解决方案2】:

xdmp:eval() 的文档中所述,您可以传递一系列交替的 QName 和值,也可以传递一个映射。

可用于评估代码的外部变量值,表示为交替的 QName-value 对序列或 map:map

  • 如果您使用序列,它必须包含交替的变量 QNames 和值。例如(xs:QName("var1"), "val1", xs:Qname("var2"), "val2")
  • 如果使用映射,则每个键都是一个字符串,表示变量 QName ("{namespaceURI}localname") 的 Clark 表示法,其值是对应的变量值。您可以使用 xdmp:key-from-QName 生成 Clark 表示法以用作键。

xdmp:eval() 文档中的示例显示了如何使用序列调用:

xquery version "1.0-ml";
declare namespace my='http://mycompany.com/test';

let $s :=
      "xquery version '1.0-ml';
       declare namespace my='http://mycompany.com/test';
       declare variable $my:x as xs:string external;
       declare variable $my:y as xs:string external := 'goodbye';
       concat('hello ', $my:x, ' ', $my:y)"
return
    (: evaluate the query string $s using the variables
       supplied as the second parameter to xdmp:eval :)
    xdmp:eval($s, (xs:QName("my:x"), "world"))

因此,您需要创建一个 map:map 而不是 (xs:QName("my:x"), "world") 并创建一个条目,其中 QName 的键为 Clark 表示法:{http://mycompany.com/test}x 和该条目的值“world”。

使用map:map 调用的方式是:

let $vars := map:new() => map:with(xdmp:key-from-QName(xs:QName("my:x")), "world")
return
  xdmp:eval($s, $vars)

【讨论】:

  • 一般注意事项:如果您不为变量名添加前缀,则可以节省一些麻烦。可以使用map:entry('x', 'world') 引用名为$x 的外部变量。
猜你喜欢
  • 2012-11-05
  • 2018-04-30
  • 2020-02-14
  • 2016-03-02
  • 1970-01-01
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
相关资源
最近更新 更多