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(_at_)sten-net(_dot_)de]
Sent: 12 December 2004 03:58
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--