如何将文档节点传递到 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>
我有这样的代码:
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>