Subject: RE: [xsl] Too many apply-templates call error -- can't figure out what causes the error From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 18 Nov 2005 11:39:13 -0000 |
> Hi! the listEXP.txt i have included here is just a > part of the actual listEXP.txt; on the original list > there are 1400 strings. what i have listed below > consist only 9 strings. i tested the xsl again using > the list of 9 strings and it was ok. so i think the > error comes in when the list is too big for the > processor... am i correct at this??? if so how can i > correct my xsl so that i can handle a list file with > many strings??? Yes, I was coming to the same conclusion. Your code appears to be essentially correct but has run out of stack space. Saxon should be able to handle this with a technique called tail call optimization - your recursive call is the last thing the function does, so the optimizer should turn it into a loop. It's not clear to me at first sight why this isn't happening. If you can send me the required files I'll take a look at it, though it may not be for a few days. Michael Kay http://www.saxonica.com/ > > --UlyLee > > --- UlyLee <ulyleeka@xxxxxxxxx> wrote: > > > I'm running an xsl transformation using saxon 8.6 > > and > > i encounter this error, 'too many apply-template > > calls'. The purpose of the xslt is to tag all > > strings > > in the listEXP.txt file with EXP. I have 2 templates > > to match, 1st the template that matches * which > > simply > > copies the element and its attributes. the 2nd is a > > template that matches > > text()[name(parent::*)!='EXP'], > > here it should search all the occurrences of the > > strings and tag it with EXP. > > > > I have created two functions, 1 is the > > tmpReplacement > > function which creates a tree of strings that i will > > use as temporary replacement strings. and the other > > is > > the replace-all function that do the search and > > replace function. > > > > the error message points me to the apply-templates > > in > > the template that matches * but i think thats not > > the > > one actually causing the error because when i remove > > the elements that calls the replace-all function the > > transformation is a success. > > > > so i think the error is in the replace-all function > > but i can't seem to find out which part of the > > function is actually causing it. > > > > this is the xsl file: > > > > <?xml version="1.0" encoding="UTF-8"?> > > <xsl:stylesheet version="2.0" > > xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > > xmlns:xs="http://www.w3.org/2001/XMLSchema" > > xmlns:f="data:,f"> > > <xsl:output method="xml" version="1.0" > > encoding="utf-8" indent="yes"/> > > <xsl:variable name="wordLst" as="xs:string*"> > > <xsl:analyze-string > > select="unparsed-text('listEXP.txt','utf-8')" > > regex="[\r\n]"> > > <xsl:non-matching-substring> > > <xsl:value-of select="."/> > > </xsl:non-matching-substring> > > </xsl:analyze-string> > > </xsl:variable> > > <xsl:template match="/"> > > <xsl:apply-templates/> > > </xsl:template> > > <xsl:template match="*"> > > <xsl:element name="{name(.)}"> > > <xsl:copy-of select="@*"/> > > <xsl:apply-templates/> > > </xsl:element> > > </xsl:template> > > <xsl:template > > match="text()[name(parent::*)!='EXP']"> > > <xsl:variable name="repLst" as="xs:string*" > > select="for $i in (1 to count($wordLst)) return > > f:tempReplacement($i)"/> > > <xsl:variable name="tmpStr" > > select="f:replace-all(.,$wordLst,$repLst,1)"/> > > <xsl:value-of > > select="f:replace-all($tmpStr,$repLst,$wordLst,0)"/> > > </xsl:template> > > <!--Function that creates a tree node of temporary > > replacement strings.--> > > <xsl:function name="f:tempReplacement" > > as="xs:string"> > > <xsl:param name="value" as="xs:integer"/> > > <xsl:value-of select="if ($value < 10) then > > concat('replacement','00',$value) else if ($value > > > > > 9 and $value < 100) then > > concat('replacement','0',$value) else > > concat('replacement',$value)"/> > > </xsl:function> > > <!--Function that simulates a replace-all function > > and > > returns the replaced string.--> > > <xsl:function name="f:replace-all"> > > <xsl:param name="input" as="xs:string"/> > > <xsl:param name="words-to-replace" as="xs:string*"/> > > <xsl:param name="replacement" as="xs:string*"/> > > <xsl:param name="flag" as="xs:integer"/> > > <xsl:choose> > > <xsl:when test="$flag=1"> > > <xsl:sequence select="if (exists($words-to-replace)) > > then f:replace-all(replace($input, > > replace($words-to-replace[1], '[.\\?*+{}()\[\]^$]', > > '\\$0'), > > > $replacement[1],'i'),remove($words-to-replace,1),remove($repla > cement,1),1) > > else $input"/> > > </xsl:when> > > <xsl:otherwise> > > <xsl:sequence select="if (exists($words-to-replace)) > > then f:replace-all(replace($input, > > replace($words-to-replace[1], '[.\\?*+{}()\[\]^$]', > > '\\$0'), > > > concat('<EXP>',$replacement[1],'</EXP>')),remove($words-to-rep > lace,1),remove($replacement,1),0) > > else $input"/> > > </xsl:otherwise> > > </xsl:choose> > > </xsl:function> > > </xsl:stylesheet> > > > > this is the listEXP.txt > > Faire-part > > Par-dessus > > S. Prieure > > dernier-ni > > sang-froid > > sage-femme > > Brise-bise > > branle-bas > > ` peu prhs > > > > here is the source xml: > > <?xml version="1.0" encoding="ISO-8859-1"?> > > <CORPUS> > > <T1> > > <LIB> > > <T>1901-1913</T>trois cent soixante-cinq > > chambres ` coucher > > <EXP>Faire-part</EXP> > > Faire-part > > sage-femme > > Brise-bise > > branle-bas > > ` peu prhs > > </LIB> > > </T1> > > </CORPUS> > > > > > > thanks, > > UlyLee > > > > > > > > > > > > __________________________________ > > Yahoo! Mail - PC Magazine Editors' Choice 2005 > > http://mail.yahoo.com > > > > > > > > > __________________________________ > Yahoo! FareChase: Search multiple travel sites in one click. > http://farechase.yahoo.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Too many apply-templates , UlyLee | Thread | Re: [xsl] Too many apply-templates , Mike Ferrando |
[xsl] setURIResolver, Fraser Goffin | Date | Re: [xsl] setURIResolver, andrew welch |
Month |