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

Subject: [xsl] Callstack overflow error !! It is not inifinte recusive loop ??
From: Dipesh Khakhkhar <dkhakhkh@xxxxxxxxxxxxxxx>
Date: Thu, 18 Sep 2003 11:28:19 -0400
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


Current Thread