строка запроса с использованием xslt - PullRequest
1 голос
/ 01 мая 2009

возможно ли получить доступ к строке запроса с помощью xslt?

У меня есть URL, например

www.example.com / page.aspx? К = аа & = Ланг ен

Я хочу сделать что-то вроде

если lang = en

<div>displaly stuff</div>

еще

 <div>display other stuff</div>

Можете ли вы показать мне, как это сделать с помощью xslt?

Ответы [ 3 ]

8 голосов
/ 01 мая 2009

возможно ли получить доступ к запросу строка с использованием 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&amp;tag=XSLT&amp;lang=en&amp;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="'?&amp;'"/>
      </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&amp;tag=XSLT&amp;lang=en&amp;level=expert'"
     />

    <xsl:template match="/">
      <xsl:variable name="vLang" as="xs:string" select=
      "substring-after(
                       tokenize($pQString, '\?|&amp;')
                                 [starts-with(.,'lang=')]
                                    [last()],

                       'lang='
                       )
      "/>

      lang = "<xsl:sequence select='$vLang'/>"
    </xsl:template>
</xsl:stylesheet>

Когда выполняется указанное выше преобразование XSLT 2.0, оно дает правильный результат :

  lang = "en"
1 голос
/ 01 мая 2009

Нет, потому что XSLT не является скомпилированным кодом, который выполняется сам по себе. Это технология для преобразования XML-данных, и она вызывается некоторым процессором XSLT.

Итак, вы должны предоставить необходимые переменные данные в качестве параметров вашему процессору XSLT.

1 голос
/ 01 мая 2009

Нет в собственном XSLT, нет, но вы можете написать объекты расширения, которые обрабатывают сложные функции, которые находятся вне области действия собственного XSLT, поэтому, например, в вашем XSLT вы можете вставить пространство имен в таблицу стилей, например

xmlns:ex="my:Qs"

, а затем позвоните

<xsl:variable name="qs" select="my:Qs('parameterName')"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...