Subject: [xsl] Performance Tuning From: Bhupendra Singh <skbhupendra@xxxxxxxxxxx> Date: Wed, 10 Nov 2004 15:59:53 +0000 (GMT) |
Hi, I have an XML something like this. <Document> - <ParentGroup> Node1 </ParentGroup> - <ChildGroup> Node1.1 </ChildGroup> - <Child Node1>1.1.1 </Child Node1> - <Child Node2>1.1.2 </Child Node2> - <Child Node3>1.1.3 </Child Node3> - <ParentGroup> Node1 </ParentGroup> - <ChildGroup> Node1.2 </ChildGroup> - <Child Node1>1.2.1 </Child Node1> - <Child Node2>1.2.2 </Child Node2> - <Child Node3>1.2.3 </Child Node3> - <ParentGroup> Node1 </ParentGroup> - <ChildGroup> Node1.3 </ChildGroup> - <Child Node1>1.3.1 </Child Node1> - <Child Node2>1.3.2 </Child Node2> - <Child Node3>1.3.3 </Child Node3> - <ParentGroup> Node1 </ParentGroup> - <ChildGroup> Node1.3 </ChildGroup> - <Child Node1>1.3.x </Child Node1> - <Child Node2>1.3.y </Child Node2> - <Child Node3>1.3.z </Child Node3> - <ParentGroup> Node2 </ParentGroup> - <ChildGroup> Node2.1 </ChildGroup> - <Child Node1>2.1.1 </Child Node1> - <Child Node2>2.1.2 </Child Node2> - <Child Node3>2.1.3 </Child Node3> - <ParentGroup> Node2 </ParentGroup> - <ChildGroup> Node2.2 </ChildGroup> - <Child Node1>2.2.1 </Child Node1> - <Child Node2>2.2.2 </Child Node2> - <Child Node3>2.2.3 </Child Node3> - <ParentGroup> Node2 </ParentGroup> - <ChildGroup> Node2.3 </ChildGroup> - <Child Node1>2.3.1 </Child Node1> - <Child Node2>2.3.2 </Child Node2> - <Child Node3>2.3.3 </Child Node3> ........... </Document> Please note that all the nodes above are at the same depth. I want to transform the above XML into depth wise soemthing like this: <Document> <ParentGroup> <PRIMARY_CUST_DESC>Node1</PRIMARY_CUST_DESC> <ChildGroup Node1.1 > <ACCOUNT_SUMMARY> - <Child Node1>1.1.1 </Child Node1> - <Child Node2>1.1.2 </Child Node2> - <Child Node3>1.1.3 </Child Node3> <ACCOUNT_SUMMARY> </ChildGroup> <ChildGroup Node1.2 > <ACCOUNT_SUMMARY> - <Child Node1>1.2.1 </Child Node1> - <Child Node2>1.2.2 </Child Node2> - <Child Node3>1.2.3 </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> <ChildGroup Node1.3 > <ACCOUNT_SUMMARY> - <Child Node1>1.3.1 </Child Node1> - <Child Node2>1.3.2 </Child Node2> - <Child Node3>1.3.3 </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> <ChildGroup Node1.3 > <ACCOUNT_SUMMARY> - <Child Node1>1.3.x </Child Node1> - <Child Node2>1.3.y </Child Node2> - <Child Node3>1.3.z </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> </ParentGroup> <ParentGroup> <PRIMARY_CUST_DESC>Node2</PRIMARY_CUST_DESC> <ChildGroup Node2.1 > <ACCOUNT_SUMMARY> - <Child Node1>2.1.1 </Child Node1> - <Child Node2>2.1.2 </Child Node2> - <Child Node3>2.1.3 </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> <ChildGroup Node2.2 > <ACCOUNT_SUMMARY> - <Child Node1>2.2.1 </Child Node1> - <Child Node2>2.2.2 </Child Node2> - <Child Node3>2.2.3 </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> <ChildGroup Node2.3 > <ACCOUNT_SUMMARY> - <Child Node1>2.3.1 </Child Node1> - <Child Node2>2.3.2 </Child Node2> - <Child Node3>2.3.3 </Child Node3> </ACCOUNT_SUMMARY> </ChildGroup> </ParentGroup> ........... </Document> The XSL that I use has three "preceding-sibling::" The time taken to parse a 150KB XML in Xalan is 1.9 sec and with Saxon8 its 1.6 secs. Since the above parsing is done frequently in my application with different input XMLs. I need to further reduce the transformation timing (in milliseconds may be). The only bottleneck I see are the 3 preceding-sibling. Can we somehow remove them or use some other logic, to reduce my transformation time. Here is the XSL: <xsl:param name="priroot">ParentGroup</xsl:param> <xsl:param name="secroot">ChildGroup</xsl:param> <xsl:key name="PRI" match="ParentGroup" use="."/> <xsl:key name="SEC" match="ChildGroup" use="."/> <CUSTOMER_RELATIONS> <xsl:variable name="var_1" select="Document/ParentGroup"/> <xsl:variable name="var_2" select="Document/ChildGroup" /> <xsl:variable name="var_3" select="Document/Child Node1" /> <xsl:variable name="var_4" select="Document/Child Node2" /> <xsl:variable name="var_5" select="Document/Child Node3" /> <xsl:for-each select="$var_1[count(. | key('PRI', .)[1]) = 1]"> <xsl:element name="{$priroot}"> <xsl:variable name="priId" select="." /> <xsl:variable name="p" select="count(preceding-sibling::ParentGroup) + 1" /> <PRIMARY_CUST_DESC><xsl:value-of select="$priId"/></PRIMARY_CUST_DESC> <xsl:for-each select="$var_2[count(. | key('SEC', .)[1]) = 1]"> <xsl:variable name="m" select="count(preceding-sibling::ChildGroup) + 1" /> <xsl:if test="$var_1[$m] = $priId"> <xsl:variable name="id" select="." /> <xsl:element name="{$secroot}"> <xsl:for-each select="$var_2[. = $id]"> <xsl:variable name="n" select="count(preceding-sibling::ChildGroup) + 1" /> <ACCOUNT_SUMMARY> <UNIQUE_ID>A<xsl:value-of select="$n"/></UNIQUE_ID> <xsl:copy-of select="." /> <xsl:copy-of select="$var_3[$n]" /> <xsl:copy-of select="$var_4[$n]" /> </ACCOUNT_SUMMARY> </xsl:for-each> </xsl:element> </xsl:if> </xsl:for-each> </xsl:element> </xsl:for-each> </CUSTOMER_RELATIONS> I would appreciate any suggestions to reduce the timings. Thanks in advance, Bhupendra. ___________________________________________________________ALL-NEW Yahoo! Messenger - all new features - even more fun! http://uk.messenger.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: AW: [xsl] Detecting carriage re, David Carlisle | Thread | Re: [xsl] Performance Tuning, Bhupendra Singh |
[xsl] Newbie RSS/XSLT Configuration, scottspam | Date | RE: [xsl] Newbie RSS/XSLT Configura, Pawson, David |
Month |