Subject: Re: [xsl] Adjacent grouping? From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 17 Nov 2017 18:00:37 -0000 |
Sorry, I misread the requirement. You want a new group if the value is 30+ greater than the FIRST value in the previous group, whereas I thought you were comparing with the LAST value in the previous group. No, I don't think this can be done with grouping: it needs full recursion (or in XSLT 3.0, xsl:iterate). Using xsl:iterate it would be <xsl:iterate select="Content"> <xsl:param name="previous" as="xs:integer?" select="()"/> <xsl:choose> <xsl:when test="empty($previous) or xs:integer(@value) gt @previous+30"> <Content value="{@value}"/> <xsl:next-iteration> <xsl:with-param name="previous" select="@value"/> </xsl:next-iteration> </xsl:when> <xsl:otherwise> <Content value=""/> </xsl:otherwise> </xsl:choose> </xsl:iterate> Michael Kay Saxonica > On 17 Nov 2017, at 17:51, Michael Kay mike@xxxxxxxxxxxx <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote: > > You want to start a new group if @value is greater than preceding-sibling::Content/@value. > > So you can use > > <xsl:for-each-group select="Content" group-starting-with="*[number(@value) gt number(../preceding-sibling::*/@value) + 30]"> > ... > </xsl:for-each-group> > > Michael Kay > Saxonica > >> On 17 Nov 2017, at 17:43, rus tle profrustyleafiii@xxxxxxxxxxx <mailto:profrustyleafiii@xxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx <mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote: >> >> Hello All, >> >> I am trying to remove attribute values in a list based on a frequency parameter. >> >> Is this possible in XSLT 2? I cannot see how to tackle the problem without being able to store the last attribute value added to the result tree so that I can compare against it for the following attribute values? I am told that there is no way to query the result tree and so I am at a loss as to whether XSLT can actually do what I require? >> >> To illustrate, please see the example below. >> >> The frequency parameter is 30. I would like to remove all values that are "within 30" of the last value used. If the first value is 0 then I would like to remove all the following attribute values that are less than 30 plus the last value added to the result tree (in this case 0). The only way I can think to do this is by somehow caching the last value that was copied to the result tree so I can compare against it with the next value. >> >> It was suggested to me that adjacent grouping my work? I am a recent beginner to XSLT and would love to learn more about how it might help me achieve the result I am looking for? >> >> Thanks, >> >> Rusty >> >> Before: >> >> <p frequency=b30"> >> <Content value="0"/> >> <Content value=b10b/> >> <Content value=b15b/> >> <Content value=b18b/> >> <Content value=b22b/> >> <Content value=b26b/> >> <Content value=b34b/> >> <Content value=b37b/> >> <Content value=b56b/> >> <Content value=b99b/> >> <Content value=b101b/> >> <Content value="115"/> >> <Content value="118"/> >> <Content value="129"/> >> </p> >> After: >> >> <p frequency="30"> >> <Content value="00"/> >> <Content value=""/> >> <Content value=""/> >> <Content value=""/> >> <Content value=""/> >> <Content value=""/> >> <Content value="34"/> >> <Content value=""/> >> <Content value=""/> >> <Content value="99"/> >> <Content value=""/> >> <Content value=""/> >> <Content value=""/> >> <Content value="129"/> >> </p> >> >> XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> >> EasyUnsubscribe <x-msg://19/-list/293509> (by email <applewebdata://EAB4634C-8806-4E4F-85C4-8658F324B332>) > > XSL-List info and archive <http://www.mulberrytech.com/xsl/xsl-list> > EasyUnsubscribe <-list/293509> (by email <>)
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Adjacent grouping?, Michael Kay mike@xxx | Thread | Re: [xsl] Adjacent grouping?, Martin Honnen martin |
Re: [xsl] Adjacent grouping?, Michael Kay mike@xxx | Date | Re: [xsl] Adjacent grouping?, Martin Honnen martin |
Month |