How To: Sort nodes in document order?
Monday, 4 July 2022 · 5 messages
EK
Eliot Kimber4 Jul 2022 17:11 #
I feel like I should know how to do this (and possibly I’ve previously been told how and have forgotten), but I’m at a loss.
I am implementing a process that gathers nodes from a single document (a DITA map) and constructs a system of maps where I’m using the maps primarily to represent a tree and enable lookup of things by key.
However, the order of the elements that make up these maps is also important (DITA’s rules for how you build DITA key spaces from maps depends entirely on document order).
For example, I have a map that maps “key names” to the elements that declare those key names, i.e.:
map { “key-01” : (<topicref keys=”key-01” href=”foo.dita”/>, <topicref keys=”key-01” href=”bar.dita”/>) }
This is the initial state of the map (reflecting pass 1 over the DITA map document) but then I need to add additional elements to the sequence that is the value of entry “key-01” and I need the resulting sequence to be in document order.
So my question: given two sequences of nodes from the same document, how does one construct a new sequence where the nodes are in document order?
Thanks,
Eliot
_____________________________________________
Eliot Kimber
Sr Staff Content Engineer
O: 512 554 9368
M: 512 554 9368
servicenow.com<https://www.servicenow.com>
LinkedIn<https://www.linkedin.com/company/servicenow> | Twitter<https://twitter.com/servicenow> | YouTube<https://www.youtube.com/user/servicenowinc> | Facebook<https://www.facebook.com/servicenow>
MH
Martin Honnen4 Jul 2022 17:14 #
Quoted text · Eliot Kimber · 28 lines
Am 04.07.2022 um 17:11 schrieb Eliot Kimber: > > I feel like I should know how to do this (and possibly I’ve previously > been told how and have forgotten), but I’m at a loss. > > I am implementing a process that gathers nodes from a single document > (a DITA map) and constructs a system of maps where I’m using the maps > primarily to represent a tree and enable lookup of things by key. > > However, the order of the elements that make up these maps is also > important (DITA’s rules for how you build DITA key spaces from maps > depends entirely on document order). > > For example, I have a map that maps “key names” to the elements that > declare those key names, i.e.: > > map { “key-01” : (<topicref keys=”key-01” href=”foo.dita”/>, <topicref > keys=”key-01” href=”bar.dita”/>) } > > This is the initial state of the map (reflecting pass 1 over the DITA > map document) but then I need to add additional elements to the > sequence that is the value of entry “key-01” and I need the resulting > sequence to be in document order. > > So my question: given two sequences of nodes from the same document, > how does one construct a new sequence where the nodes are in document > order? >
$seq1 | $seq2 should do, if you want duplicates eliminated.MH
Martin Honnen4 Jul 2022 17:29 #
Quoted text · Martin Honnen · 34 lines
Am 04.07.2022 um 17:14 schrieb Martin Honnen: > > > Am 04.07.2022 um 17:11 schrieb Eliot Kimber: >> >> I feel like I should know how to do this (and possibly I’ve >> previously been told how and have forgotten), but I’m at a loss. >> >> I am implementing a process that gathers nodes from a single document >> (a DITA map) and constructs a system of maps where I’m using the maps >> primarily to represent a tree and enable lookup of things by key. >> >> However, the order of the elements that make up these maps is also >> important (DITA’s rules for how you build DITA key spaces from maps >> depends entirely on document order). >> >> For example, I have a map that maps “key names” to the elements that >> declare those key names, i.e.: >> >> map { “key-01” : (<topicref keys=”key-01” href=”foo.dita”/>, >> <topicref keys=”key-01” href=”bar.dita”/>) } >> >> This is the initial state of the map (reflecting pass 1 over the DITA >> map document) but then I need to add additional elements to the >> sequence that is the value of entry “key-01” and I need the resulting >> sequence to be in document order. >> >> So my question: given two sequences of nodes from the same document, >> how does one construct a new sequence where the nodes are in document >> order? >> > > $seq1 | $seq2 should do, if you want duplicates eliminated. >
Otherwise perhaps
sort(($seq1, $seq2), (), function($n) { index-of(($seq1 |
$seq2)!generate-id(), generate-id($n))})CG
Christian Grün4 Jul 2022 17:35 #
Hi Eliot,
As a generalized solution (for an arbitrary number of inputs), you can attach a self::node() step (or a simple context item expression "."):
($nodes1, $nodes2, $nodes2)/self::node()
The resulting expression will be evaluated as path, and the result will be brought into distinct document order. We’ve added a function for that to make the clean/sort operation more explicit [1].
Cheers,
Christian
[1] https://docs.basex.org/wiki/Utility_Module#util:ddo
Quoted text · Martin Honnen · 47 lines
On Mon, Jul 4, 2022 at 5:29 PM Martin Honnen <martin.honnen at gmx.de> wrote: > > > Am 04.07.2022 um 17:14 schrieb Martin Honnen: > > > Am 04.07.2022 um 17:11 schrieb Eliot Kimber: > > I feel like I should know how to do this (and possibly I’ve previously been told how and have forgotten), but I’m at a loss. > > > > I am implementing a process that gathers nodes from a single document (a DITA map) and constructs a system of maps where I’m using the maps primarily to represent a tree and enable lookup of things by key. > > > > However, the order of the elements that make up these maps is also important (DITA’s rules for how you build DITA key spaces from maps depends entirely on document order). > > > > For example, I have a map that maps “key names” to the elements that declare those key names, i.e.: > > > > map { “key-01” : (<topicref keys=”key-01” href=”foo.dita”/>, <topicref keys=”key-01” href=”bar.dita”/>) } > > > > This is the initial state of the map (reflecting pass 1 over the DITA map document) but then I need to add additional elements to the sequence that is the value of entry “key-01” and I need the resulting sequence to be in document order. > > > > So my question: given two sequences of nodes from the same document, how does one construct a new sequence where the nodes are in document order? > > > > > $seq1 | $seq2 should do, if you want duplicates eliminated. > > > Otherwise perhaps > > > sort(($seq1, $seq2), (), function($n) { index-of(($seq1 | $seq2)!generate-id(), generate-id($n))}) > > >
EK
Eliot Kimber4 Jul 2022 17:48 #
Of course—I should have been able to remember that, although it is not exactly obvious.
Thanks for the function—that definitely makes it clearer what the intent is.
Cheers,
Eliot
_____________________________________________
Eliot Kimber
Sr Staff Content Engineer
O: 512 554 9368
M: 512 554 9368
servicenow.com<https://www.servicenow.com>
LinkedIn<https://www.linkedin.com/company/servicenow> | Twitter<https://twitter.com/servicenow> | YouTube<https://www.youtube.com/user/servicenowinc> | Facebook<https://www.facebook.com/servicenow>
Quoted text · BaseX-Talk · 63 lines
From: BaseX-Talk <basex-talk-bounces at mailman.uni-konstanz.de> on behalf of Christian Grün <christian.gruen at gmail.com> Date: Monday, July 4, 2022 at 10:35 AM To: Martin Honnen <martin.honnen at gmx.de> Cc: BaseX <basex-talk at mailman.uni-konstanz.de> Subject: Re: [basex-talk] How To: Sort nodes in document order? [External Email] Hi Eliot, As a generalized solution (for an arbitrary number of inputs), you can attach a self::node() step (or a simple context item expression "."): ($nodes1, $nodes2, $nodes2)/self::node() The resulting expression will be evaluated as path, and the result will be brought into distinct document order. We’ve added a function for that to make the clean/sort operation more explicit [1]. Cheers, Christian [1] https://urldefense.com/v3/__https://docs.basex.org/wiki/Utility_Module*util:ddo__;Iw!!N4vogdjhuJM!EpBmorLdRqwgF_sFWHiKISiLZoezQRaMuvHbjb0H5zBgTHux9qEmOLss_rHLFMCGkB5eyfVsQ4ryZG6Jhlwdsqbk09MtVVo$<https://urldefense.com/v3/__https:/docs.basex.org/wiki/Utility_Module*util:ddo__;Iw!!N4vogdjhuJM!EpBmorLdRqwgF_sFWHiKISiLZoezQRaMuvHbjb0H5zBgTHux9qEmOLss_rHLFMCGkB5eyfVsQ4ryZG6Jhlwdsqbk09MtVVo$> On Mon, Jul 4, 2022 at 5:29 PM Martin Honnen <martin.honnen at gmx.de> wrote: > > > Am 04.07.2022 um 17:14 schrieb Martin Honnen: > > > Am 04.07.2022 um 17:11 schrieb Eliot Kimber: > > I feel like I should know how to do this (and possibly I’ve previously been told how and have forgotten), but I’m at a loss. > > > > I am implementing a process that gathers nodes from a single document (a DITA map) and constructs a system of maps where I’m using the maps primarily to represent a tree and enable lookup of things by key. > > > > However, the order of the elements that make up these maps is also important (DITA’s rules for how you build DITA key spaces from maps depends entirely on document order). > > > > For example, I have a map that maps “key names” to the elements that declare those key names, i.e.: > > > > map { “key-01” : (<topicref keys=”key-01” href=”foo.dita”/>, <topicref keys=”key-01” href=”bar.dita”/>) } > > > > This is the initial state of the map (reflecting pass 1 over the DITA map document) but then I need to add additional elements to the sequence that is the value of entry “key-01” and I need the resulting sequence to be in document order. > > > > So my question: given two sequences of nodes from the same document, how does one construct a new sequence where the nodes are in document order? > > > > > $seq1 | $seq2 should do, if you want duplicates eliminated. > > > Otherwise perhaps > > > sort(($seq1, $seq2), (), function($n) { index-of(($seq1 | $seq2)!generate-id(), generate-id($n))}) > > >
Written for BaseX 9.7. BaseX may have changed since: please check the current documentation.
⚡Generated with XQuery