[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

RE: Is recursion in XSL really this difficult?

Subject: RE: Is recursion in XSL really this difficult?
From: "Michael Kay" <mhkay@xxxxxxxxxxxx>
Date: Wed, 18 Jul 2001 02:32:40 +0100
string length recursion
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:  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">&#62;&#62;</xsl:param>
> <xsl:param name="right">&#60;&#60;</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

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.