【问题标题】:querystring using xslt使用 xslt 的查询字符串
【发布时间】:2009-05-01 11:12:49
【问题描述】:

是否可以使用 xslt 访问查询字符串?

我有一个网址,例如

www.example.com/page.aspx?k=aa&lang=en

我想做类似的事情

如果 lang = en

<div>displaly stuff</div>

其他

 <div>display other stuff</div>

你能告诉我如何使用 xslt 做到这一点吗?

【问题讨论】:

  • 当前接受的答案不正确。访问查询字符串不需要扩展函数。它可以作为(全局)参数传递。这是首选,因为它减少了对扩展的需求,并导致代码更清晰、更易读。

标签: xslt url


【解决方案1】:

是否可以访问查询 使用 xslt 的字符串?

是的,如果查询字符串作为参数传递

下面的代码表明访问查询字符串不需要扩展函数。它可以作为(全局)参数传递。这是首选,因为它减少了对扩展的需求,并产生了更清晰、更易读的代码。

然后可以执行标记化(使用 XSLT 2.0 或 XSLT 1.0 中的 tokenize() 函数,使用 FXSL 1.xstr-split-to-words 模板或自写的递归标记化模板。)

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"

【讨论】:

    【解决方案2】:

    在本机 XSLT 中没有,但您可以编写扩展对象来处理本机 XSLT 范围之外的复杂功能,例如,在您的 XSLT 中,您可以将命名空间插入到样式表中,例如

    xmlns:ex="my:Qs"
    

    然后调用

    <xsl:variable name="qs" select="my:Qs('parameterName')"/>
    

    【讨论】:

      【解决方案3】:

      不,因为 XSLT 不是独立运行的编译代码。它是一种用于转换 XML 数据的技术,它被一些 XSLT 处理器调用。

      因此,由您决定将必要的变量数据作为参数提供给 XSLT 处理器。

      【讨论】:

      • 实际上,“XSLT 不是编译代码”这句话并不总是正确的。有 XSLT 处理器,例如 .NET XslCompiledTransform 类,它在执行转换之前生成已编译的 CLR 字节码。 Saxon 还可以选择生成已编译的 (JVM( 字节码。这与 OP 的问题无关。
      • XSLT 转换是否“自行运行”与它是否以及如何访问查询字符串的问题无关。
      • @Dimitre:我不同意。我认为这是关键点。这也是你的回答所说的。该值必须作为参数传递。 XSL 文件本身无法从 Web 请求中加载查询字符串。
      • 是的,但是将值作为参数传递会发生在编译样式表和解释样式表中。代码编译与否无关紧要。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-20
      • 2015-02-11
      • 2014-05-05
      • 2019-03-08
      相关资源
      最近更新 更多