如何在marklogic xquery中将map变量传递给外部函数,如eval和invoke

如何在marklogic xquery中将map变量传递给外部函数,如eval和invoke,xquery,marklogic,Xquery,Marklogic,xdmp:eval($s,(),“world”) 我希望将map作为参数传递给外部函数,而不是将默认值作为上述代码中的第二个参数。如果$s具有例如声明变量$v1 external在序言中,然后我认为您可以使用xdmp:eval($s,map:new(map:entry({}v1',some expression)),或者,正如注释中指出的,甚至可以使用xdmp:eval($s,map:new(map:entry({v1',some expression)))将计算结果作为变量值传递给某些表达式$

xdmp:eval($s,(),“world”)


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

如果
$s
具有例如
声明变量$v1 external在序言中,然后我认为您可以使用
xdmp:eval($s,map:new(map:entry({}v1',some expression))
,或者,正如注释中指出的,甚至可以使用
xdmp:eval($s,map:new(map:entry({v1',some expression)))
将计算结果作为变量值传递给
某些表达式
$v1
,例如
xdmp:eval($s,map:new(map:entry('v1','foo'))
按照文档中的指示传递字符串值
foo

,您可以传递一系列交替的QName和value,或者你可以传递一张地图

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

  • 如果使用序列,它必须包含交替变量QName和值。e、 g.
    (xs:QName(“var1”),“val1”,xs:QName(“var2”),“val2”)
  • 如果使用映射,则每个键都是一个字符串,表示变量QName(“{namespaceURI}localname”)的克拉克表示法,其值是相应的变量值。您可以使用生成用作键的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
并创建一个条目,其中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)

您的示例代码看起来不正确。您正在为
$vars
传递一个空序列,并将字符串“world”作为
$options
传递,并且有一个额外的括号。如果从示例中建模,可能意味着发布
xdmp:eval($s,(xs:QName(“my:x”),“world”)
,那么您的问题可能会更清楚。您可以在关键字名称中省略带有非前缀变量的
{}
。一般注意:如果您不在变量名称前加前缀,则可以省去一些麻烦。名为
$x
的外部变量可以通过
映射:条目('x','world')
引用。