RE: [xsl] Grouping problem

Subject: RE: [xsl] Grouping problem
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Fri, 15 Feb 2008 13:17:36 -0000
Unfortunately your desired output is very badly formatted. I'm having
trouble interpreting it. It seems to have Cs and Ds in it and I can't see
where these are supposed to come from.

The basic problem of creating one column for each distinct value of "due" is
best handled using logic like this:

<xsl:value-of select="due-values" select="distinct-values(item/due)"/>
<tr>
  <td/>
  <xsl:for-each select="$due-values"> 
    <td><xsl:value-of select="."/></td>
  </xsl:for-each>
</tr>
<xsl:for-each-group select="item" group-by="ccode">
<tr>
  <td><xsl:value-of select="current-grouping-key()"/></td>
  <xsl:for-each select="$due-values"> 
    <td><xsl:value-of select="current-group()[@due = current()]"/></td>
  </xsl:for-each> 
</tr>

Michael Kay
http://www.saxonica.com/ 

> -----Original Message-----
> From: Eugene Bernard [mailto:eugene.bernard@xxxxxxxxx] 
> Sent: 15 February 2008 04:01
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] Fwd:
> 
> Hi all
> 
> Using the below XML data (Partial listing) and XSL, I am 
> getting the HTML output as below.
> 
> How to make it to compact horizontally tabulated HTML output 
> like this (to limit the size of my mail i have removed html tags)
> 
> HTML Output :
> 
> Code Due          Press ID    Qty
> ---------------------------------------------
> A001
> ----------------------------------------------
>      Beyond Mar
>                               Press A     100
>                              Press B     219
>      Feb Due
>                             Press A      47
>                             Press B     365
>      Mar Due
>                             Press A      84
>                             Press B     256
>      Over Due
>                             Press B       2
> --------------------------------
> 
> HTML Output (Desired):
> 
> CODE    BEYOND MAR      FEB DUE         MAR DUE       OVER DUE
>               A    B     C       D       A   B   C   D        A  B  C
>  D        A   B   C    D
> A001  100  219                      47  365               84  256
>                 2
> 
> XML:
> 
> <?xml version="1.0" ?>
> - <mpour>
> - <item>
>   <ccode>A004</ccode>
>   <due>Beyond Mar</due>
>   <line>Press A</line>
>   <pour>409</pour>
>   <weight>3476.50</weight>
>   </item>
> - <item>
>   <ccode>A004</ccode>
>   <due>Beyond Mar</due>
>   <line>Press A</line>
>   <pour>300</pour>
>   <weight>2550.00</weight>
>   </item>
> - <item>
>   <ccode>A004</ccode>
>   <due>Beyond Mar</due>
>   <line>Press A</line>
>   <pour>500</pour>
>   <weight>4250.00</weight>
>   </item>
> - <item>
> 
> XSL :
> 
> <xsl:stylesheet version="2.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>     <xsl:template match="mpour">
>         <table border="1" cellspacing="0"
> cellpadding="4"><tr><td>Code</td><td>Due</td><td>Press
> ID</td><td>Qty</td></tr>
>            <xsl:for-each-group select="item" group-by="ccode">
>                 <xsl:sort select="current-grouping-key()"/>
>                 <tr>
>                     <td><xsl:value-of select="ccode"/></td>
>                     <td/>
>                     <td/>
>                                         <td/>
>                 </tr>
>                 <xsl:for-each-group select="current-group()" 
> group-by="due">
>                     <xsl:sort select="current-grouping-key()"/>
>                     <tr>
>                         <td/>
>                         <td><xsl:value-of select="due"/></td>
>                         <td/>
>                         <td/>
>                     </tr>
>       <xsl:for-each-group select="current-group()" group-by="line">
>                         <xsl:sort select="current-grouping-key()"/>
>                         <tr>
>                             <td/>
>                             <td/>
>                    <td><xsl:value-of select="line"/></td>
>               <td align="right"><xsl:value-of 
> select="format-number(sum(current-group()/pour),'######.##')" /></td>
>                                       </tr>
>                     </xsl:for-each-group>
>                 </xsl:for-each-group>
>             </xsl:for-each-group>
>         </table>
>     </xsl:template>
> </xsl:stylesheet>
> 
> 
> 
> Regards
>  Eugene

Current Thread