[xsl] String replace special case

Subject: [xsl] String replace special case
From: António Mota <amsmota@xxxxxxxxx>
Date: Mon, 6 Feb 2006 17:00:41 +0000
I wrote this special case of string replace and tought to post this to
go to the list archives, maybe it'll be usefull to someone.

It's used to replace some keywords in a url-like string with the
results from another url-like string, for example, with

list_entidadeprocessos.aspx?k=PAI&amp;entidade_k={ENTIDADE_K}&amp;processo_k=
{PROCESSO_K}

and

?businessclass=PROCESSO&amp;k=K00047&amp;processo_k=XX0001'

will give

list_entidadeprocessos.aspx?k=PAI&amp;entidade_k=K00047&amp;processo_k=XX0001


In my concrete case the first string is retrieved from a database
where some app definitions are stored, and the secons is the qwery
string of the actual page where the transformation is being made.


It has two minor bugs that none of the users have found, i'll fix then
one of theses days :)


	<xsl:template name="replace-values">
		<xsl:param name="textfrom"/>
		<xsl:param name="textwhere"/>
		<xsl:variable name="lower">abcdefghijklmnopqrstuvwxyz</xsl:variable>
		<xsl:variable name="upper">ABCDEFGHIJKLMNOPQRSTUVWXYZ</xsl:variable>
		<xsl:choose>
			<xsl:when test="contains($textfrom, '{')">
				<xsl:variable name="lookfor"
select="substring-before(substring-after($textfrom,'{'),'}')"/>
				<xsl:variable name="before" select="substring-before($textfrom,
concat('{',$lookfor,'}'))"/>
				<xsl:variable name="after" select="substring-after($textfrom,
concat('{',$lookfor,'}'))"/>
				<xsl:variable name="value">
					<xsl:variable name="ulookfor" select="translate($lookfor, $lower,
$upper)"/>
					<xsl:variable name="llookfor" select="translate($lookfor, $upper,
$lower)"/>
					<xsl:variable name="utextwhere" select="translate($textwhere,
$lower, $upper)"/>
					<xsl:variable name="ltextwhere" select="translate($textwhere,
$upper, $lower)"/>
					<xsl:choose>
						<xsl:when
test="substring-before(substring-after($utextwhere,concat($ulookfor,'=')),'&a
mp;')">
							<xsl:value-of
select="substring-before(substring-after($utextwhere,
concat($ulookfor,'=')),'&amp;')"/>
						</xsl:when>
						<xsl:when
test="substring-before(substring-after($ltextwhere,concat($llookfor,'=')),'&a
mp;')">
							<xsl:value-of
select="substring-before(substring-after($ltextwhere,
concat($llookfor,'=')),'&amp;')"/>
						</xsl:when>
						<xsl:when test="substring-after($utextwhere, concat($ulookfor,'='))">
							<xsl:value-of select="substring-after($utextwhere,
concat($ulookfor,'='))"/>
						</xsl:when>
						<xsl:when test="substring-after($ltextwhere, concat($llookfor,'='))">
							<xsl:value-of select="substring-after($ltextwhere,
concat($llookfor,'='))"/>
						</xsl:when>
					</xsl:choose>
				</xsl:variable>
				<xsl:value-of select="$before"/>
				<xsl:value-of select="$value"/>
				<xsl:call-template name="replace-values">
					<xsl:with-param name="textfrom" select="$after"/>
					<xsl:with-param name="textwhere" select="$textwhere"/>
				</xsl:call-template>
			</xsl:when>
			<xsl:otherwise>
				<xsl:value-of select="$textfrom"/>
			</xsl:otherwise>
		</xsl:choose>
	</xsl:template>

Current Thread