- From: Jeni Tennison <jeni@jenitennison.com>
- Date: Thu, 1 Aug 2002 16:39:38 -0400 (EDT)
- To: "Jeff Yemin" <jeffx@thinkshare.com>
- CC: public-qt-comments@w3.org
Hi Jeff, > The best solution we could come up with: > <table xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:for-each-group select="os/o" group-by="concat(@a, ',', @b"> > <tr> > <td> > <xsl:value-of select="current-group()/@id" separator=", "/> > </td> > </tr> </xsl:for-each-group> > </table> > I'm not too happy with having to use concat to generate a group, as > it's difficult to optimize and somewhat unintuitive. I'd like to see > something more like this: I agree. It also doesn't deal well with mixing data types -- if the a attribute was a string and the b attribute was a number, for example. > <xsl:sort-key name="o-sort"> <xsl:sort select="@a"/> <xsl:sort > select="@b"/></xsl:sort-key> > <table xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> > <xsl:for-each-group select="os/o" group-by-sort-key="o-sort"> > <tr> > <td> > <xsl:value-of select="current-group()/@id" separator=", "/> > </td> > </tr> </xsl:for-each-group> > </table> I think that could get a little confusing, given that xsl:sort is used for sorting things elsewhere, and in particular since xsl:sort is also used within the xsl:for-each-group instruction. I've previously suggested using an xsl:group element inside xsl:for-each to do the grouping: <table xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:for-each select="os/o"> <xsl:group select="@a" /> <xsl:group select="@b" /> <tr> <td> <xsl:value-of select="current-group()/@id" separator=", " /> </td> </tr> </xsl:for-each> </table> See http://lists.w3.org/Archives/Public/xsl-editors/2001OctDec/0052.html for the proposal I made. Mike replied at http://lists.w3.org/Archives/Public/xsl-editors/2002JanMar/0036.html that the grouping key could be a sequence and that this would enable you to have compound grouping keys, but this doesn't seem to have filtered through into the WD yet... > Perhaps this is what the committee was thinking of with Issue 54 in > the 2.0 working draft? It wasn't clear to me what exactly was being > addressed there. As I understand Issue 54, it's about specifying a collation to determine whether two strings are the same in order to determine whether two things should be grouped together or not. For example, if you had: <os> <o id= 'Bif' a='a' b='1' /> <o id= 'Bay' a='A' b='1' /> <o id= 'Bob' a='a' b='2' /> <o id= 'May' a='b' b='1' /> <o id= 'Moe' a='b' b='1' /> <o id= 'Mel' a='B' b='2' /> <o id= 'Joe' a='C' b='2' /> <o id= 'Sue' a='d' b='1' /> <os> and a collation called "my:case-insensitive" then you should be able to do: <table xsl:version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:for-each-group select="os/o" group-by="concat(@a, ',', @b)" collation="my:case-insensitive"> <tr> <td> <xsl:value-of select="current-group()/@id" separator=", " /> </td> </tr> </xsl:for-each> </table> to get the output that you were after before -- Bif and Bay would be grouped together because 'a' is equal to 'A' under a case-insensitive collation. Cheers, Jeni --- Jeni Tennison http://www.jenitennison.com/
Received on Thursday, 1 August 2002 17:57:09 UTC