Hi,
I am sending the XSLT again with reduced font size
since the lines earlier got screwed up.
<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/Parent
Group" />
<xsl:variable name="var_2" select="Document/Child
Group" />
<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="$var_4[$p]"/> </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>
--- Bhupendra Singh <skbhupendra(_at_)yahoo(_dot_)co(_dot_)uk> wrote:
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
--+------------------------------------------------------------------
XSL-List info and archive:
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--+--
___________________________________________________________
Moving house? Beach bar in Thailand? Win 10k with Yahoo! Mail to make your
dream a reality.
Get Yahoo! Mail http://uk.mail.yahoo.com