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 <= 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