xsl-list
[Top] [All Lists]

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

2007-03-27 12:59:35
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:choose>
                <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:call-template>
                </xsl:when>
                <xsl:otherwise>
                        <xsl:value-of select="$text"/>
                </xsl:otherwise>
   </xsl:choose>

</xsl:template>


<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:call-template>
        </xsl:param>

        <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:call-template>
   </xsl:if>

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



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 ...>
</xsl:with-param>

but that doesn't seem to work either.


From: "Ignacio Garcia del Campo" <igarc001(_at_)hotmail(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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:string_replacements>

 <foo:search>

    <foo:find>XML</foo:find>

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

 </foo:search>

</foo:string_replacements>

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: http://sources.redhat.com/ml/xsl-list/2000-06/msg00200.html, but I need the links to be working.



Thanks.



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>