Subject: RE: [xsl] Transform list of elements to a sorted and dynamic HTML table From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Sun, 12 Dec 2004 18:45:07 -0000 |
First sort: <xsl:variable name="sorted-names" as="element(td)*"> <xsl:perform-sort select="item"> <xsl:sort select="date" order="descending"/> <td><xsl:sequence select="string(name)"/></td> </xsl:perform-sort> </xsl:variable> Then group: <xsl:variable name="last-colspan" select="$columns - (count($sorted-names) mod $columns) + 1 <xsl:for-each-group select="$sorted-names" group-adjacent="position()-1 idiv $columns"> <tr> <xsl:for-each select="current-group()"> <xsl:choose> <xsl:when test=". is $sorted-names[last()] and $last-colspan ne 1"> <td colspan="{$last-colspan}"> <xsl:sequence select="string(.)"/> </td> <xsl:otherwise> <xsl:sequence select="."/> </xsl:otherwise> </xsl:choose> </xsl:for-each> </tr> </xsl:for-each-group> Not tested. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Jannis Pohlmann [mailto:info@xxxxxxxxxxx] > Sent: 12 December 2004 03:58 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Transform list of elements to a sorted and > dynamic HTML table > > Good morning, > > I have a list of items, e.g.: > > <item> > <name>Adoreable</name> > <date>2004-12-11</date> > </item> > <item> > <name>Adjustable</name> > <date>2004-12-11</date> > </item> > <item> > <name>Bulk</name> > <date>2004-12-10</date> > </item> > <item> > <name>Condensed</name> > <date>2004-12-12</date> > </item> > <item> > <name>Compromise</name> > <date>2004-11-08</date> > </item> > > and I want them to be transformed to a sorted and dynamic > (columns and rows > adjustable by variables - $Columns and $Rows) HTML table (using > recent Version of Saxon and XSLT2.0). The sort element are > the <date/>-Elements > (descending), so the table output had to look like this > ($Columns = 2, $Rows = 2): > > <table> > <tr> > <td>Condensed</td> > <td>Adjustable</td> > </tr> > <tr> > <td>Adoreable</td> > <td>Bulk</td> > </tr> > <tr> > <td colspan="2">Compromise</td> > </tr> > </table> > > If there are not enough items to fill the columns of the last > row its last <td> should > have a "colspan" attribute in order to satisfy layout > requirements. No empty > rows should be created (e.g. if there are not enough items to > fill all <$Rows> rows). > > As you may see there exists a second sort element (<name/>, > ascending) in my example > but this is no must-have feature. > > An alternative way might be to select the first <$Columns * > $Rows> items (sorted descendingly > by <date/>, of course) - but I see no solution for this, right now. > > Is there a way to handle this problem with the power of XSLT? > > Regards, > Jannis
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Transform list of element, Jannis Pohlmann | Thread | Re: [xsl] Transform list of element, Jannis Pohlmann |
Re: [xsl] Transform list of element, Jannis Pohlmann | Date | RE: [xsl] How to use xPath expressi, Michael Kay |
Month |