xsl-list
[Top] [All Lists]

Re: [xsl] Slow XSLT

2008-03-03 11:49:20
Hi Manfread,

I truly appreciate your help. You are real star :)

I have just seen your post and before I try your
changes I would like to ask you what this line does
i.e. which template does it call?

<xsl:apply-templates select="$set"/>

Where is this template being called from?

<xsl:template match="Col">
  <td colspan="{$msrs}">
   <div><xsl:value-of select="@heading"/></div>
  </td>
</xsl:template>

Cheers

C


--- Manfred Staudinger <manfred(_dot_)staudinger(_at_)gmail(_dot_)com>
wrote:

Hi,

No wonder you felt confused, I was wrong. Only after
sitting down with
the problem I realized that this needs a recursive
call for a named
template: it is used to produce one row  with
apply-templates and then
go down one level. If we are at the bottom, process
the Measures and
quit.
You will have no difficulty to add the attributes I
left out for
readability. If you want to use $axisHeads = false()
then the most
natural way would be to begin processing one level
below by setting
      <xsl:variable name="set"
select="Reports/Report/Columns/ColGrp/*"/>
Hope this helps,

Manfred

XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output indent="yes"/>
<xsl:variable name="msrs"
select="count(/Reports/Report/Measures/Measure)"/>

<xsl:template match="/">
      <html>
      <body>
              <table>
              <tbody>
                      <xsl:variable name="set"
select="Reports/Report/Columns/ColGrp"/>
                      <xsl:call-template name="apply-set">
                              <xsl:with-param name="set" select="$set"/>
                      </xsl:call-template>
              </tbody>
              </table>
      </body>
      </html>
</xsl:template>

<xsl:template name="apply-set">
      <xsl:param name="set"/>
      <tr>
              <xsl:apply-templates select="$set"/>
      </tr>
      <xsl:choose>
              <xsl:when test="$set/*">
                      <xsl:call-template name="apply-set">
                              <xsl:with-param name="set" select="$set/*"/>
                      </xsl:call-template>
              </xsl:when>
              <xsl:otherwise>
                      <tr valign="bottom">
                              <xsl:for-each select="$set">
                                      <xsl:apply-templates
select="/Reports/Report/Measures/*">
                                              <xsl:with-param name="pos"
select="position()"/>
                                      </xsl:apply-templates>
                              </xsl:for-each>
                      </tr>
              </xsl:otherwise>
      </xsl:choose>
</xsl:template>

<xsl:template match="ColGrp">
      <td colspan="{$msrs*count(.//Col)}">
              <div><xsl:value-of select="@heading"/></div>
      </td>
</xsl:template>
<xsl:template match="Col">
      <td colspan="{$msrs}">
              <div><xsl:value-of select="@heading"/></div>
      </td>
</xsl:template>
<xsl:template match="Measure">
      <xsl:param name="pos" />
      <td align="center">
              <div onclick="sortFullGrid({position()}, {$pos},
'')">
                      <xsl:value-of select="@heading"/>
              </div>
      </td>
</xsl:template>

</xsl:stylesheet>

INPUT XML:
<?xml version="1.0" encoding="UTF-8" ?>
<Reports>
 <Report>
 <Measures>
   <Measure idx="1" heading="Total Pages" />
   <Measure idx="2" heading="Cost" />
 </Measures>
 <Columns>
   <ColGrp heading="Quarter">
     <ColGrp heading="2003">
       <Col heading="Quarter 1" />
       <Col heading="Quarter 2" />
     </ColGrp>
     <ColGrp heading="2004">
       <Col heading="Quarter 1" />
       <Col heading="Quarter 2" />
     </ColGrp>
   </ColGrp>
   <ColGrp>
     <ColGrp>
       <Col heading="Total" />
     </ColGrp>
   </ColGrp>
 </Columns>
 </Report>
</Reports>

OUTPUT HTML:
<html>
   <body>
      <table>
         <tbody>
            <tr>
               <td colspan="8">
                  <div>Quarter</div>
               </td>
               <td colspan="2">
                  <div></div>
               </td>
            </tr>
            <tr>
               <td colspan="4">
                  <div>2003</div>
               </td>
               <td colspan="4">
                  <div>2004</div>
               </td>
               <td colspan="2">
                  <div></div>
               </td>
            </tr>
            <tr>
               <td colspan="2">
                  <div>Quarter 1</div>
               </td>
               <td colspan="2">
                  <div>Quarter 2</div>
               </td>
               <td colspan="2">
                  <div>Quarter 1</div>
               </td>
               <td colspan="2">
                  <div>Quarter 2</div>
               </td>
               <td colspan="2">
                  <div>Total</div>
               </td>
            </tr>
            <tr valign="bottom">
               <td align="center">
                  <div onclick="sortFullGrid(1, 1,
'')">Total Pages</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(2, 1,
'')">Cost</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(1, 2,
'')">Total Pages</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(2, 2,
'')">Cost</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(1, 3,
'')">Total Pages</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(2, 3,
'')">Cost</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(1, 4,
'')">Total Pages</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(2, 4,
'')">Cost</div>
               </td>
               <td align="center">
                  <div onclick="sortFullGrid(1, 5,
'')">Total Pages</div>
               </td>
               <td align="center">

=== message truncated ===



                
___________________________________________________________ 
NEW Yahoo! Cars - sell your car and browse thousands of new and used cars 
online! http://uk.cars.yahoo.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>
--~--

<Prev in Thread] Current Thread [Next in Thread>