我的代码如下:
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 ,但感觉有点乱。我也可以放入数据库,但只是为了进行文件插入和删除,感觉就像开销一样。
对此非常感激。
答案 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>