xsl-list
[Top] [All Lists]

Re: [xsl] Slow XSLT

2008-03-14 11:37:58
On 14/03/2008, Michael Kay <mike(_at_)saxonica(_dot_)com> wrote:
A lot has already been said and many suggestions have already
 > been made in this thread to speed up the processing of your
 > stylesheet, but since your stylesheet is rather
 > straightforward I doubt if any of the suggestions really
 > speed up the processing.


I agree, these are all things that might give you 1% improvement. The only
 other thing I can suggest is looking at the format-number() calls. I've
 known that be really slow on some implementations. Try taking it out and
 seeing if it makes any difference.

I would like to propose to move the formating to the css as much as
possible (that means all what is implemented by the browsers you want
to support - this is a lot but OT on this list). Begin your
measurements with the stylesheet below and observe carefully any
changes when you add "string-formating". I use SAXON 6.5.5 with the -t
switch to get the timings. I've changed a few things, if you have
questions don't hesitate to ask.

Manfred

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<!--
java -jar D:\Programme\Saxon6\saxon.jar -t slow0.xml sslow2.xsl
-->
<xsl:param name="axisHeads" select="'true'"/>
<xsl:output indent="yes"/>

<xsl:variable name="msrs" select="count(/Reports/Report/Measures/Measure)"/>

<xsl:template match="/">
        <html>
        <body>
                <table border="1">
                <tbody>
                        <xsl:choose>
                                <xsl:when test="$axisHeads = 'true'">
                                        <xsl:call-template name="apply-set">
                                                <xsl:with-param name="set" 
select="Reports/Report/Columns/*"/>
                                        </xsl:call-template>
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:call-template name="apply-set">
                                                <xsl:with-param name="set" 
select="Reports/Report/Columns/*/*"/>
                                        </xsl:call-template>
                                </xsl:otherwise>
                        </xsl:choose>
                        <xsl:apply-templates select="Reports/Report/Rows/*/*"/>
                </tbody>
                </table>
        </body>
        </html>
</xsl:template>

<xsl:template match="Row">
        <tr>
                <xsl:if test="$axisHeads = 'true'">
                        <th><xsl:value-of select="@heading"/></th>
                </xsl:if>
                <xsl:apply-templates/>
        </tr>
</xsl:template>
<xsl:template match="Cell">
        <xsl:apply-templates/>
</xsl:template>
<xsl:template match="Msr">
        <td><xsl:value-of select="@val"/></td>
</xsl:template>
<xsl:template match="Cell[not(*)]">
        <xsl:for-each select="/Report/Measures/Measure">
                <td/>
        </xsl:for-each>
</xsl:template>
<xsl:template match="text()"/>

<xsl:template name="apply-set">
        <xsl:param name="set"/>
        <tr>
                <xsl:if test="$axisHeads = 'true'">
                        <th/>
                </xsl:if>
                <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:if test="$axisHeads = 'true'">
                                        <th/>
                                </xsl:if>
                                <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">
        <th colspan="{$msrs*count(.//Col)}">
                <div><xsl:value-of select="@heading"/></div>
        </th>
</xsl:template>
<xsl:template match="Col">
        <th colspan="{$msrs}">
                <div><xsl:value-of select="@heading"/></div>
        </th>
</xsl:template>
<xsl:template match="Measure">
        <xsl:param name="pos" />
        <th>
                <div onclick="sortFullGrid({position()}, {$pos}, '')">
                        <xsl:value-of select="@heading"/>
                </div>
        </th>
</xsl:template>
</xsl:stylesheet>

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="Year">
       <Col heading="2003"/>
       <Col heading="2004"/>
     </ColGrp>
   </Columns>
   <Rows>
     <RowGrp heading="Name 1">
       <Row heading="A">
         <Cell/>
         <Cell>
           <Msr idx="1" val="42.00"/>
           <Msr idx="2" val="64230"/>
         </Cell>
       </Row>
       <Row heading="Other">
         <Cell/>
         <Cell>
           <Msr idx="1" val="36.00"/>
           <Msr idx="2" val="35820"/>
         </Cell>
       </Row>
       <Row heading="Another">
         <Cell>
           <Msr idx="1" val="14.20"/>
           <Msr idx="2" val="128030"/>
         </Cell>
         <Cell/>
       </Row>
     </RowGrp>
     <RowGrp heading="">
       <Row heading="Totals">
         <Cell>
           <Msr idx="1" val="14.20"/>
           <Msr idx="2" val="128030.00"/>
         </Cell>
         <Cell>
           <Msr idx="1" val="78.00"/>
           <Msr idx="2" val="100050.00"/>
         </Cell>
       </Row>
     </RowGrp>
   </Rows>
 </Report>
</Reports>

Output HTML:

<html>
   <body>
      <table border="1">
         <tbody>
            <tr>
               <th></th>
               <th colspan="4">
                  <div>Year</div>
               </th>
            </tr>
            <tr>
               <th></th>
               <th colspan="2">
                  <div>2003</div>
               </th>
               <th colspan="2">
                  <div>2004</div>
               </th>
            </tr>
            <tr valign="bottom">
               <th></th>
               <th>
                  <div onclick="sortFullGrid(1, 1, '')">Total Pages</div>
               </th>
               <th>
                  <div onclick="sortFullGrid(2, 1, '')">Cost</div>
               </th>
               <th>
                  <div onclick="sortFullGrid(1, 2, '')">Total Pages</div>
               </th>
               <th>
                  <div onclick="sortFullGrid(2, 2, '')">Cost</div>
               </th>
            </tr>
            <tr>
               <th>A</th>
               <td>42.00</td>
               <td>64230</td>
            </tr>
            <tr>
               <th>Other</th>
               <td>36.00</td>
               <td>35820</td>
            </tr>
            <tr>
               <th>Another</th>
               <td>14.20</td>
               <td>128030</td>
            </tr>
            <tr>
               <th>Totals</th>
               <td>14.20</td>
               <td>128030.00</td>
               <td>78.00</td>
               <td>100050.00</td>
            </tr>
         </tbody>
      </table>
   </body>
</html>

--~------------------------------------------------------------------
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>