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

How to pass a document-node into an eval/invoke

我有这样的代码:

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 但感觉有点乱。我也可以将其放入数据库中,但是为此进行文档插入和删除感觉有点开销。

非常感谢对此的任何想法。

简短回答:您想要的是使用 map:entry() 而不是 map:map()。下面的returns为真(即存储了一个文档 节点作为映射中键 "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 树是作为参数传递给函数的。 添加到元素的文档节点只是 "ignored",其 children 根据 XDM 的建议直接复制。这个XML 树用作地图的 XML 表示,"deserialized"。 此时元素map:value中的内容是一个元素节点, 所以在地图中最终如此。

如果我们去掉所有的地图机制,这可能会更清楚:

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

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

<value>
   <foobar/>
</value>