跳至内容

XQuery/解析查询字符串

来自维基教科书,开放世界中的开放书籍

正常的 http 查询字符串使用“&”字符来区分查询字符串中的不同项。但是,由于“&”也用作 HTML 和 XML 中实体的起始符号,因此这可能导致将参数化内容编码到 XML 链接中变得困难,而且它也使得视觉上难以理解查询字符串。

本程序演示了如何使用其他分隔符(如分号)来解析查询字符串。

本程序演示了一些标准的 XQuery 函数,这些函数不是原始 XQuery 规范的一部分,但对于精确的 Web 服务器 XQuery 功能是必需的。

这些函数是

  • exist request:get-method()
  • exist util:unescape-uri()
  • exist request:get-query-string()
  • exist request:get-parameter()
  • exist request:get-parameter-names()

命名空间

[编辑 | 编辑源代码]
 module namespace common="http://www.example.org/xmlns/common";
  • eXist

解析查询字符串

[编辑 | 编辑源代码]

common:get-parameters

[编辑 | 编辑源代码]

此基本函数从 URI 中检索查询字符串,使用给定的分隔符解析字符串并创建以下形式的 XML 结构

  <params>
    <param name="param1" value="paramval1"/>
    <param name="param2" value="paramval2"/>
  </params>
  declare function common:get-parameters($delimiter as xs:string) as node() {
     let $params := if (request:get-method() = "GET") then 
          let $query-string := util:unescape-uri(request:get-query-string(),"UTF-8")
          let $parsed-query := tokenize($query-string,$delimiter)
          return <params>
          {for $parsed-query-term in $parsed-query 
                let $parse-query-name := substring-before($parsed-query-term,"=")
                let $parse-query-value := substring-after($parsed-query-term,"=")
                return <param name="{$parse-query-name}" value="{$parse-query-value}"/>
                }
          </params>          
       else 
          <params>
              {for $name in request:get-parameter-names()
                    let $parse-query-name := $name
                    let $parse-query-value := request:get-parameter($name,"")                    
                return <param name="{$parse-query-name}" value="{$parse-query-value}"/>
                }
          </params>
    return $params
    };

common:get-parameter

[编辑 | 编辑源代码]

此函数检索与查询字符串中给定参数键的值相对应的字符串值序列。请注意,虽然通常该序列中只有一个字符串,但如果查询字符串的格式为 ?a=val1;b=val2;a=val3,则 get-parameter("a","",";") 将返回 ("val1","val3")

  declare function common:get-parameter($param-name as xs:string,$default-value as xs:string,$delimiter as xs:string) as xs:string* {
    let $params := common:get-parameters($delimiter)
    let $param-nodes := $params/param[@name=$param-name]
    let $param-values := 
       for $param-node in $param-nodes 
       return 
         if ($param-node/@value) 
         then string($param-node/@value) 
         else $default-value 
    return  $param-values
    };

common:get-parameter-names

[编辑 | 编辑源代码]

此函数检索每个查询字符串键的名称(每个键只检索一次)。

   
  declare function common:get-parameter-names($delimiter as xs:string) as xs:string* {
    let $params := common:get-parameters($delimiter)
    for $param-name in distinct-values($params/param/@name)
    return $param-name
    };

示例程序

[编辑 | 编辑源代码]

假设查询字符串为 http://www.example.org/?a=5;b=test;a=8;c=new+message

 let $msg := common:get-parameter("c","",";")
 return $msg
 

返回

 new message   

 
  {
    for $key in common:get-parameter-names(";")
    return 
       <seq>{$key}:{common:get-parameter($key,"",";")}</seq>
  }
 

返回

 
   <seq>a:5 8</seq>
   <seq>b:test</seq>
   <seq>c:new message</seq>
 

   let $seq1 := common:get-parameter("a",0,";")
   return  sum(for $n in $seq1 return number($n))

返回

 13

华夏公益教科书