Lately I’ve been playing with some more advanced XQuery. One thing nearly every XQuery engine supports is some kind of eval()
function. MarkLogic has several, but my favorite is xdmp:eval. It’s lightweight because it reuses the entire calling context, so for instance you can write let $v := 5 return xdmp:value("$v")
. Not too useful, but if the expression passed in comes from a variable, it gets interesting.
Now, quite a few standards based on XPath depend on the context node being set to some particular node. This turns out to be easy too, using the path operator: $context/xdmp:value($expr)
. According to the definition of the XPath path operator, the expression to the right is evaluated with the results of the expression on the left setting the context node.
OK, how about setting the context size and position? More difficult, but one could use a sequence on the left-hand side of the path operator, with the desired $context
node in somewhere in the middle. Then last()
will return the length of the sequence, and position()
will return, well, the position of $context
in the sequence. But it’s kind of hacky to manufacture a bunch of temporary nodes, only to throw them away in the next step of the path.
I’m curious if anyone else has done something similar. Comments? -m