[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Callstack overflow error !! It is not inifinte recusive loop ??


Subject: Re: [xsl] Callstack overflow error !! It is not inifinte recusive loop ??
From: Jeff Kenton <jkenton@xxxxxxxxxxxxx>
Date: Thu, 18 Sep 2003 11:54:35 -0400


In real life, infinite just means "more than the callstack can handle". Since you say (below) you got to level 248, maybe there's a limit at that point. Does your processor have a parameter you can set to increase it?




Dipesh Khakhkhar wrote:
Hi,

I am getting Callstack overflow error when a template is called recursively.

I am finding unique attribute names for some node which is repeating itself many times say 100 or more than that. This node is having 11 attributes. So first i am getting attribute names like this

xsl:variable name="ResColNames" select="/Root/FirstNode/SecondNode/@*"/>

So there are 100 or more SecondNode in the xml input document and each node is having 10 or more attributes.

Then I am calling a recusive template to get the unique attribute names.

<xsl:variable name="uniqueColumnNamesRes">
		<xsl:call-template name="findUniqueNamesForNodesWithAtt">
			<xsl:with-param name="names" select="$ResColNames"/>
			<xsl:with-param name="uniqueNames"/>
			<xsl:with-param name="i">0</xsl:with-param>
		</xsl:call-template>
</xsl:variable>

The following is the template which is called.

<!-- This is to find unique Column Names for nodes with attributes as columns-->
<xsl:template name="findUniqueNamesForNodesWithAtt">
<xsl:param name="names"/>
<xsl:param name="uniqueNames"/>
<xsl:param name="i"/>
<xsl:choose>
<xsl:when test="$i &lt;= count($names)">
<xsl:variable name="newUniqueName">
<xsl:choose>
<xsl:when test="contains($uniqueNames, name($names[$i]))">
<xsl:value-of select="$uniqueNames"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($uniqueNames,'`',name($names[$i]))"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="findUniqueNamesForNodesWithAtt">
<xsl:with-param name="names" select="$names"/>
<xsl:with-param name="uniqueNames" select="$newUniqueName"/>
<xsl:with-param name="i" select="$i + 1"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="concat($uniqueNames,'`')"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>



The same template when called with the same input file is running without any error producing expected output. I am not able to figure out why this is executing properly.


But when the same template is called for the same input file from different xsl file with same parameters it is giving stack overflow error.

The iterating variable is reaching 248 and then it is giving error. Can someone please tell me what can be possible reasons? Is this a memory problem ? Or am I taking round about way which can be done in some simple way i.e. to find unique attribute names for some node. Or i should just hardcode the maximum possible attribute names i.e. required and implied from the dtd.

The recursion is not going infinite I am comparing the variable with the count of one node-set variable having 829 nodes.

Eagerly waiting for reply.

Regards,
Dipesh


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list





XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list




Current Thread
Keywords