xsl-list
[Top] [All Lists]

RE: [xsl] Problem Dynamically Building Query String In XSLT 1.0

2007-07-31 09:39:01
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>&amp;</xsl:text>
  </xsl:if>
  <xsl:if test="$varPage">
    <xsl:text>page=</xsl:text>
    <xsl:value-of select="$varPage">
    <xsl:text>&amp;</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 "&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

--~------------------------------------------------------------------
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>
--~--