Subject: Re: [xsl] Transform list of elements to a sorted and dynamic HTML table From: Jannis Pohlmann <info@xxxxxxxxxxx> Date: Mon, 13 Dec 2004 00:35:37 +0100 |
<xsl:variable name="Rows">3</xsl:variable> <xsl:variable name="Columns">4</xsl:variable>
<xsl:variable name="SortedItems"> <xsl:for-each select="//items"> <xsl:sort select="date" order="descending"/> <xsl:sort select="name" order="ascending"/> <xsl:if test="position() le $Rows * $Columns"> <xsl:sequence select="."/> </xsl:if> </xsl:for-each> </xsl:variable>
<!-- Insert formatted item data --> <xsl:apply-templates select="." mode="cell-content"/> </td> </xsl:for-each> </tr> </xsl:if> </xsl:for-each>
<xsl:template match="//item" mode="cell-content"> <xsl:value-of select="name"/> </xsl:template>
Regards, Jannis
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, Michael Kay | Thread | [xsl] Translate characters in a str, M. Carlson |
[xsl] functions and sequences, Bruce D'Arcus | Date | RE: [xsl] functions and sequences, Michael Kay |
Month |