[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] 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,$lengthandstring))" /> <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,$lengthandstring))" /> <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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|