Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 617
  • Last Modified:

How to read a query string with XSL

I need to get a value from a query string and use it in an xsl:if statment.  How is this done.  I am running my app on Apache.
0
bzak
Asked:
bzak
  • 4
  • 3
1 Solution
 
rdcproCommented:
I'm not sure this is possible directly in the XSLT with XSLT processors that would run on Apache, but here's one way to do it using MSXML:

http://dev.rdcpro.com/Members/rdcpro/snippets/xsltquerystrings/

The "right" way to do it is to pass the query string in server-side as a parameter to the transform.  But this would require some sort of server-side scripting/programming language, which you haven't mentioned.   Here's how I've done it client-side, using IE6:

function getParam(strParam)
{
      strQueryString = decode(window.location.search);
      iTerm = strQueryString.indexOf(strParam + "=")
      if (iTerm != -1)
      {
            strSubQuery = strQueryString.substring(iTerm + strParam.length + 1)
            iTermEnd = strSubQuery.indexOf("&")
            if (iTermEnd == -1)
            {
                  iTermEnd = strSubQuery.length
            }
            strSubQuery = strSubQuery.substring(0, iTermEnd)
      }
      else
      {
            strSubQuery = null
      }
      return strSubQuery
}
// URL Decodes the string
function decode(str) {
     return unescape(str.replace(/\+/g, " "));
}



Then when calling the transform, you add the parameter to the XSLT like:

xslProc.addParameter("pMyParam", getParam('foo'));



Regards,
Mike Sharp
0
 
bzakAuthor Commented:
How do I use:

xslProc.addParameter("pMyParam", getParam('foo'));

in an xsl:if statement?
0
 
rdcproCommented:
This:

xslProc.addParameter("pMyParam", getParam('foo'));

sets a parameter in the XSLT like:

<xsl:param name="pMyParam"/>

so that during transformation, the parameter functions as if it was created like:

<xsl:param name="pMyParam">bar</xsl:param>

Which is used like (for example, assuming the querystring was foo=bar):

<xsl:if test="$pMyParam = 'bar'">foo equals bar</xsl:if>

For a complete example of setting parameters during transformation, look at my dynamic filter and sort example:

http://rdcpro.com/Members/rdcpro/snippets/filterandsort/

This sets nodelists as parameters, as well, which has interesting implications.

Regards,
Mike Sharp
0
Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

 
rdcproCommented:
In any case, you'll need to use whatever flavor of a template processor you have available to you...like Xalan or whatever.  Just make sure it has the ability to set parameters externally.

Regards,
Mike Sharp
0
 
bzakAuthor Commented:
Ok, now for the tricky part....

I am importing two templates into a master....

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="fpForm_ST.xsl"/>
<xsl:import href="fpTemplate.xsl"/>
</xsl:stylesheet>

The query string variable needs to be read by fpTemplate.xsl.  This does not work.  It only works if I remove the import statement for fpForm.xsl.
0
 
bzakAuthor Commented:
Actually I was able to get it to work with your example:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:msxsl="urn:schemas-microsoft-com:xslt"
  xmlns:url="uri:find-url.org"
  exclude-result-prefixes="msxsl">
 
  <xsl:output method="html" indent="yes" encoding="iso-8859-1"/>
   <xsl:variable name="xmlpath" select="url:findURL(.)" />
  <xsl:variable name="search">
    <xsl:if test="contains($xmlpath,'?')">
      <xsl:value-of select="substring-after($xmlpath,'?')" />
    </xsl:if>
  </xsl:variable>
  <msxsl:script language="JScript" implements-prefix="url">
    function findURL(nodelist)
    {
      return nodelist.nextNode().url;
    }
  </msxsl:script>

    <html>
      <link href="style.css" rel="stylesheet" type="text/css" />
      <body>
        <xsl:for-each select="planName">
          <xsl:text>The search string is: </xsl:text>
          <xsl:value-of select="$search" />
        </xsl:for-each>
            

Bu I am not sure how to cut up the string....
I am getting:

The search string is: test1=Test&test2=test

I want to use the value of test1 in the if statement
0
 
rdcproCommented:
This should work:

<xsl:value-of select="substring-before(substring-after($search, 'test1'), '&amp;')"/>

Regards,
Mike Sharp
0

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now