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