Subject: RE: [xsl] grouping/position problem From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Sun, 24 Apr 2005 14:10:23 +0100 |
In effect you need to sort by year before you group by year, and set shorten-author to true for all but the first item in the list of items for an author in year order. Something like: <xsl:template match="list" mode="sort_author-year"> <xsl:for-each-group select="item" group-by="@author"> <xsl:sort select="current-grouping-key()"/> <xsl:variable name="items-for-author-sorted-by-year as="element(item)*"> <xsl:perform-sort select="current-group()"> <xsl:sort select="@year"/> </xsl:perform-sort> <xsl:variable> <xsl:variable name="first-item-for-author" as="element(item)" select="$items-for-author-sorted-by-year[1]"/> <xsl:for-each-group select="$items-for-author-sorted-by-year" group-adjacent="@year" <xsl:for-each select="current-group()"> <xsl:variable name="year"> <xsl:value-of select="current-grouping-key()"/> <xsl:if test="last() > 1"> <xsl:number value="position()" format="a"/> </xsl:if> </xsl:variable> <xsl:variable name="shorten-author" as="xs:boolean" select="not(. is $first-item-for-author)" /> Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Bruce D'Arcus [mailto:bdarcus@xxxxxxxxx] > Sent: 24 April 2005 00:21 > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] grouping/position problem > > > Actually, I need to correct two things on my reply to Mike; first the > template needs to put the year variable within the year-grouped > for-each (it was outside the for-each). So: > > <xsl:template match="list" mode="sort_author-year"> > <xsl:for-each-group select="item" group-by="@author"> > <xsl:sort select="current-grouping-key()"/> > <xsl:for-each-group select="current-group()" group-by="@year"> > <xsl:sort select="current-grouping-key()" /> > <xsl:for-each select="current-group()"> > <xsl:variable name="year"> > <xsl:value-of select="current-grouping-key()"/> > <xsl:if test="last() > 1"> > <xsl:number value="position()" format="a"/> > </xsl:if> > </xsl:variable> > <xsl:variable name="author-position" select="position()"/> > <xsl:variable name="shorten-author" > as="xs:boolean"select="$author-position > 1" /> > <xsl:apply-templates select="."> > <xsl:with-param name="year" select="$year"/> > <xsl:with-param > name="shorten-author"select="$shorten-author"/> > </xsl:apply-templates> > </xsl:for-each> > </xsl:for-each-group> > </xsl:for-each-group> > </xsl:template> > > Therefore this is wrong: > > > ... here's the expected result: > > > > <result> > > <item> > > <shorten-author>false</shorten-author> > > <year>2001a</year> > > </item> > > <item> > > <shorten-author>true</shorten-author> > > <year>2001a</year> > > </item> > > <item> > > <shorten-author>true</shorten-author> > > <year>2002b</year> > > </item> > > </result> > > It should be: > > <result> > <item> > <shorten-author>false</shorten-author> > <year>2001a</year> > </item> > <item> > <shorten-author>true</shorten-author> > <year>2001a</year> > </item> > <item> > <shorten-author>true</shorten-author> > <year>2002</year> > </item> > </result> > > Note the last year. > > Bruce
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] grouping/position problem, Bruce D'Arcus | Thread | Re: [xsl] grouping/position problem, Bruce D'Arcus |
RE: [xsl] XSL distinct group by dat, Michael Kay | Date | [xsl] Adding line breaks in Title a, Carl Jenkins |
Month |