Given the limitations of 1.0, where you can't manipulate sequences of
strings, or create and then process temporary trees, I would do:
<xsl:variable name="u">
<xsl:text>pagename.aspx?</xsl:text>
<xsl:if test="$varTarget">
<xsl:text>target=</xsl:text>
<xsl:value-of select="$varTarget">
<xsl:text>&</xsl:text>
</xsl:if>
<xsl:if test="$varPage">
<xsl:text>page=</xsl:text>
<xsl:value-of select="$varPage">
<xsl:text>&</xsl:text>
</xsl:if>
.. repeat for other parameters
</xsl:variable>
<xsl:value-of select="substring($u, 1, string-length($u - 1))"/>
that is, add an & after every parameter, then at the end strip off the last
character of the string.
Michael Kay
http://www.saxonica.com/
-----Original Message-----
From: Trish(_at_)musictoday(_dot_)com
[mailto:Trish(_at_)musictoday(_dot_)com]
Sent: 31 July 2007 17:25
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Problem Dynamically Building Query String In XSLT 1.0
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 "&" 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 & 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>&</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>&</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>&</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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--