如何将文档节点传递给eval / invoke

时间:2017-02-16 10:43:39

标签: marklogic

我的代码如下:

let $evalParams := map:map(
    <map:map
        xmlns:map='http://marklogic.com/xdmp/map'>
        <map:entry>
            <map:key>document</map:key>
            <map:value>{$doc}</map:value>
        </map:entry>
    </map:map>)
let $resultDocument := xdmp:eval($transformCode, $evalParams)

在$ transform代码中,它检查文档节点:

declare variable $document as document-node() external;

遗憾的是,该检查失败了。据我所知,这与map:map结构没有通过文档节点有关。

有没有一种好方法可以绕过它?我可以使用 xdmp:unqote ,但感觉有点乱。我也可以放入数据库,但只是为了进行文件插入和删除,感觉就像开销一样。

对此非常感激。

1 个答案:

答案 0 :(得分:4)

简短回答:您想要的是使用map:entry()代替 map:map()。以下返回true(即,它存储文档 node作为映射中键"key"的值):

let $doc := document { <foobar/> }
let $map := map:entry('key', $doc)
return
   map:get($map, 'key') instance of document-node()

那么存储元素的以下内容有何不同? 而不是节点?

let $doc := document { <foobar/> }
let $map := map:map(
      <map:map xmlns:map='http://marklogic.com/xdmp/map'>
         <map:entry>
            <map:key>key</map:key>
            <map:value>{ $doc }</map:value>
         </map:entry>
      </map:map>)
return
   map:get($map, 'key') instance of element()

不同之处在于上面的代码首先将文档节点复制到 XML树。该XML树作为函数的参数传递。 添加到元素的文档节点只是被忽略&#34;,它的 根据XDM建议,孩子们可以直接复制。这个XML tree用作地图的XML表示,并且&#34;反序列化&#34;。 此时元素map:value IS 中的元素节点是什么, 所以最终会在地图中结束。

如果我们摆脱所有地图机制,这可能会更清楚:

let $doc  := document { <foobar/> }
let $elem := <value>{ $doc }</value>
return
   $elem/node() instance of element()

最后一个代码中的$elem的值如下(这使得 感觉,对吧?还有什么呢,因为文档节点不可能 任何其他节点的子节点?):

<value>
   <foobar/>
</value>