RE: [xsl] Transform list of elements to a sorted and dynamic HTML table

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