Hi Christian, Thank you; that's a lightbulb moment for me. I had somehow formed the impression that the update keyword's contained expression _created_ the copy, rather than a copy being created to which the update then happens. (I have read the docs on main memory updates several times, but seem to have consistently miscomprehended this aspect.) That 4.0 syntax is a big improvement; thank you! Much appreciated, Graydon On Wed, Feb 18, 2026, at 12:34, Christian Grün wrote:
Hi Graydon,
The db:node-id function returns the the IDs of nodes stored in a database. With the "update" keyword, you are creating a main-memory copy of an XML node (see [1] for more details) which is independent of the original document.
You have already found the solution: You can work with the IDs if you omit the 'update' keyword and change the database contents directly. By the way, here is some equivalent 4.0 syntax:
for key $key value $value in $composedMap let $target := db:get-id('ID-DB', $key) let $node := attribute { 'id' } { $value } return insert node $node into $target
Best, Christian
[1] https://docs.basex.org/main/Updates#main-memory_updates
*Von:* Graydon Saunders via BaseX-Talk <basex-talk@mailman.uni-konstanz.de> *Gesendet:* Mittwoch, 18. Februar 2026 16:15 *An:* BaseX <basex-talk@mailman.uni-konstanz.de> *Betreff:* [basex-talk] Re: db:node-id() and updating operations
So it turns out what works is
for $stable in map:keys($composedMap) return insert node attribute {'id'} {$composedMap($stable)?composed} into db:get-id('ID-DB',$stable)
The same pattern does not work in update; I do not understand why the above expression is happening to database nodes and the original attempt does not.
If anyone is able to explain the distinction I am very curious as to whether I would be able to muster enough neurons to comprehend it.
On Tue, Feb 17, 2026, at 18:27, Graydon Saunders via BaseX-Talk wrote:
Hello --
Using db:node-id() is an order of magnitude faster than using generate-id() to relate various nodes to their ancestors when constructing a composite id. This works great.
Now I have a map (the keys are the value returned by db:node-id() for specific elements) and I want to update either a document or the db to have the new, calculated values as id attribute values.
I expected that I could use
for $thisDoc in db:get('ID-DB') ...calculate some stuff... ... $hasIDKey is the map:keys() of the map of calculated values...
return $thisDoc update {(//*[db:node-id(.) = $hasIDKey]) ! (insert node attribute { 'id' } { $composedMap(./db:node-id(.))?composed } into .)}
This pattern worked with generated-id() values; with db:node-id() the error I get is:
[db:node] No database node: <publication.../>.
(Publication is the expected document element.)
db:node-id() worked in a function in a library module when $thisDoc was a parameter, so I'm at a bit of a loss; I would have expected that db:node-id() is the stable identifier and could work with updating expressions but perhaps that was optimism.
Is there an appropriate way to relate a db:node-id() value to an element in an updating expression?
Thanks! Graydon