Replacing multiple characters in a string
Hi,
Goal: Replace multiple characters in a text string. I want to replace all occurences.
Parser: Altova built-in parser
OS: Windows XP
Issue: First character in the search replaces all occurences
Second character replaces last character, not first occurence
Third character does not get replaced
Source XML
<root>
<content>Register symbol® Copyright symbol© registration symbol again® trademark symbol⢠copyright symbol again©</content>
</root>
Output XML (ignore "_" underscore in numeric character entities)
<root>
<content>Register symbol&_#174; Copyright symbol© registration symbol again#_174; trademark symbol⢠copyright symbol#_169; again</content>
</root>
XSLT
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<!--
-->
<xsl:param name="reg.search" select="'®'"/>
<xsl:param name="reg.replace">
<xsl:text><![CDATA[®]]></xsl:text>
</xsl:param>
<xsl:param name="copy.search" select="'©'"/>
<xsl:param name="copy.replace">
<xsl:text><![CDATA[©]]></xsl:text>
</xsl:param>
<xsl:param name="trade.search" select="'â¢'"/>
<xsl:param name="trade.replace">
<xsl:text><![CDATA[â¢]]></xsl:text>
</xsl:param>
<!--
-->
<xsl:template name="search-replace">
<xsl:param name="text"/>
<xsl:choose>
<xsl:when test="contains($text, $reg.search)">
<xsl:value-of select="substring-before($text, $reg.search)"/>
<xsl:value-of select="$reg.replace" disable-output-escaping="yes"/>
<xsl:call-template name="search-replace">
<xsl:with-param name="text" select="substring-after($text, $reg.search)"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="contains($text, $copy.search)">
<xsl:value-of select="substring-before($text, $copy.search)"/>
<xsl:value-of select="$copy.replace" disable-output-escaping="yes"/>
<xsl:call-template name="search-replace">
<xsl:with-param name="text" select="substring-after($text, $copy.search)"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="contains($text, $trade.search)">
<xsl:value-of select="substring-before($text, $trade.search)"/>
<xsl:value-of select="$trade.replace" disable-output-escaping="yes"/>
<xsl:call-template name="search-replace">
<xsl:with-param name="text" select="substring-after($text, $trade.search)"/>
</xsl:call-template>
</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="search-replace">
<xsl:with-param name="text" select="."/>
</xsl:call-template>
</xsl:template>
<!--
-->
</xsl:transform>
|