在marklogic中,如何在函数中评估字符串(使用xdmp:value()
,xdmp:eval()
或??)并维护仍保持上下文? (我可以使用util:eval-inline()
在eXist中执行此操作。)
这是我正在谈论的一个例子。
的XQuery
let $predicate := "val='1234'"
let $xml :=
<doc>
<test>
<val>abcd</val>
</test>
<test>
<val>1234</val>
</test>
</doc>
return $xml/test[xdmp:value($predicate)]
输出(这是我想要/期望的):
<test>
<val>1234</val>
</test>
我遇到的问题是当我尝试将xdmp:value()
放入函数时:
的XQuery
declare function local:value($string as xs:string) as item()* {
xdmp:value($string)
};
let $predicate := "val='1234'"
let $xml :=
<doc>
<test>
<val>abcd</val>
</test>
<test>
<val>1234</val>
</test>
</doc>
return $xml/test[local:value($predicate)]
这会返回以下错误:
[1.0-ml] XDMP-MISSINGCONTEXT: (err:XPDY0002) val -- Missing context item
我可以在eXist中执行此操作(下方);是否可以在marklogic中执行此操作?我也试图保持本地功能签名相同。
XQuery(适用于eXist)
declare function local:value($string as xs:string) as item()* {
util:eval-inline(.,$string)
};
let $predicate := "val='1234'"
let $xml :=
<doc>
<test>
<val>abcd</val>
</test>
<test>
<val>1234</val>
</test>
</doc>
return
$xml/test[local:value($predicate)]
输出(这是我想要/期望的):
<test>
<val>1234</val>
</test>
答案 0 :(得分:2)
我认为您必须将上下文节点传递给您的函数。
declare function local:value($context as node(), $string as xs:string)
as item()*
{
$context/xdmp:value($string)
};
let $predicate := "val='1234'"
let $xml :=
<doc>
<test>
<val>abcd</val>
</test>
<test>
<val>1234</val>
</test>
</doc>
return $xml/test[local:value(., $predicate)]
或者只是:
let $predicate := "val='1234'"
let $xml :=
<doc>
<test>
<val>abcd</val>
</test>
<test>
<val>1234</val>
</test>
</doc>
return $xml/test[xdmp:value($predicate)]
这两项对我来说都适用于7.0-2.3
<test>
<val>1234</val>
</test>