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:54:41 -0000 |
On Tue, Dec 28, 2021 at 3:47 PM Michael Kay mike@xxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > For a solution that delivers distinct nodes in order of first appearance, my preference would be > > nodes => fold-left((), function($all, $this) {if ($all intersect $this) then $all else ($all, $this)}) $nodes[index-of($nodes ! generate-id(.), generate-id(.))[1]] This seems a candidate for "the shortest solution" and it shouldn't be inefficient, given a good optimizer: Cheers, Dimitre On Tue, Dec 28, 2021 at 3:47 PM Michael Kay mike@xxxxxxxxxxxx < xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > For a solution that delivers distinct nodes in order of first appearance, > my preference would be > > $nodes => fold-left((), function($all, $this) {if ($all intersect $this) > then $all else ($all, $this)}) > > It's likely to be O(n^2) in most implementations, whereas Martin Honnen's > solution is probably O(n log n) -- but this one is XPath rather than > XQuery, and feels more elegant. > > Michael Kay > Saxonica > > On 28 Dec 2021, at 21:56, 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/293509> (by > email) > > > 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, Michael Kay mike@xxx | Thread | Re: [xsl] XQuery/XPath 3.1: Node Li, Michael Kay mike@xxx |
Re: [xsl] XQuery/XPath 3.1: Node Li, Michael Kay mike@xxx | Date | Re: [xsl] XQuery/XPath 3.1: Node Li, Michael Kay mike@xxx |
Month |