Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   XML (http://www.velocityreviews.com/forums/f32-xml.html)
-   -   Nested call-templates (http://www.velocityreviews.com/forums/t605598-nested-call-templates.html)

Hvid Hat 04-14-2008 08:55 PM

Nested call-templates
 
Hi

I want to search and replace multiple words in a text. I've got a template
that does the search and replace of a word in a text. Now, I want to call
this template for each word in a list of words. If changes are made (words
are replaced) in the text, how can I call the search and replace template
with this updated text the next time? Current I'm calling it with the
original text each time.

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0"> <xsl:template match="WordList">
<xsl:apply-templates select="Word"/>
</xsl:template>
<xsl:template match="Word">
<xsl:call-template name="replace-string">
<xsl:with-param name="text" select="Text"/> <!-- PROBLEM HERE -->
<xsl:with-param name="from" select="'Word'"/>
<xsl:with-param name="to" select="'replaced'"/>
</xsl:call-template>
</xsl:template>
<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:value-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:stylesheet>

Joseph J. Kesselman 04-15-2008 08:17 PM

Re: Nested call-templates
 
XSLT never modifies data in place; it always returns new data. Thus, if
you want to call a named template on changed data, it's up to you to
explicitly pass the changed data into that template as a parameter.

Multiple passes to successively change an XML tree are a pain unless
you're willing to store intermediate results into temporary trees and
reprocess those (which in 1.0 requires the nodeset extension function).
A better solution might be to gather all the changes you want to make,
and do a single pass over the source which applies them.

(If XSLT is fighing you, you may have expressed the problem in a form
which isn't natural for XSLT.)


All times are GMT. The time now is 12:06 AM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.