[MarkLogic Dev General] passing a document-node into an eval/invoke

Erik Zander Erik.Zander at studentlitteratur.se
Wed Feb 15 04:57:26 PST 2017

Hi Florent,

Thank you!

Using map:entry solved it and goes with my intentions.
Also thanks for the great explanation it’s obvious why map:map doesn’t work when its explained well.


Från: general-bounces at developer.marklogic.com [mailto:general-bounces at developer.marklogic.com] För Florent Georges
Skickat: den 15 februari 2017 12:18
Till: MarkLogic Developer Discussion <general at developer.marklogic.com>
Ämne: Re: [MarkLogic Dev General] passing a document-node into an eval/invoke

Short answer: what you want is to use map:entry() instead of
map:map().  The following returns true (that is, it stores a document
node as the value of the key "key" in the map):

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

So what is the difference with the following, which stores an element
node instead?

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

The difference is that the above first copy the document node to an
XML tree.  A document node added to an element is just "ignored", its
children get copied directly, as per the XDM recommendation.  This XML
tree is used as an XML representation of a map, and "deserialized".
What is in the element map:value *IS* an element node at this point,
so ends up as such in the map.

This might be more clear if we get rid of all the map machinery:

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

The value of $elem in this last code is the following (which makes
sense, right?, what else could it be?):



Florent Georges
H2O Consulting

On 15 February 2017 at 11:37, Erik Zander wrote:
Hi All,

I did iron out why I got errors, now I could use some help finding the best solution to it.

The error is that I have code like


let $evalParams := map:map(
let $resultDocument := xdmp:eval($transformCode, $evalParams)

where in the $transform code it checks for a document-node
declare variable $document as document-node() external;

To my understanding this has to do with the map:map structure.

But is there a good way of going around it. I could use xdmp:unqote but it feels a bit messy. I could also put into the database but doing document inserts and deletions just for that feels like a bit much overhead.

Any thoughts on this is greatly appreciated.


General mailing list
General at developer.marklogic.com<mailto:General at developer.marklogic.com>
Manage your subscription at:

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://developer.marklogic.com/pipermail/general/attachments/20170215/17da563b/attachment-0001.html 

More information about the General mailing list