[xsl] Re: String replace special case

Subject: [xsl] Re: String replace special case
From: António Mota <amsmota@xxxxxxxxx>
Date: Mon, 13 Feb 2006 16:50:14 +0000
Hi:

I'm correcting the two bugs, the first one is when a "lookfor keyword"
has no value, like in this test case, there's no value corresponding
to ENTIDADE_K in $textwhere

	<xsl:template match="/">
		<xsl:call-template name="replace-values">
			<xsl:with-param name="textfrom"
					select="'list_entidadeprocessos.aspx?k=PAI&amp;entidade_k={ENTIDADE_K}&a
mp;processo_k={PROCESSO_K}'"/>
			<xsl:with-param name="textwhere"
select="'?businessclass=PROCESSO&amp;ENTIDADE_K=&amp;processo_k=xx0001'"/>
		</xsl:call-template>
	</xsl:template>

but i'm not happy with the solution, it does not folow a straight
logic, it's what we call "martelada" in my language... How can i have
a more "elegant" solution?

	<xsl:template name="replace-values">
		<xsl:param name="textfrom"/>
		<xsl:param name="textwhere"/>
		<!--xsl:variable name="textfrom" select="concat($textfrom0,'&amp;')"/-->
		<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:variable name="stest"
select="substring-after($utextwhere, concat($ulookfor,'='))"/>
							<xsl:if test="not(starts-with($stest,'&amp;'))">
								<xsl:value-of select="substring-after($utextwhere,
concat($ulookfor,'='))"/>
							</xsl:if>
						</xsl:when>
						<xsl:when test="substring-after($ltextwhere, concat($llookfor,'='))">
--------------------------------------> 		<xsl:variable name="stest"
select="substring-after($ltextwhere, concat($llookfor,'='))"/>
							<xsl:if test="not(starts-with($stest,'&amp;'))">
								<xsl:value-of select="substring-after($ltextwhere,
concat($llookfor,'='))"/>
							</xsl:if>
						</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>


On 06/02/06, Antsnio Mota <amsmota@xxxxxxxxx> wrote:
> 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