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

Subject: [xsl] anyway obvious way to speed this tranfrom up?
From: "Ray Tayek" <rtayek@xxxxxxxxxxxxxxx>
Date: Tue, 30 Dec 2003 11:40:51 -0800
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


Current Thread