This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: Is recursion in XSL really this difficult?
- To: <xsl-list at lists dot mulberrytech dot com>
- Subject: RE: [xsl] Is recursion in XSL really this difficult?
- From: "Michael Kay" <mhkay at iclway dot co dot uk>
- Date: Wed, 18 Jul 2001 02:32:40 +0100
- Reply-To: xsl-list at lists dot mulberrytech dot com
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@lists.mulberrytech.com
> [mailto:owner-xsl-list@lists.mulberrytech.com]On Behalf Of xmlhack .
> Sent: 17 July 2001 20:46
> To: XSL-List@lists.mulberrytech.com
> 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