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