Search code examples
xquerymarklogicmarklogic-9

Passing variable to xdmp:eval Marklogic Xquery


I need to pass an argument into an xdmp:eval with xquery:

let $uri :="/tmp/myDoc.csv"

let $doc:= xdmp:eval('fn:doc($uri)' , (),  <options xmlns="xdmp:eval"><database>{xdmp:database("My-Database")}</database></options>) 

return $doc

But i'm getting Undefined variable $uri

I need to do this with an xdmp:eval for many reasons, have any one any idea how to do this in xquery ?


Solution

  • When you eval that string, it has no context to know that the $uri value should be. You can pass those context values in the second parameter when you invoke:

    let $uri :="/tmp/myDoc.csv"
    let $doc:= xdmp:eval('fn:doc($uri)', 
                         (xs:QName("uri"), $uri),  
                         <options xmlns="xdmp:eval">
                           <database>{xdmp:database("My-Database")}</database>
                         </options>) 
    return $doc
    

    But you should consider using xdmp:invoke-function() instead, with the anonymous function:

    let $uri := "/tmp/myDoc.csv"
    xdmp:invoke-function(function(){ fn:doc($uri) }, 
      <options xmlns="xdmp:eval">
        <database>{xdmp:database("My-Database")}</database>
      </options>
    )
    

    It is generally easier and safer to use xdmp:invoke-function.