RE: [xsl] Multiple String Replacements [with a twist]

Subject: RE: [xsl] Multiple String Replacements [with a twist]
From: "Ignacio Garcia del Campo" <igarc001@xxxxxxxxxxx>
Date: Tue, 27 Mar 2007 15:58:12 -0400
I was able to get one step closer to my goal...

Here is my replace function and the recursive call:

<xsl:template name="replace-string">
   <xsl:param name="text"/>
   <xsl:param name="from"/>
   <xsl:param name="to"/>

		<xsl:when test="contains($text, $from)">

			<xsl:variable name="before" select="substring-before($text, $from)"/>
			<xsl:variable name="after" select="substring-after($text, $from)"/>
			<xsl:variable name="prefix" select="concat($before, $to)"/>
			<xsl:value-of select="$before"/>
			<xsl:copy-of select="$to"/>
			<xsl:call-template name="replace-string">
			  <xsl:with-param name="text" select="$after"/>
			  <xsl:with-param name="from" select="$from"/>
			  <xsl:with-param name="to" select="$to"/>
			<xsl:value-of select="$text"/>


<xsl:template name="replace-strings"> <xsl:param name="text" /> <xsl:param name="changes" /> <xsl:param name="count" />

	<xsl:param name="returnString">
		<xsl:call-template name="replace-string">
			<xsl:with-param name="text" select="$text"/>
			<xsl:with-param name="from" select="$changes/change[$count]/text" />
			<xsl:with-param name="to" select="$changes/change[$count]/link" />

	<xsl:if test="$count > 1">
		<xsl:call-template name="replace-strings">
			<xsl:with-param name="text" select="$returnString" />
			<xsl:with-param name="changes" select="$changes" />
			<xsl:with-param name="count" select="$count - 1" />

	<xsl:if test="$count = 1">
		<xsl:copy-of select="$returnString" />

As you can see, I have my changes saved as text and link.

By changing two VALUE-OF statemetns by COPY-OF statatements I was able to get the last change to hold the anchor, but all other previous replacements dissapear.

Is there a way to send a parameter to a function containing the anchor values?

I think that there is where I loose the anchors, since I have to resend the variables, the copy-of does not stick and the anchor information is lost.

I tried using
<xsl:with-param ...>
 <xsl:copy-of select ...>

but that doesn't seem to work either.

From: "Ignacio Garcia del Campo" <igarc001@xxxxxxxxxxx>
Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] Multiple String Replacements [with a twist]
Date: Tue, 27 Mar 2007 14:56:11 -0400

Hello all,

I just started working with XSLT and I find my self stuck on this issue.

I want to replace multiple strings for some for most of my elements and by looking at some discussions and some code by Jeni Tennison I can replace all instances of my strings by a simple replacement. However, what I actually want to do, is to replace the strings by links.

My replacements look like this:




<foo:replace><a href="">XML-SITE</a></foo:replace>



If I use <xlst:copy-of select="foo:search[xx]/replace" /> the HTML shows the link correctly, but since I am doing multiple substitions of multiple strings I use recursion, and the function where the strings are exchanged fails to correctly place the anchor code on the output.

I get XML replaced by XML-SITE but the anchor information is lost in the process.

I have tried using CDATA sections, but then as you might expect I get the escaped string and that's not good either.

Does anyone know how to solve this problem?

I have been using something similar to this:, but I need the links to be working.


Current Thread