Xml 在维护上下文的同时计算XQuery函数中的字符串

Xml 在维护上下文的同时计算XQuery函数中的字符串,xml,xquery,marklogic,exist-db,Xml,Xquery,Marklogic,Exist Db,在marklogic中,如何计算函数中的字符串(使用xdmp:value()、xdmp:eval(),或??)并保持上下文?(我可以在eXist中使用util:eval-inline()来实现这一点) 这是我所说的一个例子 XQuery let $predicate := "val='1234'" let $xml := <doc> <test> <val>abcd</val> <

在marklogic中,如何计算函数中的字符串(使用
xdmp:value()
xdmp:eval()
,或??)并保持上下文?(我可以在eXist中使用
util:eval-inline()
来实现这一点)

这是我所说的一个例子

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)]
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
我能够做到这一点,在存在(如下);在marklogic中可以这样做吗?我还试图保持本地函数签名不变

XQuery(在现有系统中工作)

将函数local:value($string作为xs:string)声明为item()*{
util:eval内联(,$string)
};
让$predicate:=“val='1234'”
让$xml:=
abcd
1234
返回
$xml/test[本地:值($predicate)]
输出(这正是我想要/期望的):


1234

我认为您必须将上下文节点传递给函数

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)]
声明函数local:value($context作为node(),$string作为xs:string)
作为第()项*
{
$context/xdmp:value($string)
};
让$predicate:=“val='1234'”
让$xml:=
abcd
1234
返回$xml/test[本地:值(,$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)]
let$predicate:=“val='1234'”
让$xml:=
abcd
1234
返回$xml/test[xdmp:value($predicate)]
在7.0-2.3版本中,这两项都适用于我

<test>
  <val>1234</val>
</test>

1234

我可以发誓这是我尝试的第一件事。:-)工作完美。谢谢你,先生!另外,您的第二个示例(“或只是:”)与我的第一个示例完全相同,并且确实按照预期工作。是的,我看到了。你有没有想过写下这个用例?这可能很有趣,但我无法从测试用例中判断。
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)]
<test>
  <val>1234</val>
</test>