возможно ли получить доступ к запросу
строка с использованием xslt?
Да, если строка запроса передается в качестве параметра .
Приведенный ниже код показывает, что для доступа к строке запроса функция расширения не требуется . Это может быть передано как (глобальный) параметр. Это должно быть предпочтительным, так как уменьшает необходимость в расширениях и приводит к более чистому и читаемому коду.
Затем можно выполнить токенизацию (с помощью функции tokenize()
в XSLT 2.0 или в XSLT 1.0, используя str-split-to-words
шаблон FXSL 1.x или самописный шаблон рекурсивного токенизации.)
XSLT 1.0 решение :
<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>
когда указанное преобразование применяется к любому документу XML (не будет использоваться), будет получен требуемый результат :
lang = en
Запишите использование шаблона FXSL 1.x str-split-to-words
и использование функции расширения EXSLT ext:node-set()
.
Решение XSLT 2.0 :
<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>
Когда выполняется указанное выше преобразование XSLT 2.0, оно дает правильный результат :
lang = "en"