XML Editor
Sign up for a WebBoard account Sign Up Keyword Search Search More Options... Options
Chat Rooms Chat Help Help News News Log in to WebBoard Log in Not Logged in
Show tree view Topic
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Postnext
Kenny CudworthSubject: Recursion Limitations - Need An Iterative Solution
Author: Kenny Cudworth
Date: 30 Sep 2005 04:28 PM
I need an iterative solution to this, but do not know how to write one. All my XSLT resources say that recursion can handle just about anything. I even set my java runtime memory to 512 MB. When I set quantity to 1000 or higher I get:

java.lang.RuntimeException: Maximum recursion depth exceeded

If quantity is 900 or less I am fine.

I start with:

<?xml version="1.0"?>
<Data>
<RolledUpItems key="A" quantity="1000" quantityPerPallet="5"/>
</Data>


I am transforming with:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="//RolledUpItems">
<xsl:call-template name="inventory">
<xsl:with-param name="key" select="./@key"/>
<xsl:with-param name="quantity-per-pallet" select="./@quantityPerPallet"/>
<xsl:with-param name="quantity" select="./@quantity"/>
<xsl:with-param name="count" select="0"/>
</xsl:call-template>
</xsl:template>

<xsl:template name="inventory">
<xsl:param name="key"/>
<xsl:param name="quantity-per-pallet"/>
<xsl:param name="quantity"/>
<xsl:param name="count"/>

<!-- If the quantity is greater than the quantity per pallet, then create on inventory item pallet, subtract the pallet amount and make
a recursive call with that new quantity
-->
<xsl:if test="number($quantity) &gt; number($quantity-per-pallet)">

<!-- Create one inventory item pallet -->
<xsl:call-template name="inventory-pallet">
<xsl:with-param name="key" select="$key"/>
<xsl:with-param name="quantity" select="$quantity-per-pallet"/>
<xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>

<!-- Recursive call to create more-->
<xsl:call-template name="inventory">
<xsl:with-param name="key" select="$key"/>
<xsl:with-param name="quantity-per-pallet" select="$quantity-per-pallet"/>
<xsl:with-param name="quantity" select="$quantity - $quantity-per-pallet"/>
<xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>
</xsl:if>

<!-- If the quantity is less than or equals to the quantity per pallet, then create on inventory item pallet -->
<xsl:if test="(number($quantity) &lt; number($quantity-per-pallet)) or (number($quantity) = number($quantity-per-pallet))">
<xsl:call-template name="inventory-pallet">
<xsl:with-param name="key" select="$key"/>
<xsl:with-param name="quantity" select="$quantity"/>
<xsl:with-param name="count" select="$count + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>

<!-- Inventory Item Template
quantity - The quantity for inventory pallet
-->
<xsl:template name="inventory-pallet">
<xsl:param name="key"/>
<xsl:param name="quantity"/>
<xsl:param name="count"/>

<!-- Create Pallet -->
<Pallet>
<xsl:attribute name="key">
<xsl:value-of select="concat($key, '-', $count)"/>
</xsl:attribute>
<xsl:attribute name="quantity">
<xsl:value-of select="$quantity"/>
</xsl:attribute>
</Pallet>
</xsl:template>
</xsl:stylesheet>

Any help would be greatly appreciated.

Postnext
Ivan PedruzziSubject: Recursion Limitations - Need An Iterative Solution
Author: Ivan Pedruzzi
Date: 30 Sep 2005 06:07 PM
In XSLT 2.0 is quite simple

<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="//RolledUpItems">
<root>
<xsl:variable name="key" select="@key"/>
<xsl:variable name="batch" select="@quantityPerPallet"/>
<xsl:for-each select="1 to xs:integer(@quantity div @quantityPerPallet)">
<Pallet key="{concat($key, '-', .)}" name="{$batch}"/>
</xsl:for-each>
</root>
</xsl:template>

</xsl:stylesheet>

Hope this helps
Ivan Pedruzzi
Stylus Studio Team

Postnext
Kenny CudworthSubject: Recursion Limitations - Need An Iterative Solution
Author: Kenny Cudworth
Date: 30 Sep 2005 07:24 PM
Thanks Ivan,

That works great, but we are waiting for Xalan to support XSLT 2.0. Any idea when that will be? There's no mention of it on there site.

Is there an iterative solution that XSLT 1.0 can support?

Thanks again,

Kenny

Posttop
Ivan PedruzziSubject: Recursion Limitations - Need An Iterative Solution
Author: Ivan Pedruzzi
Date: 03 Oct 2005 02:05 AM
Originally Posted: 03 Oct 2005 02:06 AM
To overcome the stack limitation you have to use A DVC algorithm (The Divide and Conquer pattern).

DVC breaks recursion in chunk. The attached solution can process number in order of milions without overflow the stack.

hope this helps
Ivan Pedruzzi
Stylus Studio Team



Unknownstackoverflow.xsl

 
Topic Page 1 2 3 4 5 6 7 8 9 Go to previous topicPrev TopicGo to next topicNext Topic
Download A Free Trial of Stylus Studio 6 XML Professional Edition Today! Powered by Stylus Studio, the world's leading XML IDE for XML, XSLT, XQuery, XML Schema, DTD, XPath, WSDL, XHTML, SQL/XML, and XML Mapping!  
go

Log In Options

Site Map | Privacy Policy | Terms of Use | Trademarks
Stylus Scoop XML Newsletter:
W3C Member
Stylus Studio® and DataDirect XQuery ™are from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2011 All Rights Reserved.