is it possible to access a query
string using xslt?
Yes, if the query string is passed as a parameter.
The code below shows that no extension function is required to access a query-string. It can be passed as a (global) parameter. This is to be preferred as it reduces the need for extensions and results in cleaner and more readable code.
Then one can perform tokenization (with the tokenize()
function in XSLT 2.0 or in XSLT 1.0 using the str-split-to-words
template of FXSL 1.x or a self-written recursive tokenization template.)
XSLT 1.0 solution:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:ext="http://exslt.org/common"
>
<xsl:import href="strSplit-to-Words.xsl"/>
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vwordNodes">
<xsl:call-template name="str-split-to-words">
<xsl:with-param name="pStr" select="$pQString"/>
<xsl:with-param name="pDelimiters"
select="'?&'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="vLang" select=
"substring-after(ext:node-set($vwordNodes)/*
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
<xsl:value-of select="concat('lang = ', $vLang)"/>
</xsl:template>
</xsl:stylesheet>
when the above transformation is applied on any XML document (will not be used), the wanted result is produced:
lang = en
Do note the use of the FXSL 1.x str-split-to-words
template and the use of the EXSLT ext:node-set()
extension function.
XSLT 2.0 solution:
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xsl:output indent="yes" omit-xml-declaration="yes"/>
<xsl:param name="pQString" as="xs:string" select=
"'?login=userId&tag=XSLT&lang=en&level=expert'"
/>
<xsl:template match="/">
<xsl:variable name="vLang" as="xs:string" select=
"substring-after(
tokenize($pQString, '\?|&')
[starts-with(.,'lang=')]
[last()],
'lang='
)
"/>
lang = "<xsl:sequence select='$vLang'/>"
</xsl:template>
</xsl:stylesheet>
When the above XSLT 2.0 transformation is performed, it produces the correct result:
lang = "en"