Subject: [xsl] Slow XSLT From: Cleyton Jordan <cleytonjordan@xxxxxxxxxxx> Date: Thu, 28 Feb 2008 22:59:48 +0000 (GMT) |
Hi, I am using XSLT 1.0 and IE6 I have written the XSLT below and it works fine. However, when the XML has lots of RowGrp elements then it becomes quite slow to transform. The difficulty that I am having is to find a way to speed it up. I think there could be two problems with my XSLT: 1 - Recursion in the ColGrp Template mode="header" <xsl:for-each select="//ColGrp[count(ancestor::ColGrp)=$depth]"> 2 - Also, when I am in the Col Template I have to go back to the measures element for each Col <xsl:for-each select="//Col"> <xsl:apply-templates select="//Measures"> <xsl:with-param name="pos" select="position()" /> </xsl:apply-templates> </xsl:for-each> I would appreciate if someone could sched some light. I have read Jeni's XSLT pages (key and grouping) but have not found any posts or example similar to mine. Cheers C =========================== XML <Reports> <Report xmlns=""> <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" /> <Col heading="Quarter 3" /> <Col heading="Quarter 4" /> </ColGrp> <ColGrp heading="2004"> <Col heading="Quarter 1" /> <Col heading="Quarter 2" /> <Col heading="Quarter 3" /> <Col heading="Quarter 4" /> </ColGrp> </ColGrp> <!--===TOTALS====--> <ColGrp> <ColGrp> <Col heading="Total" /> </ColGrp> </ColGrp> </Columns> </Report> </Reports> ============================== XSLT <xsl:param name="axisHeads" select="'false'" /> <xsl:variable name="msrs"> <xsl:choose> <xsl:when test="//Measure"> <xsl:value-of select="count(//Measure)"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="1"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <xsl:template match="Reports"> <xsl:apply-templates select="Report"></xsl:apply-templates> </xsl:template> <xsl:template match="Report" > <!-- Top --> <div id="g1" style="position: absolute; top: 0px; left: 0px; width: 400px; height: 12px"> <table class="grdTop" border="0" cellspacing="1" cellpadding="0"> <tbody> <xsl:apply-templates select="Columns" /> </tbody> </table> </div> </xsl:template> <xsl:template match="Columns"> <xsl:apply-templates select="ColGrp[1]" mode="Header"> <!-- 0 for top level heading, 1 to cut it out --> <xsl:with-param name="depth"> <xsl:choose> <xsl:when test="$axisHeads='true'"> <xsl:value-of select="0"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="1"/> </xsl:otherwise> </xsl:choose> </xsl:with-param> </xsl:apply-templates> </xsl:template> <xsl:template match="ColGrp" mode="Header"> <xsl:param name="depth" /> <tr> <!-- the very first row needs a padding cell --> <xsl:for-each select="//ColGrp[count(ancestor::ColGrp)=$depth]"> <td colspan="{count(.//Col)*$msrs}" align="center" style="overflow:none"> <nobr> <div> <xsl:value-of select="@heading"/> </div> </nobr> </td> </xsl:for-each> </tr> <xsl:choose> <xsl:when test="ColGrp"> <xsl:apply-templates select="ColGrp[1]" mode="Header"> <xsl:with-param name="depth" select="$depth+1" /> </xsl:apply-templates> </xsl:when> <xsl:otherwise> <xsl:apply-templates select="Col[1]" mode="colHead" /> </xsl:otherwise> </xsl:choose> </xsl:template> <xsl:template match="Col" mode="colHead"> <tr> <xsl:for-each select="ancestor::Columns//Col"> <td colspan="{$msrs}" valign="top" align="center" style="overflow:none"> <nobr> <!-- 2003/2004 --> <div> <xsl:value-of select="@heading"/> </div> </nobr> </td> </xsl:for-each> </tr> <tr valign="bottom"> <xsl:for-each select="//Col"> <xsl:apply-templates select="//Measures"> <xsl:with-param name="pos" select="position()" /> </xsl:apply-templates> </xsl:for-each> </tr> </xsl:template> <xsl:template match="//Measures"> <xsl:param name="pos" /> <xsl:for-each select="Measure"> <xsl:variable name="mPos"> <xsl:value-of select="position()" /> </xsl:variable> <td align="center"> <nobr> <div class="action" style="width:90px; overflow:none" onclick="sortFullGrid({$mPos}, {$pos}, '{@class}')"> <xsl:value-of select="@heading"/> </div> </nobr> </td> </xsl:for-each> </xsl:template> ___________________________________________________________ Rise to the challenge for Sport Relief with Yahoo! For Good http://uk.promotions.yahoo.com/forgood/
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] [ERR XTSE0210] when impor, Johannes Neubauer | Thread | Re: [xsl] Slow XSLT, David Carlisle |
Re: [xsl] [ERR XTSE0210] when impor, Johannes Neubauer | Date | Re: [xsl] Slow XSLT, David Carlisle |
Month |