xsl-list
[Top] [All Lists]

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

2004-12-12 11:45:07
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>
--~--