[xsl] Problem Dynamically Building Query String In XSLT 1.0

Subject: [xsl] Problem Dynamically Building Query String In XSLT 1.0
From: <Trish@xxxxxxxxxxxxxx>
Date: Tue, 31 Jul 2007 12:24:54 -0400
Hi:

I need to construct a query string of an unknown number of parts. I have
to use XSLT 1.0. We are also purposefully not using any asp in the
template, so I have to rely on XSLT 1.0 functionality alone.

My problem is detecting whether or not the element I'm adding to the
query string is the first element and therefore requires a "?" in front
of it or whether I should use "&amp;" instead.

For instance, here's a possible URL that I want to build:

pagename.aspx?page=2&sort=default&target=newpagename.aspx

When I'm building the string, none or part or all of the possible query
string elements may be present. In the interest of keeping the query
string as short as possible, I don't want to show any of the elements
that don't have values (aye, there's the rub). I also don't want to have
one of the elements always present so it is always first and eliminates
the problem of whether to add the &amp; or the ?.

My attempts so far have been REALLY ugly as they are repetitious and
code heavy, as you'll see below, as well as totally unsuccessful. Has
anyone else come up with a better way to do this?

Here's my last desperate attempt (the variable names used are the
possible values for the query string elements and are defined
elsewhere). I was trying to change the value of $paramQueryMark by
submitting as a parameter to queryMark, but the value of the parameter
is lost when I go back to queryBuilder:

<xsl:value-of select="$varPage" />
<xsl:call-template name="queryBuilder" />

<xsl:template name="queryBuilder">
	<xsl:param name="paramQueryMark" select="'false'" />
	<xsl:if test="string($varTarget) or string($varPageNumber) or
string($varSortSelected)">
		<xsl:text>?</xsl:text>
	</xsl:if>
	<xsl:if test="string($varTarget)">
		<xsl:if test="$paramQueryMark = 'true'">
			<xsl:text>&amp;</xsl:text>
		</xsl:if>
		target=<xsl:value-of select="$varTarget" />
		<xsl:call-template name="queryMark">
			<xsl:with-param name="paramQueryMark"
select="'true'" />
		</xsl:call-template>d
	</xsl:if>
	<xsl:if test="string($varPageNumber) and $varPageNumber != '1'">
		<xsl:if test="$paramQueryMark = 'true'">
			<xsl:text>&amp;</xsl:text>
		</xsl:if>
		page=<xsl:value-of select="$varPageNumber" />
		<xsl:call-template name="queryMark">
			<xsl:with-param name="paramQueryMark"
select="'true'" />
		</xsl:call-template>
	</xsl:if>
	<xsl:if test="string($varSortSelected)">
		<xsl:if test="$paramQueryMark = 'true'">
			<xsl:text>&amp;</xsl:text>
		</xsl:if>
		sort=<xsl:value-of select="$varSortSelected" />
		<xsl:call-template name="queryMark">
			<xsl:with-param name="paramQueryMark"
select="'true'" />
		</xsl:call-template>
	</xsl:if>
</xsl:template>

<xsl:template name="queryMark">
	<xsl:param name="paramQueryMark" />
</xsl:template>
</xsl:stylesheet>

Thanks for your help!
Trish

Current Thread