Hi,
when I bind a DOM tree as the context item in XQJ against an XQuery script that performs updates, the passed DOM tree is not modified. Here is a groovy example
import groovy.xml.XmlUtil
import groovy.xml.DOMBuilder
import groovy.xml.dom.DOMCategory
import javax.xml.xquery.XQConstants
docbuilder = DOMBuilder.newInstance()
doc = docbuilder.sample() {
renameMe(id:11) {
renameInner(isit:"true","yes")
}
deleteMe(id:12) {
alongWithMe("bummer")
}
insertBeforeMe(id:14) {
alongWith(me:"true","Oh Yeah")
andMe(too:"yes","Oh Yeah")
}
insertAfterMe(id:15) {
atLevelThree(level:3) {
atLevelFour(level:4, "fourth level")
atLevelFour(level:4, "fourth level again")
}
alongWith(me:"true","Oh Yeah")
}
}
// prints the DOM tree before updates
XmlUtil.serialize(doc, System.out)
ds = Class.forName("org.basex.api.xqj.BXQDataSource").newInstance()
cnn = ds.getConnection()
stmt = """
let \$r := .
return (
rename node \$r/renameMe as 'gotRenamed',
delete node \$r/deleteMe[@id='12'],
insert node
<gotInsertedBefore id='13'>
<alongWithMe>Cool</alongWithMe>
</gotInsertedBefore>
before \$r/insertBeforeMe[@id='14'],
insert node
<gotInsertedAfter id='16'>
<alongWithMe>Cool</alongWithMe>
</gotInsertedAfter>
after \$r/insertAfterMe[@id='15']
)
"""
xe = cnn.prepareExpression(stmt)
xe.bindNode(XQConstants.CONTEXT_ITEM, doc, null)
xqs = xe.executeQuery()
// the DOM tree was not modified
XmlUtil.serialize(doc, System.out)
xqs.close()
xe.close()
cnn.close()
Should I pass it as an external variable instead?
Ciao
Stefano