在维护上下文的同时评估XQuery函数中的字符串

时间:2014-05-21 23:17:05

标签: xml xquery marklogic exist-db

在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>

1 个答案:

答案 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>