Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用xslt的查询字符串_Xslt_Url - Fatal编程技术网

使用xslt的查询字符串

使用xslt的查询字符串,xslt,url,Xslt,Url,是否可以使用xslt访问查询字符串 我有一个网址 www.example.com/page.aspx?k=aa&lang=en 我想做一些像 如果lang=en <div>displaly stuff</div> 显示内容 否则 显示其他内容 您能告诉我如何使用xslt实现这一点吗?不在本机xslt中不可以,但您可以编写扩展对象来处理本机xslt范围之外的复杂函数,例如,在xslt中,您可以在样式表中插入名称空间,例如 xmlns:ex="my:Qs" 然后打电话

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

我有一个网址

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

我想做一些像

如果lang=en

<div>displaly stuff</div>
显示内容
否则

显示其他内容

您能告诉我如何使用xslt实现这一点吗?

不在本机xslt中不可以,但您可以编写扩展对象来处理本机xslt范围之外的复杂函数,例如,在xslt中,您可以在样式表中插入名称空间,例如

xmlns:ex="my:Qs"
然后打电话

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

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

因此,由您向XSLT处理器提供必要的变量数据作为参数

可以访问查询吗 使用xslt的字符串

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

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

然后可以执行标记化(使用XSLT 2.0中的函数或XSLT 1.0中使用的模板或自行编写的递归标记化模板)

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>
lang = en
<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>
  lang = "en"
请注意使用FXSL 1.x
str拆分为单词
模板以及使用EXSLT
ext:node-set()
扩展功能

XSLT 2.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>
lang = en
<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>
  lang = "en"

实际上,“XSLT不是编译代码”这句话并不总是正确的。还有XSLT处理器,例如.NET XslCompiledTransform类,它在执行转换之前生成已编译的CLR字节码。Saxon还有一个生成编译(JVM)字节码的选项,这和OP的问题没有什么关系,XSLT转换是否“自行运行”与是否以及如何访问查询字符串的问题无关。@Dimitre:我不同意。我认为这是关键点。你的答案也是这样说的。值必须作为参数传递。XSL文件本身无法从web请求加载查询字符串。是的,但将值作为参数传递在编译样式中都会发生ets和已解释的。无论代码是否编译。当前接受的答案不正确。访问查询字符串不需要扩展函数。它可以作为(全局)参数传递。这是首选,因为它减少了对扩展的需要,并导致更干净、更可读的代码。