Subject: Re: [xsl] XQuery/XPath 3.1: Node List to Node Set ("distinct nodes") From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Wed, 29 Dec 2021 18:33:29 -0000 |
> So given this expression: > > fold-left($nodes, (), function($a, $n) { $a, $n except $a }) > > I understand this to be iterating over $nodes from left to right, applying the function function($a, $n) to each node, where $a is the next node and $n is the accumulated value (being the result returned by the function on each invocation). > > The b$a, $n except $ab in the function body constructs a new sequence of ($a, $n), excluding $a if it is already in $n. This sequence is then passed as the second parameter of the next invocation of the function. This has the effect of preserving the order of input node list. > Almost but not quite. $a is the set of distinct nodes found so far, $n is the node currently being examined. So ($n except $a) is the node currently being examined if it isn't present in $a, and is the empty sequence otherwise. As Dimitre says, ($n except $a) where $n is a singleton isn't immediately intuitive - but intuition takes practice! As it happens, Saxon probably does a better job of optimizing the more complex expression $n[not(. intersect $a)] -- though it's still O(n*m). Michael Kay Saxonica
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XQuery/XPath 3.1: Node Li, Eliot Kimber eliot.k | Thread | Re: [xsl] XQuery/XPath 3.1: Node Li, Liam R. E. Quin liam |
Re: [xsl] XQuery/XPath 3.1: Node Li, Martin Honnen martin | Date | Re: [xsl] XQuery/XPath 3.1: Node Li, Dimitre Novatchev dn |
Month |