RE: [xsl] anyway obvious way to speed this tranfrom up?

Subject: RE: [xsl] anyway obvious way to speed this tranfrom up?
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Fri, 2 Jan 2004 23:58:40 -0000
Perhaps the thing that's making this slow is that for each <row> element
you do

<xsl:template match="/inputDocument/row">
	<xsl:for-each select="child::*">
		<xsl:if test="name=/inputDocument/header/name[4]">
			<xsl:call-template name="generateOutputRecord">

where generateOutputRecord then does:

      <xsl:for-each select="../*">
         <xsl:call-template name="processField">

which means that for every cell you are processing every cell, in other
words it's O(n^2) in the number of cells per row. That shouldn't matter
too much if there are only five cells per row as in your example: but
perhaps there are actually more?

It would be useful to know (a) what the actual data sizes are like, (b)
what performance you are actually getting (and with what processor), and
(c) how the performance scales as the data size increases.

For all that we know, you could simply be thrashing for lack of memory.

Michael Kay



> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Ray Tayek
> Sent: 30 December 2003 19:41
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] anyway obvious way to speed this tranfrom up?
> 
> 
> hi, newbie managed to get something to work, but it's *real* slow.
> 
> the xslt's are generated by a program, so they can not be 
> hand tuned, but maybe there is a way to do some things faster?
> 
> The xml input comes from a spreadsheet via a .csv file, so 
> the original names in the <header> can contains spaces and 
> strange characters, but the names in the <cell>'s are legal 
> database names.
> 
> any clues will be appreciated.
> 
> thanks
> 
> Xslt:
> 
> <?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:output method="xml" version="1.0" encoding="UTF-8" 
> indent="yes"/>
> 	<xsl:template match="/inputDocument">
> 		<xsl:element name="outputDocument">
> 			<xsl:apply-templates/>
> 		</xsl:element>
> 	</xsl:template>
> 	<xsl:template match="/inputDocument/header">
> 		<xsl:element name="{name()}">
> 			<xsl:apply-templates/>
> 		</xsl:element>
> 		<xsl:element name="csvHeader">
> 			<xsl:element name="copy1"/><xsl:element 
> name="renamed1"/><xsl:element name="new3"/><xsl:element 
> name="new1"/><xsl:element name="new2"/><xsl:element 
> name="new4"/><xsl:element name="new5"/>
> 		</xsl:element>
> 	</xsl:template>
> 	<xsl:template match="/inputDocument/header/*">
> 		<xsl:copy-of select="."/>
> 	</xsl:template>
> 	<xsl:template match="/inputDocument/row">
> 		<xsl:for-each select="child::*">
> 			<xsl:if 
> test="name=/inputDocument/header/name[4]">
> 				<xsl:call-template
> name="generateOutputRecord">
> 					<xsl:with-param name="index"
> select="'4'"/>
> 					<xsl:with-param name="name1"
> select="'new1'"/>
> 					<xsl:with-param 
> name="value1" select="'new1ValueFromSpecial1Name'"/>
> 					<xsl:with-param name="name2"
> select="'new2'"/>
> 					<xsl:with-param 
> name="value2" select="'new2ValueFromSpecial1Name'"/>
> 					<xsl:with-param name="name3"
> select="'new4'"/>
> 					<xsl:with-param name="value3"
> select="''"/>
> 					<xsl:with-param name="name4"
> select="'new5'"/>
> 					<xsl:with-param name="value4"
> select="''"/>
> 				</xsl:call-template>
> 			</xsl:if>
> 			<xsl:if 
> test="name=/inputDocument/header/name[5]">
> 				<xsl:call-template
> name="generateOutputRecord">
> 					<xsl:with-param name="index"
> select="'5'"/>
> 					<xsl:with-param name="name1"
> select="'new1'"/>
> 					<xsl:with-param name="value1"
> select="''"/>
> 					<xsl:with-param name="name2"
> select="'new2'"/>
> 					<xsl:with-param 
> name="value2" select="'new2ValueFromSpecial2Name'"/>
> 					<xsl:with-param name="name3"
> select="'new4'"/>
> 					<xsl:with-param 
> name="value3" select="'new4ValueFromSpecial2Name'"/>
> 					<xsl:with-param name="name4"
> select="'new5'"/>
> 					<xsl:with-param 
> name="value4" select="'new5ValueFromSpecial2Name'"/>
> 				</xsl:call-template>
> 			</xsl:if>
> 		</xsl:for-each>
> 	</xsl:template>
> 	<xsl:template name="generateOutputRecord">
> 		<xsl:param name="index" select="0"/>
> 		<xsl:param name="name1" select="defaultValueName"/>
> 		<xsl:param name="value1" select="defaultValueValue"/>
> 		<xsl:param name="name2" select="defaultValueName"/>
> 		<xsl:param name="value2" select="defaultValueValue"/>
> 		<xsl:param name="name3" select="defaultValueName"/>
> 		<xsl:param name="value3" select="defaultValueValue"/>
> 		<xsl:param name="name4" select="defaultValueName"/>
> 		<xsl:param name="value4" select="defaultValueValue"/>
> 		<xsl:element name="row">
> 			<xsl:attribute name="iln"><xsl:number 
> count="row"/></xsl:attribute>
> 			<xsl:for-each select="../*">
> 				<xsl:call-template name="processField">
> 					<xsl:with-param name="xindex"
> select="$index"/>
> 				</xsl:call-template>
> 			</xsl:for-each>
> 			<xsl:call-template name="addNewFields">
> 				<xsl:with-param name="xname1"
> select="$name1"/>
> 				<xsl:with-param name="xvalue1"
> select="$value1"/>
> 				<xsl:with-param name="xname2"
> select="$name2"/>
> 				<xsl:with-param name="xvalue2"
> select="$value2"/>
> 				<xsl:with-param name="xname3"
> select="$name3"/>
> 				<xsl:with-param name="xvalue3"
> select="$value3"/>
> 				<xsl:with-param name="xname4"
> select="$name4"/>
> 				<xsl:with-param name="xvalue4"
> select="$value4"/>
> 			</xsl:call-template>
> 		</xsl:element>
> 	</xsl:template>
> 	<xsl:template name="addNewFields">
> 		<xsl:param name="xname1" select="defaultValueName"/>
> 		<xsl:param name="xvalue1" select="defaultValueValue"/>
> 		<xsl:param name="xname2" select="defaultValueName"/>
> 		<xsl:param name="xvalue2" select="defaultValueValue"/>
> 		<xsl:param name="xname3" select="defaultValueName"/>
> 		<xsl:param name="xvalue3" select="defaultValueValue"/>
> 		<xsl:param name="xname4" select="defaultValueName"/>
> 		<xsl:param name="xvalue4" select="defaultValueValue"/>
> 		<xsl:element name="{$xname1}">
> 			<xsl:value-of select="$xvalue1"/>
> 		</xsl:element>
> 		<xsl:element name="{$xname2}">
> 			<xsl:value-of select="$xvalue2"/>
> 		</xsl:element>
> 		<xsl:element name="{$xname3}">
> 			<xsl:value-of select="$xvalue3"/>
> 		</xsl:element>
> 		<xsl:element name="{$xname4}">
> 			<xsl:value-of select="$xvalue4"/>
> 		</xsl:element>
> 	</xsl:template>
> 	<xsl:template name="processField">
> 		<xsl:param name="xindex" select="0"/>
> 		<xsl:choose>
> 			<xsl:when 
> test="name=/inputDocument/header/name[1]">
> 				<xsl:element name="{name}">
> 					<xsl:choose>
> 						<xsl:when
> test="value='oldValue1'"><xsl:value-of 
> select="'newValue1'"/></xsl:when>
> 						<xsl:when
> test="value='oldValue2'"><xsl:value-of 
> select="'newValue2'"/></xsl:when>
> 						<xsl:otherwise>
> 							<xsl:value-of
> select="value"/>
> 						</xsl:otherwise>
> 					</xsl:choose>
> 				</xsl:element>
> 			</xsl:when>
> 			<xsl:when
> test="name=/inputDocument/header/name[2]"/>
> 			<xsl:when 
> test="name=/inputDocument/header/name[3]">
> 				<xsl:element name="renamed1">
> 					<xsl:value-of select="value"/>
> 				</xsl:element>
> 			</xsl:when>
> 			<xsl:when 
> test="name=/inputDocument/header/name[4]
> and $xindex='4'">
> 				<xsl:element name="new3">
> 					<xsl:value-of select="value"/>
> 				</xsl:element>
> 			</xsl:when>
> 			<xsl:when 
> test="name=/inputDocument/header/name[5]
> and $xindex='5'">
> 				<xsl:element name="new3">
> 					<xsl:value-of select="value"/>
> 				</xsl:element>
> 			</xsl:when>
> 		</xsl:choose>
> 	</xsl:template>
> </xsl:stylesheet>
> 
> xml input file:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <inputDocument xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
> xsi:noNamespaceSchemaLocation="U:\projects\tender\tender2\com\
> ediidea\tender
> \testFiles\inputDocument.xsd">
> 	<header>
> 		<name icn="1">copy1</name>
> 		<name icn="2">remove1</name>
> 		<name icn="3">rename1</name>
> 		<name icn="4">special1</name>
> 		<name icn="5">special2</name>
> 	</header>
> 	<row>
> 		<cell>
> 			<name>copy1</name>
> 			<value>copy1Value1</value>
> 		</cell>
> 		<cell>
> 			<name>remove1</name>
> 			<value>remove1Value1</value>
> 		</cell>
> 		<cell>
> 			<name>rename1</name>
> 			<value>rename1Value1</value>
> 		</cell>
> 		<cell>
> 			<name>special1</name>
> 			<value>special1Value1</value>
> 		</cell>
> 		<cell>
> 			<name>special2</name>
> 			<value>special2Value1</value>
> 		</cell>
> 	</row>
> 	<row>
> 		<cell>
> 			<name>copy1</name>
> 			<value>copy1Value2</value>
> 		</cell>
> 		<cell>
> 			<name>remove1</name>
> 			<value>remove1Value2</value>
> 		</cell>
> 		<cell>
> 			<name>rename1</name>
> 			<value>rename1Value2</value>
> 		</cell>
> 		<cell>
> 			<name>special1</name>
> 			<value>special1Value2</value>
> 		</cell>
> 		<cell>
> 			<name>special2</name>
> 			<value>special2Value2</value>
> 		</cell>
> 	</row>
> 	<row>
> 		<cell>
> 			<name>copy1</name>
> 			<value>oldValue1</value>
> 		</cell>
> 		<cell>
> 			<name>remove1</name>
> 			<value>remove1Value3</value>
> 		</cell>
> 		<cell>
> 			<name>rename1</name>
> 			<value>rename1Value3</value>
> 		</cell>
> 		<cell>
> 			<name>special1</name>
> 			<value>special1Value3</value>
> 		</cell>
> 		<cell>
> 			<name>special2</name>
> 			<value>special2Value3</value>
> 		</cell>
> 	</row>
> 	<row>
> 		<cell>
> 			<name>copy1</name>
> 			<value>oldValue2</value>
> 		</cell>
> 		<cell>
> 			<name>remove1</name>
> 			<value>remove1Value4</value>
> 		</cell>
> 		<cell>
> 			<name>rename1</name>
> 			<value>rename1Value4</value>
> 		</cell>
> 		<cell>
> 			<name>special1</name>
> 			<value>special1Value4</value>
> 		</cell>
> 		<cell>
> 			<name>special2</name>
> 			<value>special2Value4</value>
> 		</cell>
> 	</row>
> 	<row>
> 		<cell>
> 			<name>copy1</name>
> 			<value/>
> 		</cell>
> 		<cell>
> 			<name>remove1</name>
> 			<value/>
> 		</cell>
> 		<cell>
> 			<name>rename1</name>
> 			<value/>
> 		</cell>
> 		<cell>
> 			<name>special1</name>
> 			<value/>
> 		</cell>
> 		<cell>
> 			<name>special2</name>
> 			<value/>
> 		</cell>
> 	</row>
> </inputDocument>
> 
> xml output file:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <outputDocument>
> <header>
> <name icn="1">copy1</name>
> <name icn="2">remove1</name>
> <name icn="3">rename1</name>
> <name icn="4">special1</name>
> <name icn="5">special2</name>
> </header>
> <csvHeader>
> <copy1/>
> <renamed1/>
> <new3/>
> <new1/>
> <new2/>
> <new4/>
> <new5/>
> </csvHeader>
> <row iln="1">
> <copy1>copy1Value1</copy1>
> <renamed1>rename1Value1</renamed1>
> <new3>special1Value1</new3> <new1>new1ValueFromSpecial1Name</new1>
> <new2>new2ValueFromSpecial1Name</new2>
> <new4/>
> <new5/>
> </row>
> <row iln="1">
> <copy1>copy1Value1</copy1>
> <renamed1>rename1Value1</renamed1>
> <new3>special2Value1</new3>
> <new1/>
> <new2>new2ValueFromSpecial2Name</new2>
> <new4>new4ValueFromSpecial2Name</new4>
> <new5>new5ValueFromSpecial2Name</new5>
> </row>
> <row iln="2">
> <copy1>copy1Value2</copy1>
> <renamed1>rename1Value2</renamed1>
> <new3>special1Value2</new3> <new1>new1ValueFromSpecial1Name</new1>
> <new2>new2ValueFromSpecial1Name</new2>
> <new4/>
> <new5/>
> </row>
> <row iln="2">
> <copy1>copy1Value2</copy1>
> <renamed1>rename1Value2</renamed1>
> <new3>special2Value2</new3>
> <new1/>
> <new2>new2ValueFromSpecial2Name</new2>
> <new4>new4ValueFromSpecial2Name</new4>
> <new5>new5ValueFromSpecial2Name</new5>
> </row>
> <row iln="3">
> <copy1>newValue1</copy1>
> <renamed1>rename1Value3</renamed1>
> <new3>special1Value3</new3> <new1>new1ValueFromSpecial1Name</new1>
> <new2>new2ValueFromSpecial1Name</new2>
> <new4/>
> <new5/>
> </row>
> <row iln="3">
> <copy1>newValue1</copy1>
> <renamed1>rename1Value3</renamed1>
> <new3>special2Value3</new3>
> <new1/>
> <new2>new2ValueFromSpecial2Name</new2>
> <new4>new4ValueFromSpecial2Name</new4>
> <new5>new5ValueFromSpecial2Name</new5>
> </row>
> <row iln="4">
> <copy1>newValue2</copy1>
> <renamed1>rename1Value4</renamed1>
> <new3>special1Value4</new3> <new1>new1ValueFromSpecial1Name</new1>
> <new2>new2ValueFromSpecial1Name</new2>
> <new4/>
> <new5/>
> </row>
> <row iln="4">
> <copy1>newValue2</copy1>
> <renamed1>rename1Value4</renamed1>
> <new3>special2Value4</new3>
> <new1/>
> <new2>new2ValueFromSpecial2Name</new2>
> <new4>new4ValueFromSpecial2Name</new4>
> <new5>new5ValueFromSpecial2Name</new5>
> </row>
> <row iln="5">
> <copy1/>
> <renamed1/>
> <new3/>
> <new1>new1ValueFromSpecial1Name</new1>
> <new2>new2ValueFromSpecial1Name</new2>
> <new4/>
> <new5/>
> </row>
> <row iln="5">
> <copy1/>
> <renamed1/>
> <new3/>
> <new1/>
> <new2>new2ValueFromSpecial2Name</new2>
> <new4>new4ValueFromSpecial2Name</new4>
> <new5>new5ValueFromSpecial2Name</new5>
> </row>
> </outputDocument>
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


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


Current Thread