xsl-list
[Top] [All Lists]

Re: [xsl] Slow XSLT

2008-03-14 10:48:09
Hi Tony,

Thanks for your input.

I am trying to digest all the suggestions you made in
your post. Thanks.

Meanwhile I have made some changes to my mrs template
as per your suggestion. I did not quite understand the
bit you said I do not need to use the 'if' statement.
Can you please elaborate on that?

This is what I have changed:

<xsl:template match="Msr">
    <xsl:variable name="numberVal" select="@val"/>
    <xsl:choose>
      <!--<xsl:when test="string(number(@val))
='NaN'">-->
      <xsl:when test="not(number($numberVal))">
        <td align="left" style="overflow:none">
          <nobr>
            <div style="width:80px;overflow:none">
              <xsl:value-of select="$numberVal"/>
            </div>
          </nobr>
        </td>
      </xsl:when>
      <xsl:otherwise>
        <td align="right" style="overflow:none">
          <nobr>
            <div style="width:80px;overflow:none">
              <xsl:variable name="style"
select="@class"/>
              <xsl:if test="$numberVal != ''">
                <xsl:choose>
                  <xsl:when test="$style='num1'">
                    <xsl:value-of
select="format-number($numberVal,'###,')"/>
                  </xsl:when>
                  <xsl:when test="$style='cur1'">
                    <xsl:value-of
select="format-number($numberVal,$ltCurFormat)"/>
                  </xsl:when>
                  <!--<xsl:when test="$numberVal =
'-1' or $numberVal = '0'">
                    <xsl:text
xml:space="preserve">-</xsl:text>
                  </xsl:when>-->
                  <xsl:when test="$numberVal = '-1' or
$numberVal = '0'">
                    <xsl:text
xml:space="preserve">-</xsl:text>
                  </xsl:when>
                  <xsl:when test="$style='percent'">
                    <xsl:value-of
select="format-number($numberVal * 100,'0.00')"/>
                    <xsl:text>%</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of
select="format-number($numberVal,$ltNumFormat)"/>
                  </xsl:otherwise>
                </xsl:choose>
              </xsl:if>
              <xsl:if test="$numberVal = ''">
                <xsl:text
xml:space="preserve">-</xsl:text>
              </xsl:if>
            </div>
          </nobr>
        </td>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

--- Tony Graham <Tony(_dot_)Graham(_at_)MenteithConsulting(_dot_)com>
wrote:

On Thu, Mar 13 2008 16:33:02 +0000,
cleytonjordan(_at_)yahoo(_dot_)co(_dot_)uk wrote:
Here is the latest working XSLT however it is slow
_________________________________________________

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
  <xsl:strip-space elements="*"/>

  <xsl:decimal-format name="fd1"
decimal-separator="."
grouping-separator="," NaN=" \"/>

fd1 appears to be unused.

  <xsl:param name="axisHeads" select="'false'"/>
  <xsl:param name="sortCol" select="'0'"/>
  <xsl:param name="sortCell" select="'0'"/>
  <xsl:param name="dataType" select="'text'"/>
  <xsl:param name="sortOrder"
select="'ascending'"/>
  <xsl:param name="ltCurFormat"
select="'$##,###.00'"/>
  <xsl:param name="ltNumFormat"
select="'###,.00'"/>

Saxon 6.5.5 objects to this number format.

  <xsl:param name="heading"/>
  <xsl:param name="height" select="'500'"/>
  <xsl:param name="width" select="'880'"/>
  <xsl:param name="id" select="'audit'"/>


  <xsl:template match="Report">
    <html>
      <head>
        <title>report</title>
      </head>
      <body>
        <table border="1">
          <xsl:apply-templates/>
        </table>
      </body>
    </html>
  </xsl:template>
  
  <xsl:template match="Row">
    <tr>
      <xsl:apply-templates/>
    </tr>
  </xsl:template>
  
  <xsl:template match="Msr">

Considering the number of times @val is used, you
could make a variable
for it before this xsl:choose instead of making
$numberVal below.

    <xsl:choose>
      <xsl:when test="string(number(@val))
='NaN'">

boolean(NaN) is not true [1], so you could do
"not(number(@val))".

Considering that your most common NaN case appears
to be 'val=""', it
might be quicker to do "$val = '' or
not(number($val)".

Judging by your sample data, the NaN is the most
common case.  If it
isn't, you could try reversing the sense of the test
and exchanging the
contents of the xsl:when and the xsl:otherwise to
see if that made any
difference.

If you had the option, it might be better to just
omit @val from your
XML when it doesn't have a useful value.  Checking
for the existence of
an attribute has to be quicker than checking that
the attribute's value
is not a number.

        <td align="left" style="overflow:none">
          <nobr>
            <div style="width:80px;overflow:none">
              <xsl:value-of select="@val"/>
            </div>
          </nobr>
        </td>
      </xsl:when>
      <xsl:otherwise>
        <td align="right" style="overflow:none">
          <nobr>
            <div style="width:80px;overflow:none">
              <xsl:variable name="numberVal"
select="@val"/>
              <xsl:variable name="style"
select="@class"/>

This xsl:if and xslchoose could be one xsl:choose.

You could experiment with putting the most
frequently true xsl:when
cases first in the xsl:choose to see if that makes
any difference to the
speed.

              <xsl:if test="$numberVal != ''">
                <xsl:choose>
                  <xsl:when test="$numberVal =
'-1' or
$numberVal = '0'">
                    <xsl:text
xml:space="preserve">-</xsl:text>
                  </xsl:when>

This xsl:when is identical to the one above:

                  <xsl:when test="$numberVal =
'-1' or
$numberVal = '0'">
                    <xsl:text
xml:space="preserve">-</xsl:text>
                  </xsl:when>
                  <xsl:when
test="$style='wholeNum'">
                    <xsl:value-of
select="format-number($numberVal,'###,')"/>
                  </xsl:when>
                  <xsl:when
test="$style='currency'">
                    <xsl:value-of
select="format-number($numberVal,$ltCurFormat)"/>
                  </xsl:when>
                  <xsl:when
test="$style='percent'">
                    <xsl:value-of
select="format-number($numberVal * 100,'0.00')"/>
                    <xsl:text>%</xsl:text>
                  </xsl:when>
                  <xsl:otherwise>
                    <xsl:value-of
select="format-number($numberVal,$ltNumFormat)"/>
                  </xsl:otherwise>
                </xsl:choose>
              </xsl:if>
              <xsl:if test="$numberVal = ''">

How can this ever happen since the xsl:when above in
the outermost
xsl:choose would have been chosen when @val is ''?

                <xsl:text
xml:space="preserve">-</xsl:text>
              </xsl:if>
            </div>
          </nobr>
        </td>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template match="Cell[not(*)]">
    <xsl:for-each
select="/Report/Measures/Measure">
      <td> </td>
    </xsl:for-each>
  </xsl:template>
 
</xsl:stylesheet>

Regards,


Tony Graham.

======================================================================
Tony(_dot_)Graham(_at_)MenteithConsulting(_dot_)com  
http://www.menteithconsulting.com

Menteith Consulting Ltd             Registered in
Ireland - No. 428599
Registered Office: 13 Kelly's Bay Beach, Skerries,
Co. Dublin, Ireland

----------------------------------------------------------------------
Menteith Consulting -- Understanding how markup
works

======================================================================

[1]
http://www.w3.org/TR/xpath#section-Boolean-Functions


--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list

=== message truncated ===



      ___________________________________________________________ 
Rise to the challenge for Sport Relief with Yahoo! For Good  

http://uk.promotions.yahoo.com/forgood/

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