[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: XQuery/XPath 3.1: Node List to Node Set ("distinct
Here is an improved (and shorter) version of the fold-left() solution: fold-left($nodes, (), function($a, $n) { $a, $n except $a }) Michael Kay Saxonica > On 28 Dec 2021, at 23:47, 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 <mailto:mike@xxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto: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 <mailto:eliot.kimber@xxxxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto: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 <mailto:martin.honnen@xxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> >>> Date: Tuesday, December 28, 2021 at 1:15 PM >>> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx> <xsl-list@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list@xxxxxxxxxxxxxxxxxxxxxx>> >>> Subject: Re: XQuery/XPath 3.1: Node List to Node Set ("distinct nodes") >>> >>> [External Email] >>> >>> >>> On 28.12.2021 20:10, Eliot Kimber eliot.kimber@xxxxxxxxxxxxxx <mailto: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 <applewebdata://3792D7E5-E104-4EE8-A576-A07AB4CDFB7B>) >> >> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >> EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by email <applewebdata://3792D7E5-E104-4EE8-A576-A07AB4CDFB7B>) > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <http://lists.mulberrytech.com/unsub/xsl-list/293509> (by email <>)
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|