RE: [xsl] stackOverflowError while doing generte-id and sum

Subject: RE: [xsl] stackOverflowError while doing generte-id and sum
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Mon, 19 May 2003 23:47:22 +0100
Your stack overflow seems to have occurred while doing a sort, which is
rather surprising, as the stack depth for a QuickSort should only
increase with the log of the number of nodes to be sorted.

Try a different XSLT processor. XSLTC is fast but isn't the most
reliable.

Other things you could try:

(a) put the xsl:if test
<xsl:if test="generate-id(.)=
>                             generate-id( $currencies[ @CURRENCY =
>                                         current()/@CURRENCY ] )">

into a predicate in the select expression of the xsl:for-each

(b) replace the test in this xsl:if with a key. As written, your code is
likely to have O(n^2) performance.

Michael Kay


> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of Lee, Insoo
> Sent: 18 May 2003 18:28
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] stackOverflowError while doing generte-id and sum
> 
> 
> 
> 
>  We are doing the grouping in order to establish the unique 
> values for currency and do grand total summation for 
> following like xml..
> 
> 
> <REPORT>
>      <ENTITY NUMBER="1">
>          <FUND_GROUP CURRENCY="GBP">
>              <ROW>
>                  <SOME_VALUE>100</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>200</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>300</SOME_VALUE>
>              </ROW>
>          </FUND_GROUP>
> 
>          <FUND_GROUP CURRENCY="USD">
>              <ROW>
>                  <SOME_VALUE>100</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>200</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>300</SOME_VALUE>
>              </ROW>
>          </FUND_GROUP>
>      </ENTITY>
> 
>      <ENTITY NUMBER="2">
>          <FUND_GROUP CURRENCY="GBP">
>              <ROW>
>                  <SOME_VALUE>100</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>200</SOME_VALUE>
>              </ROW>
>          </FUND_GROUP>
> 
>          <FUND_GROUP CURRENCY="USD">
>              <ROW>
>                  <SOME_VALUE>200</SOME_VALUE>
>              </ROW>
>              <ROW>
>                  <SOME_VALUE>300</SOME_VALUE>
>              </ROW>
>          </FUND_GROUP>
>      </ENTITY>
> 
> </REPORT>
> 
> 
> and this xsl works well..
> 
> 
> 
> 	<xsl:for-each select="$currencies">
> 
>                         <xsl:if test="generate-id(.)=
>                             generate-id( $currencies[ @CURRENCY =
>                                         current()/@CURRENCY ] )">
> 
>                     <tr>
>                         <td align="left" width="23%"><b>Grand 
> Total (<xsl:value-of select="@CURRENCY"/>):</b></td>
>                         <td align="right" 
> width="14%"><xsl:text>&#160;</xsl:text></td>
>                         <td align="right" 
> width="7%"><xsl:text>&#160;</xsl:text></td>
>                         <td align="right" 
> width="14%"><b><u><xsl:value-of select="format-number(sum( 
> $currencies[@CURRENCY=current()/@CURRENCY]/FUND_ROW/OPENING_VA
> LUE ), '#,###,###,##0.00')"/></u></b></td>
>                         <td align="right" 
> width="14%"><xsl:text>&#160;</xsl:text></td>
>                         <td align="right" 
> width="14%"><b><u><xsl:value-of select="format-number(sum( 
> $currencies[@CURRENCY=current()/@CURRENCY]/FUND_ROW/CURRENT_VALUE),
> '#,###,###,##0.00')"/></u></b></td>
>                         <td align="right" 
> width="14%"><b><u><xsl:value-of select="format-number(sum( 
> $currencies[@CURRENCY=current()/@CURRENCY]/FUND_ROW/MTD_DIVIDE
> ND_NUMBER),
> '#,###,###,##0.00')"/></u></b></td>
>                     </tr>
>                             </xsl:if>
>                         </xsl:for-each>
> 
> 
> 
>  except once we go over 4500 records or so, we get 
> stackOverflowError.... what to do?? help!! it generates the 
> report without grand total.. or sometimes, it crashes tomcat 
> as well...
> 
> 
>         at
> org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoi
> nt.java:534)
>         at 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(
> ThreadPool.jav
> a:530)
>         at java.lang.Thread.run(Thread.java:479)
> ----- Root Cause -----
> java.lang.StackOverflowError
>         at
> org.apache.xalan.xsltc.util.IntegerArray.quicksort(IntegerArra
> y.java:198)
>         at
> org.apache.xalan.xsltc.util.IntegerArray.quicksort(IntegerArra
> y.java:198)
>         at
> org.apache.xalan.xsltc.util.IntegerArray.quicksort(IntegerArra
> y.java:198)
>         at
> org.apache.xalan.xsltc.util.IntegerArray.quicksort(IntegerArra
> y.java:198)
> 
> 
> 
> 
>  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