Subject: [xsl] Very slow Xsl (just started in xsl) From: george.van.holsteijn@xxxxxxxxx Date: Thu, 5 Jul 2007 15:39:59 +0200 (CEST) |
I have an xml file and with Xsl and fop i want to create a pdf-file or a excel (xml) file. Everything works fine with the stylesheet for the pdf, but the xsl for Excel is terrible and because of that very slow. The xml-file exists of three sections : INFO (properties for Excel) LAYOUT (description and order of Cells) en Data (the real data). In the layout-section is a entry for each field in the data and looks like this <layout> <field> <vldk>CONPRD</vldk> <vldidx>2</vldidx> <vldlbl>conceptperiode</vldlbl> <hdr1>concept-</hdr1> <hdr2>periode</hdr2> <hdr3 /> <dtat>P</dtat> <vldlng>6</vldlng> <vlddec>0</vlddec> </field> <field> <vldk>ADM</vldk> <vldidx>0</vldidx> <vldlbl>administratie</vldlbl> <hdr1>administratie</hdr1> <hdr2 /> <hdr3 /> <dtat>A</dtat> <vldlng>25</vldlng> </field> <field> <vldk>ADMK</vldk> <vldidx>1</vldidx> <vldlbl>admin.</vldlbl> <hdr1>admin.</hdr1> <hdr2 /> <hdr3 /> <dtat>A</dtat> <vldlng>5</vldlng> </field> </layout> Data Sections looks like this: <data> <regel> <conprd>200704</conprd> <admk>B2000</admk> <adm>XXXXX</adm> </regel> <regel> <conprd>200705</conprd> <admk>B2010</admk> <adm>YYYY</adm> </regel> </data> I want the data in order of vldidx, skipping the zero entries. The result has to look like this : B2000 - 200704 B2010 - 200705 Mine solution works fine when there are 2 data fields and a few records , but not when there are 200 fields and 1000 records. Can someone give me a hint how to do this the right way because (as you see) i am just starting xsl. The (very slow working) part of my xsl: <!-- *************************************************************************************************************** --> <!-- Write a row --> <!-- --> <!-- *************************************************************************************************************** --> <xsl:template name="WriteData"> <xsl:for-each select="//data/*"> <xsl:variable name="rij" select="position()"/> <Row> <xsl:for-each select="//layout/field"> <xsl:sort select="vldidx" order="ascending" data-type="number"/> <xsl:if test="vldidx != 0"> <xsl:variable name="col" select="vldidx"/> <xsl:variable name="dec" select="vlddec"/> <xsl:variable name="typ" select="dtat"/> <xsl:call-template name="GetFieldByVldidx"> <xsl:with-param name="rij" select="$rij"/> <xsl:with-param name="col" select="$col"/> <xsl:with-param name="decimalen" select="$dec"/> <xsl:with-param name="type" select="$typ"/> </xsl:call-template> </xsl:if> </xsl:for-each> </Row> </xsl:for-each> </xsl:template> <!-- *************************************************************************************************************** --> <!-- CreateCel - MAke a cell for the spreadsheet --> <!-- --> <!-- *************************************************************************************************************** --> <xsl:template name="CreateCel"> <xsl:param name="decimalen"/> <xsl:param name="type"/> <xsl:param name="waarde"/> <xsl:variable name="strnbr"> <xsl:choose> <xsl:when test="$type = 'Z' or $type = 'P'"> <xsl:value-of select="'Number'"/> </xsl:when> <xsl:when test="$type = 'L'"> <xsl:value-of select="'DateTime'"/> </xsl:when> <xsl:otherwise> <xsl:value-of select="'String'"/> </xsl:otherwise> </xsl:choose> </xsl:variable> <Cell ss:StyleID="style{$type}{$decimalen}"> <xsl:if test="$waarde != ''"> <Data ss:Type="{$strnbr}"> <xsl:value-of select="$waarde"/> <xsl:if test="$type = 'L'"> <xsl:value-of select="'T00:00:00.000'"/> </xsl:if> </Data> </xsl:if> </Cell> </xsl:template> <!-- *************************************************************************************************************** --> <!-- GetFieldByVldidx - Get fiels by order of vld --> <!-- --> <!-- *************************************************************************************************************** --> <xsl:template name="GetFieldByVldidx"> <xsl:param name="rij"/> <xsl:param name="col"/> <xsl:param name="decimalen"/> <xsl:param name="type"/> <xsl:variable name="poscol"> <xsl:for-each select="//layout/field"> <xsl:if test="vldidx = $col"> <xsl:value-of select="position()"/> </xsl:if> </xsl:for-each> </xsl:variable> <xsl:for-each select="//data/*[position() = $rij]"> <xsl:for-each select="*[position() = $poscol]"> <xsl:variable name="wrd"><xsl:value-of select="."/></xsl:variable> <xsl:call-template name="CreateCel"> <xsl:with-param name="decimalen" select="$decimalen"/> <xsl:with-param name="type" select="$type"/> <xsl:with-param name="waarde" select="$wrd"/> </xsl:call-template> </xsl:for-each> </xsl:for-each> </xsl:template> Thanks George
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] Xslt transformation of an, Michael Kay | Thread | Re: [xsl] Very slow Xsl (just start, David Carlisle |
Re: [xsl] Xslt transformation of an, Norman Gray | Date | Re: [xsl] Very slow Xsl (just start, David Carlisle |
Month |