xsl-list
[Top] [All Lists]

RE: Error: when distance between section definitions exceed 3678 (roughly)

2005-11-30 11:45:52
Your stylesheet makes one call on xsl:apply-templates for each sibling. When
there are 3678 siblings there are going to be 3678 nested apply-templates
calls. Many processors under such conditions will run out of stack space. 

Your apply-templates calls are the last thing each template does, so they
are amenable to an optimization technique called tail-call-optimization. I
would have expected Saxon 6.5.x to apply this technique, but it's a long
time ago so I can't be sure. Certainly Saxon 8.x should handle it. However,
if you are determined to use MSXML for a problem that it can't handle, then
I can't help you.

The following tests are wrong:

<xsl:if test=".!=contains(.,$SSDD_START)">
      <xsl:if test=".=starts-with(.,$REQ_START)

You're comparing a singleton node-set to a boolean, which will always be
true. I don't know whether fixing that will help you.

Michael Kay
http://www.saxonica.com/ 

-----Original Message-----
From: geoff hopkins [mailto:geoffhopkins123(_at_)yahoo(_dot_)com] 
Sent: 30 November 2005 14:43
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Error: when distance between section 
definitions exceed 3678 (roughly)

The basic premise of the xsl below is to define
sections that fall between two marker points
'Application Software Requirements and 'Service
Function Requirements' .  The problem I have is if
these two marker points have roughly 3678 (or more)
other nodes between then

i.e.

1. <root>
2. <text>'Application Software Requirements</text>
3. <text></text>
..
..
3685. <text>Service Function Requirements</text>
3686. <text></text>
</root>

I get this error message (MSXML4.0)
Code: 0x80004005
The XSL Processor stack has overflowed - probable
cause is infinite template recursion.
I get this error message (Saxon 6.5.3)
An exception of type 'java/lang/StackOverflowError'
was not handled

Unfortunately I am tied into MSXML for this project,
any ideas why this is happening? do I need to redefine
my xsl, if yes will need a good guide as I am quite
rubbish at it.

Regards,

Geoff

p.s. can't supply the source xml as it contains
sensitive data.

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" indent="yes"/>
<xsl:variable name="SSDD_START">Application Software
Requirements</xsl:variable>
<xsl:variable name="SSDD_STOP">Service Function
Requirements</xsl:variable>
<xsl:variable name="REQ_START">R[</xsl:variable>
<xsl:variable name="REQ_STOP">]</xsl:variable>

<xsl:param name="DOC_REF"/>

<xsl:template match="pdf2xml">
      <root>
              <artefact doc_ref="{$DOC_REF}">
                      <xsl:apply-templates select="text[1]"/>
              </artefact>
      </root>
</xsl:template>

<xsl:template match="text">
<xsl:if test=".!=contains(.,$SSDD_START)">
      <xsl:if test=".=starts-with(.,$REQ_START) and
substring(.,string-length(.),1)=$REQ_STOP">
              <instance type_id="1">
                      <xsl:attribute name="doc">
                              <xsl:value-of select="$DOC_REF"/>
                      </xsl:attribute>
                      <xsl:attribute name="sec">
                              <xsl:value-of select="."/>
                      </xsl:attribute>
              </instance>
      </xsl:if>
</xsl:if>
      <xsl:apply-templates
select="following-sibling::text[1]"/>
</xsl:template>

<xsl:template match="text[contains(.,'Service Function
Requirements')]">
      <xsl:apply-templates
select="following-sibling::text[contains(.,$SSDD_START)][1]"/>
</xsl:template>

<xsl:template match="text[1]">
      <xsl:apply-templates
select="following-sibling::text[contains(.,$SSDD_START)][1]"/>
</xsl:template>

</xsl:stylesheet>


      
              
__________________________________ 
Yahoo! Mail - PC Magazine Editors' Choice 2005 
http://mail.yahoo.com

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--





--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>