Node Update and Node Insert at the Element Level
- Last Updated: April 14, 2026
- 2 minute read
- MarkLogic Server
- Version 10.0
- Documentation
The node-update capability at the element level enables to you replace and delete nodes with xdmp:node-replace() and xdmp:node-delete(). The insert capability enables you to call xdmp:node-insert-before(), xdmp:node-insert-after(), and xdmp:node-insert-child().
Note:
At the element level, the update and node-update capabilities are equivalent.
Here are some simple examples using the xdmp:node-insert-before(), xdmp:insert-node-after(), and xdmp:node-replace() functions at the element level. These examples assume that both roles have document insert/node-update permissions as well as read permissions for the document and that the query rolesets are configured correctly.
Say that you have a document with these nodes:
<root>
<foo>hello</foo>
<bar>World</bar>
</root>
There are two roles; role1 with both read and update permissions on the <foo> node, and role2 with read and node-insert permissions on the <root> node:
<foo>,("role1", "read"),("role2", "read"),("role1", "update")
<root>,("role1", "read"),("role2", "read"),("role2", "insert")
The protected paths look like this:
sec:protect-path("//foo", (), (
xdmp:permission("role1", "read"),("role1", "update"),"role2", "read"))
sec:protect-path("//root", (), (
xdmp:permission("role1", "read"),("role2", "read"),("role2", "insert"))
The insert and update permissions check the ancestors of a node as well. See Document and Element Level Permissions Summary for details.
(: insert a new document :)
xdmp:document-insert("/example.xml",
<root>
<foo>hello</foo>
<bar>World</bar>
</root>
(xdmp:permission("role1", "read"), xdmp:permission("role2", "read"),
xdmp:permission("role1", "node-update"),("role1", "insert"), xdmp:permission("role2", "node-update"),("role2", "insert")));
As role2, use xdmp:node-insert-before() to add a node to the document:
(: add a baz node before the foo node :)
xdmp:node-insert-before(fn:doc("/example.xml")/root/foo,
<baz>Greetings</baz>);
(: view the revised document :)
fn:doc("/example.xml")
=>
<root>
<baz>Greetings</baz>
<foo>hello</foo>
<bar>World</bar>
</root>
As role1 you can use xdmp:node-replace() to change the <bar> node.
xdmp:node-replace(doc("/example.xml")/root/foo,<foo>Hello</foo>));
doc("/example.xml");
fn:doc("/example.xml")
=>
<root>
<baz>Greetings</baz>
<foo>Hello</foo>
<bar>World</bar>
</root>
If you are using a user other than role1 to do these same operations, a permission denied exception will be thrown.