XQuery/解析查询字符串
外观
< 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
此基本函数从 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
};
此函数检索与查询字符串中给定参数键的值相对应的字符串值序列。请注意,虽然通常该序列中只有一个字符串,但如果查询字符串的格式为 ?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
};
此函数检索每个查询字符串键的名称(每个键只检索一次)。
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