persistent id values?

Monday, 9 February 2026 · 5 messages · last reply 16 Feb 2026
GS
Graydon Saunders9 Feb 2026 16:48 #
Hi! I'm loading a document with doc() and doing a bunch of stuff to regenerate id attribute values; I'm using generated ids (from generate-id()) as map keys so I can generate the local, this-element id component and then put them all together from the list of ancestor ids. That works. What doesn't work is trying to use those ids to identify the element which should get this newly constructed id value; calling generate-id() again on the same document doesn't give the same answers. (which is to be expected, at least as I understand how generate-id() is defined.) I have this vague memory that there's a BaseX function that will produce a stable id, but can't remember what it is called. (Or if it will work when I get the document with doc().) Is there such a thing, and if so, what module should I be looking in? Thanks! Graydon
BD
Bridger Dyson-Smith9 Feb 2026 17:17 #
Hi Graydon - I'm curious to hear other thoughts on this, I recall a struggle with something similar (wanting persistent access to node identifiers), and I wound up with a kludge that leveraged `db:node-pre()` and `db:get-id()`. I *think* trying to make in-database identifiers persistent would be circular, ie you write the file to the database, generate the node-id/node-pre values, but exposing those values in the document would change the document, and.... I'm not sure if I'm thinking about it clearly or not. Also, now that I think about it, I'm not entirely sure if the db:node-id/db:get-id is persistent - the db:node-pre/db:get-pre will change if documents are updated/deleted. What about a pre-processing step that ran an identity transform that added a `generate-id()`'d identifier to your chosen elements, then adding the document to your db? I don't think I answered your question, but I'm curious to learn more. Best, Bridger PS after adding a document to the database, you could run a process that updated a map in the `store` main memory using the db:node-id/db:get-id functions, then you could refer to that? PPS Excuse any misunderstanding of the problem. I'm insufficiently caffeinated today.
Quoted text · Graydon Saunders · 15 lines
On Mon, Feb 9, 2026 at 10:48 AM Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> wrote: > > Hi! > > I'm loading a document with doc() and doing a bunch of stuff to regenerate id attribute values; I'm using generated ids (from generate-id()) as map keys so I can generate the local, this-element id component and then put them all together from the list of ancestor ids. That works. > > What doesn't work is trying to use those ids to identify the element which should get this newly constructed id value; calling generate-id() again on the same document doesn't give the same answers. (which is to be expected, at least as I understand how generate-id() is defined.) > > I have this vague memory that there's a BaseX function that will produce a stable id, but can't remember what it is called. (Or if it will work when I get the document with doc().) > > Is there such a thing, and if so, what module should I be looking in? > > Thanks! > Graydon
GS
Graydon Saunders9 Feb 2026 17:27 #
Hi Bridger, I want to be able to load up individual (if largish) XML documents and check that their id values (which are complex, and which downstream applications rely on to work) are correct. Since the id values accumulate (your id starts with the id of your closest ancestor with an id), creating them is much easier if I can create all the individual, per-element components and then put them together. All of that works with generate-id() because I can put one set of id values in a map and do everything in the map. It's once I want to relate the id back to the document ("this generated value goes with this id attribute node") that I'm having trouble. I don't want to use path(); it'd work, but it's not an efficient approach. (Or at least I don't understand it as efficient.) I find myself thinking that your "update the document with an attribute containing a generated id value and use that" approach might be the best; I'm going to try job:execute and db:node-id() first, though, because I'll learn something. (And I'll look at store in the hopes that it's easier than creating single document dbs with job:execute.) Thank you! Graydon
Quoted text · Bridger Dyson-Smith · 45 lines
On Mon, Feb 9, 2026, at 11:16, Bridger Dyson-Smith wrote: > Hi Graydon - > > I'm curious to hear other thoughts on this, I recall a struggle with > something similar (wanting persistent access to node identifiers), and > I wound up with a kludge that leveraged `db:node-pre()` and > `db:get-id()`. I *think* trying to make in-database identifiers > persistent would be circular, ie you write the file to the database, > generate the node-id/node-pre values, but exposing those values in the > document would change the document, and.... I'm not sure if I'm > thinking about it clearly or not. Also, now that I think about it, I'm > not entirely sure if the db:node-id/db:get-id is persistent - the > db:node-pre/db:get-pre will change if documents are updated/deleted. > > What about a pre-processing step that ran an identity transform that > added a `generate-id()`'d identifier to your chosen elements, then > adding the document to your db? > > I don't think I answered your question, but I'm curious to learn more. > Best, > Bridger > > PS after adding a document to the database, you could run a process > that updated a map in the `store` main memory using the > db:node-id/db:get-id functions, then you could refer to that? > > PPS Excuse any misunderstanding of the problem. I'm insufficiently > caffeinated today. > > On Mon, Feb 9, 2026 at 10:48 AM Graydon Saunders via BaseX-Talk > <basex-talk at mailman.uni-konstanz.de> wrote: > > > > Hi! > > > > I'm loading a document with doc() and doing a bunch of stuff to regenerate id attribute values; I'm using generated ids (from generate-id()) as map keys so I can generate the local, this-element id component and then put them all together from the list of ancestor ids. That works. > > > > What doesn't work is trying to use those ids to identify the element which should get this newly constructed id value; calling generate-id() again on the same document doesn't give the same answers. (which is to be expected, at least as I understand how generate-id() is defined.) > > > > I have this vague memory that there's a BaseX function that will produce a stable id, but can't remember what it is called. (Or if it will work when I get the document with doc().) > > > > Is there such a thing, and if so, what module should I be looking in? > > > > Thanks! > > Graydon >
LQ
Liam R. E. Quin9 Feb 2026 23:04 #
On Mon, 09 Feb 2026 11:26:14 -0500 Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de>
Quoted text · Graydon Saunders · 5 lines
wrote: > It's once I want to relate the id back to the document ("this > generated value goes with this id attribute node") that I'm having > trouble. I don't want to use path(); it'd work, but it's not an > efficient approach. (Or at least I don't understand it as efficient.)
Yeah, the spec says the value can be used to locate a node, but there doesn’t seem to be a htap() function to go from path to node. So, since XQuery lacks xsl:key :), i build a map of generate-id() values to nodes. But if you need to use it between database queries, yes, attributes.
-- Liam Quin: Delightful Computing - Training and Consultancy in XSLT / XML Markup / Typography / CSS / Accessibility / and more... Outreach for the GNU Image Manipulation Program Vintage art digital files - fromoldbooks.org
CG
Christian Grün16 Feb 2026 21:04 #
Hi Bridger, If it’s an option for you to create (possibly intermediate) database for your documents, db:node-id will certainly be the best choice to get unique IDs. Best, Christian
Quoted text · Liam R. E. Quin · 21 lines
Von: Liam R. E. Quin via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> Gesendet: Montag, Februar 9, 2026 11:05:01 PM An: Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> Betreff: [basex-talk] Re: persistent id values? On Mon, 09 Feb 2026 11:26:14 -0500 Graydon Saunders via BaseX-Talk <basex-talk at mailman.uni-konstanz.de> wrote: > It's once I want to relate the id back to the document ("this > generated value goes with this id attribute node") that I'm having > trouble. I don't want to use path(); it'd work, but it's not an > efficient approach. (Or at least I don't understand it as efficient.) Yeah, the spec says the value can be used to locate a node, but there doesn’t seem to be a htap() function to go from path to node. So, since XQuery lacks xsl:key :), i build a map of generate-id() values to nodes. But if you need to use it between database queries, yes, attributes. -- Liam Quin: Delightful Computing - Training and Consultancy in XSLT / XML Markup / Typography / CSS / Accessibility / and more... Outreach for the GNU Image Manipulation Program Vintage art digital files - fromoldbooks.org

⚡Generated with XQuery