This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Sorting and grouping
- From: "Michael Kay" <michael dot h dot kay at ntlworld dot com>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Wed, 2 Oct 2002 11:24:28 +0100
- Subject: RE: [xsl] Sorting and grouping
- Reply-to: xsl-list at lists dot mulberrytech dot com
> I have a non-sorted list I want to sort, but I also want to
> know when a group is new.
Try not to think so procedurally: you're not interested in when things
happen, only in how the output is functionally related to the input.
Generally with sorting-then-grouping problems I advise a two-phase
transformation, using a temporary tree (result tree fragment) as the
intermediate result. This needs the xx:node-set() extension to access
this tree in the second phase.
Michael Kay
Software AG
home: Michael.H.Kay@ntlworld.com
work: Michael.Kay@softwareag.com
I've managed to do this using
> for-each, sort and an if with a "not preceding". (Thanks to
> the faq and posts in this list)
>
> But the "not preceding" is not looking at the sorted order -
> it's looking at the orginal order in the XML-file. I want it
> to "search" the sorted list.
>
> Example:
>
> XSL:
> <xsl:output method="html" />
>
> <xsl:template match="check">
> <html>
> <table border="1">
> <tr><th>new</th><th>i</th><th>g</th></tr>
> <xsl:for-each select="news"><xsl:sort select="@i"
> order="descending"/> <tr> <td><xsl:if
> test="not(preceding::g=g)">*</xsl:if></td>
> <td><xsl:value-of select="@i"/></td>
> <td><xsl:value-of select="g"/></td>
> </tr>
> </xsl:for-each>
>
> </table>
> </html>
> </xsl:template>
>
> </xsl:stylesheet>
>
> XML:
> <check>
> <news i="6"><g>3</g></news>
> <news i="1"><g>2</g></news>
> <news i="5"><g>2</g></news>
> <news i="4"><g>1</g></news>
> <news i="3"><g>1</g></news>
> <news i="2"><g>3</g></news>
> </check>
>
> This outputs : (n = new, i=item, g=group)
> n i g
> * 6 3
> 5 2
> * 4 1
> 3 1
> 2 3
> * 1 2 <- i=1 is the first use of group 2 in the XML
>
>
> But I want it to output :
>
> n i g
> * 6 3
> * 5 2 <- i=5 is the first use of group 2 in the sorted list
> * 4 1
> 3 1
> 2 3
> 1 2
>
>
> Thanks in advance for any help!
>
> Regards
> Martin Gundersen
> martin@gundersen.com
> Oslo, Norway
>
> XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
>
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list