Subject: Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes") From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Tue, 28 Dec 2021 23:36:19 -0000 |
To see that the original sequence order is preserved in the result, here is a complete example: let $xml := parse-xml("<t><a/><b/><c/></t>"), $nodes := ($xml/*/a, $xml/*/c, $xml/*/b, $xml/*/a, $xml/*/b ), $ids := distinct-values($nodes ! generate-id(.)) return $ids ! (function($id) {$nodes[generate-id(.) eq $id][1]})(.) produces: <a/> <c/> <b/> On Tue, Dec 28, 2021 at 3:32 PM Dimitre Novatchev dnovatchev@xxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > > On Tue, Dec 28, 2021 at 3:29 PM Dimitre Novatchev <dnovatchev@xxxxxxxxx> > wrote: > >> A pure XPath solution: >> >> let $ids := distinct-values($nodes ! generate-id(.)) >> return $ids ! (function($id) {$nodes[generate-id(.) eq $id][1]})(.) >> >> Happy New Year to all ! >> > > > Hit Send too early: > > Do notice: this seems the only solution of all presented so far, that > preserves the original sequence order (not document order) of the nodes. > > > >> >> On Tue, Dec 28, 2021 at 2:39 PM Wendell Piez wapiez@xxxxxxxxxxxxxxx < >> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >> >>> Eliot and XSL-List, >>> >>> Along similar lines to $nodes | (), consider >>> >>> $nodes except () >>> $nodes intersect $nodes >>> >>> I'm finding it difficult to argue what's most intuitive but I kind of >>> like 'intersect'. Can't vouch for performance though. :-) >>> >>> Best wishes for 2022 -- >>> Wendell >>> >>> >>> >>> >>> On Tue, Dec 28, 2021 at 4:56 PM Michael Kay mike@xxxxxxxxxxxx < >>> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >>> >>>> You might consider >>>> >>>> $nodes | () >>>> >>>> a bit more intuitive. >>>> >>>> Michael Kay >>>> Saxonica >>>> >>>> On 28 Dec 2021, at 19:23, Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx < >>>> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: >>>> >>>> Hmph. >>>> >>>> That is certainly much more efficient p but is not necessarily >>>> obvious (at least not to me). >>>> >>>> Thanks! >>>> >>>> E. >>>> >>>> _____________________________________________ >>>> *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> >>>> >>>> >>>> *From: *Martin Honnen martin.honnen@xxxxxx < >>>> xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> >>>> *Date: *Tuesday, December 28, 2021 at 1:15 PM >>>> *To: *xsl-list@xxxxxxxxxxxxxxxxxxxxxx <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> >>>> *Subject: *Re: [xsl] XQuery/XPath 3.1: Node List to Node Set >>>> ("distinct nodes") >>>> >>>> [External Email] >>>> >>>> >>>> On 28.12.2021 20:10, Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx wrote: >>>> > I couldnbt find an answer in my google and markmail searching so I >>>> > thought Ibd ask here: >>>> > >>>> > Given an arbitrary list of nodes that may contain duplicates, what is >>>> > the most efficient way to reduce the node list to a set? >>>> > >>>> > The solution I came up with is a recursive function: >>>> > >>>> > (: >>>> > >>>> > Get the unique nodes from the supplied sequence >>>> > >>>> > @param nodes The sequence of nodes to evaluate >>>> > >>>> > @return A sequence of nodes such that each node in $nodes exists >>>> exactly >>>> > once. >>>> > >>>> > :) >>>> > >>>> > declare function dutils:distinctNodes($nodes as node()*) as node()* { >>>> > >>>> > dutils:_getDistinctNodes($nodes, ()) >>>> > >>>> > }; >>>> > >>>> > declare function dutils:_getDistinctNodes($nodes as node()*, >>>> $resultList >>>> > as node()*) as node()* { >>>> > >>>> > if (exists($nodes)) >>>> > >>>> > then >>>> > >>>> > let $node := head($nodes) >>>> > >>>> > return dutils:_getDistinctNodes(tail($nodes), ($resultList | >>>> $node)) >>>> > >>>> > else $resultList >>>> > >>>> > }; >>>> > >>>> > Which works but I feel like Ibm missing some obvious way to do this >>>> more >>>> > directly, but Ibm not seeing it. >>>> > >>>> > Am I missing a better solution? >>>> >>>> $nodes/. >>>> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >>>> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by >>>> email) >>>> >>>> >>>> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >>>> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/174322> (by >>>> email) >>>> >>> >>> >>> -- >>> ...Wendell Piez... ...wendell -at- nist -dot- gov... >>> ...wendellpiez.com... ...pellucidliterature.org... ...pausepress.org... >>> ...github.com/wendellpiez... ...gitlab.coko.foundation/wendell... >>> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >>> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/782854> (by >>> email) >>> >> >> >> -- >> Cheers, >> Dimitre Novatchev >> --------------------------------------- >> Truly great madness cannot be achieved without significant intelligence. >> --------------------------------------- >> To invent, you need a good imagination and a pile of junk >> ------------------------------------- >> Never fight an inanimate object >> ------------------------------------- >> To avoid situations in which you might make mistakes may be the >> biggest mistake of all >> ------------------------------------ >> Quality means doing it right when no one is looking. >> ------------------------------------- >> You've achieved success in your field when you don't know whether what >> you're doing is work or play >> ------------------------------------- >> To achieve the impossible dream, try going to sleep. >> ------------------------------------- >> Facts do not cease to exist because they are ignored. >> ------------------------------------- >> Typing monkeys will write all Shakespeare's works in 200yrs.Will they >> write all patents, too? :) >> ------------------------------------- >> Sanity is madness put to good use. >> ------------------------------------- >> I finally figured out the only reason to be alive is to enjoy it. >> >> > > > -- > Cheers, > Dimitre Novatchev > --------------------------------------- > Truly great madness cannot be achieved without significant intelligence. > --------------------------------------- > To invent, you need a good imagination and a pile of junk > ------------------------------------- > Never fight an inanimate object > ------------------------------------- > To avoid situations in which you might make mistakes may be the > biggest mistake of all > ------------------------------------ > Quality means doing it right when no one is looking. > ------------------------------------- > You've achieved success in your field when you don't know whether what > you're doing is work or play > ------------------------------------- > To achieve the impossible dream, try going to sleep. > ------------------------------------- > Facts do not cease to exist because they are ignored. > ------------------------------------- > Typing monkeys will write all Shakespeare's works in 200yrs.Will they > write all patents, too? :) > ------------------------------------- > Sanity is madness put to good use. > ------------------------------------- > I finally figured out the only reason to be alive is to enjoy it. > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/782854> (by > email <>) > -- Cheers, Dimitre Novatchev --------------------------------------- Truly great madness cannot be achieved without significant intelligence. --------------------------------------- To invent, you need a good imagination and a pile of junk ------------------------------------- Never fight an inanimate object ------------------------------------- To avoid situations in which you might make mistakes may be the biggest mistake of all ------------------------------------ Quality means doing it right when no one is looking. ------------------------------------- You've achieved success in your field when you don't know whether what you're doing is work or play ------------------------------------- To achieve the impossible dream, try going to sleep. ------------------------------------- Facts do not cease to exist because they are ignored. ------------------------------------- Typing monkeys will write all Shakespeare's works in 200yrs.Will they write all patents, too? :) ------------------------------------- Sanity is madness put to good use. ------------------------------------- I finally figured out the only reason to be alive is to enjoy it.
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XQuery/XPath 3.1: Node Li, Dimitre Novatchev dn | Thread | Re: [xsl] XQuery/XPath 3.1: Node Li, Martin Honnen martin |
Re: [xsl] XQuery/XPath 3.1: Node Li, Dimitre Novatchev dn | Date | Re: [xsl] XQuery/XPath 3.1: Node Li, Michael Kay mike@xxx |
Month |