Re: [xsl] Slow XSLT

Subject: Re: [xsl] Slow XSLT
From: "Manfred Staudinger" <manfred.staudinger@xxxxxxxxx>
Date: Mon, 3 Mar 2008 16:53:06 +0100
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">
                  <div onclick="sortFullGrid(2, 5, '')">Cost</div>
               </td>
            </tr>
         </tbody>
      </table>
   </body>
</html>

Current Thread