[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
RE: [xsl] Is recursion in XSL really this difficult?
Subject: RE: [xsl] Is recursion in XSL really this difficult? From: "Michael Kay" <mhkay@xxxxxxxxxxxx> Date: Wed, 18 Jul 2001 02:32:40 +0100 |
Most of your <xsl:param> elements should be <xsl:variable> (and many of them should be reported as errors by a conformant processor). To process the entire text node I would expect to see three calls on xsl:call-template in the match="text()" template rule. No need to store the text in a variable; the current node in the source tree remains accessible after the first and second calls complete. Mike Kay Software AG > -----Original Message----- > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of xmlhack . > Sent: 17 July 2001 20:46 > To: XSL-List@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Is recursion in XSL really this difficult? > > > I posted a question about recursion a day or two ago, but all > of my efforts > since then have been unsuccessful. > > What I need to do is search a text node for a string and add > bolding around > that string when it's found (for HTML output). I CAN do that > thanks to > Kay's example in the XSLT book. But what I need to do now is > recurse over > THE ENTIRE string -- not just a piece of it -- a second and > third time to > find matches for a second and third string. > > Based on what I've seen in my failed attempts, I think what I > need to do is > store the entire text node in a string (or node set...no more > temp trees, > right?), process it the first time, process it a second time, > and process it > a third time. But, all my attempts to do this have resulted > in the text > node being output 3 times. > > If you can help, please let me know! > > The below is my original coding that works in a limited fashion: > > <xsl:param name="id" /> > <xsl:param name="p1" /> > <xsl:param name="p2" /> > <xsl:param name="p3" /> > <xsl:param name="p4" /> > <xsl:param name="p5" /> > <xsl:param name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:param> > <xsl:param name="lower">abcdefghijklmnopqrstuvwxyz</xsl:param> > <xsl:param name="left">>></xsl:param> > <xsl:param name="right"><<</xsl:param> > > <xsl:template name="do-replace"> > <xsl:param name="text" /> > > <xsl:choose> > <xsl:when test="contains(translate($text,$upper,$lower), > translate($p1,$upper,$lower))"> > <xsl:choose> > <xsl:when test="$p1!=''"> > <!--length of the text string to be analyzed--> > <xsl:param name="length"> > <xsl:value-of > select="string-length(substring-before(translate($text,$upper, > $lower), > translate($p1,$upper,$lower)))" /> > </xsl:param> > > <!--length of the search parameter--> > <xsl:param name="lengthandstring"> > <xsl:value-of select="string-length($p1)" /> > </xsl:param> > > <xsl:param name="lengthplusone"> > <xsl:value-of select="$length + 1" /> > </xsl:param> > > <!--first portion of text string--> > <xsl:value-of > select="substring($text,1,$length)" /> > <span class="searchresult"> > <xsl:value-of select="$left" /> > <!--the matched text--> > <xsl:value-of > select="normalize-space(substring($text,$lengthplusone,$length > andstring))" > /> > <xsl:value-of select="$right" /> > </span> > > <!--where the next text string should > start, as a piece of the current > string--> > <xsl:param name="start"> > <xsl:value-of select="$length + > string-length($p1) + 1" /> > </xsl:param> > > <xsl:call-template name="do-replace"> > <xsl:with-param name="text" > select="substring($text,$start)" /> > </xsl:call-template> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="$text" /> > </xsl:otherwise> > </xsl:choose> > </xsl:when> > <xsl:when test="contains(translate($text,$upper,$lower), > translate($p2,$upper,$lower))"> > <xsl:choose> > <xsl:when test="$p2!=''"> > <xsl:param name="length"> > <xsl:value-of > select="string-length(substring-before(translate($text,$upper, > $lower), > translate($p2,$upper,$lower)))" /> > </xsl:param> > > <xsl:param name="lengthandstring"> > <xsl:value-of select="string-length($p2)" /> > </xsl:param> > > <xsl:param name="lengthplusone"> > <xsl:value-of select="$length + 1" /> > </xsl:param> > > <xsl:value-of > select="substring($text,1,$length)" /> > <span class="searchresult"> > <xsl:value-of select="$left" /> > <xsl:value-of > select="normalize-space(substring($text,$lengthplusone,$length > andstring))" > /> > <xsl:value-of select="$right" /> > </span> > > <xsl:param name="start"> > <xsl:value-of select="$length + > string-length($p2) +1" /> > </xsl:param> > > <xsl:call-template name="do-replace"> > <xsl:with-param name="text" > select="substring($text,$start)" /> > </xsl:call-template> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="$text" /> > </xsl:otherwise> > </xsl:choose> > </xsl:when> > <xsl:otherwise> > <xsl:value-of select="$text" /> > </xsl:otherwise> > </xsl:choose> > </xsl:template> > > <xsl:template match="*"> > <xsl:copy> > <xsl:copy-of select="@*" /> > <xsl:apply-templates /> > </xsl:copy> > </xsl:template> > > <xsl:template match="text()"> > <xsl:call-template name="do-replace"> > <xsl:with-param name="text" select="." /> > </xsl:call-template> > </xsl:template> > > > > _________________________________________________________________ > Get your FREE download of MSN Explorer at http://explorer.msn.com > > > 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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Is recursion in XSL reall, Wendell Piez | Thread | [xsl] add variables, Chen, Zhongqing |
RE: Fwd: [xsl] complex XPATH test, Michael Kay | Date | RE: [xsl] Conditional variable assi, Michael Kay |
Month |