Subject: Re: [xsl] XSLT repetition constructs From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Thu, 7 Mar 2019 15:19:04 -0000 |
The best I could come up with was tail(fold-left($x, 0, function($a, $b) {$a, $a[last()] + $b})) Your solution could be rewritten fold-left($x, (), function($a, $b) {$a, ($a[last()], 0)[1] + $b}) Another option is fold-left(tail($x), $x[1], function($a, $b) {$a, $a[last()] + $b}) xsl:iterate is more intuitive though of course more verbose: <xsl:iterate select="1 to 4"> <xsl:param name="total" select="0"/> <xsl:variable name="new-total" select="$total + ."/> <xsl:sequence select="$new-total"/> <xsl:next-iteration> <xsl:with-param name="total" select="$new-total"/> </xsl:next-iteration> </xsl:iterate> Michael Kay Saxonica > On 7 Mar 2019, at 13:28, Martin Honnen martin.honnen@xxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > Am 07.03.2019 um 12:55 schrieb Michael Kay mike@xxxxxxxxxxxx: >> A good simple use case for fold-left() is to accumulate a running total, i.e. turn (1,2,3,4) into (1,3,6,10). >> > > The example to simply compute the running total (e.g. map (1,2,3,4) to 10) is in the spec with > > fold-left((1 to 4), 0, function($a, $b) { $a + $b}) > > > But to map the whole sequence (1,2,3,4) with fold-left to a new sequence of (1,3,6,10) I am already struggling to express that in a compact way, is > > fold-left( > (1 to 4), > (), > function ($a, $b) { $a, if (empty($a)) then $b else $b + $a[last()] } > ) > > a good way? Or can the third argument, the function be expressed in a more compact way?
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XSLT repetition construct, Dimitre Novatchev dn | Thread | Re: [xsl] XSLT repetition construct, Mukul Gandhi gandhi. |
Re: [xsl] XSLT repetition construct, Dimitre Novatchev dn | Date | Re: [xsl] XSLT repetition construct, Dimitre Novatchev dn |
Month |