XQuery/加法器
外觀
< XQuery
我們想建立一個簡單的 XQuery,它接受兩個引數並返回這兩個數字的總和。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
(: get the parameters from the URL :)
let $arg1 := xs:integer(request:get-parameter("arg1", "1"))
let $arg2 := xs:integer(request:get-parameter("arg2", "5"))
return
<results>
<sum>{$arg1+$arg2}</sum>
</results>
像這樣呼叫:http://kitwallace.co.uk/xqbook/interaction/adder.xq?arg1=123&arg2=456。
<results>
<sum>579</sum>
</results>
為了將其擴充套件為互動式應用程式,我們可以擴充套件指令碼以建立包含表單的 XHTML 文件。
該指令碼從 URL 引數(如果有)計算新的總和,並返回一個包含表單的最小 XHTML 文件,該表單既報告總和,又提示輸入新的值。請注意嵌入的 XQuery 表示式(在花括號中),它將計算出的值插值到建立的 XML 元素中。計算狀態(累加器的值)儲存在表單中的隱藏輸入中。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
let $sum := xs:integer(request:get-parameter("sum",0))
let $number := xs:integer(request:get-parameter("number","0"))
let $newSum := $sum + $number
return
<html>
<head><title>Accumulating Adder</title></head>
<body>
<h1>Accumulating Adder</h1>
<form>
{$newSum} + <input type="text" name="number" value="{$number}" />
<input type="hidden" name="sum" value="{$newSum}"/>
</form>
</body>
</html>
嘗試這個http://kitwallace.co.uk/xqbook/interaction/adder2.xq
為了支援清除累加器的操作,我們可以向表單中新增幾個提交按鈕。'清除'操作的存在用於將輸入設定為零。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
let $action := request:get-parameter("action","")
let $sum :=
if ($action= "clear")
then 0
else xs:integer(request:get-parameter("sum",0))
let $number :=
if ($action = "clear")
then 0
else xs:integer(request:get-parameter("number",0))
let $newSum := $sum + $number
return
<html>
<head><title>Accumulating Adder</title></head>
<body>
<h1>Accumulating Adder</h1>
<form>
{$newSum} + <input type="text" name="number" value="{$number}" />
<input type="hidden" name="sum" value="{$newSum}"/>
<input type="submit" name="action" value="add"/>
<input type="submit" name="action" value="clear"/>
</form>
</body>
</html>
使用這個嘗試:http://kitwallace.co.uk/xqbook/interaction/adder3.xq
儲存此計算狀態的另一種方法是使用會話變數。eXist 中的會話模組提供了必要的函式。
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace session="http://exist-db.org/xquery/session";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare option exist:serialize "method=xhtml media-type=text/html indent=yes";
let $sum := if (exists(session:get-attribute("sum")))
then session:get-attribute("sum")
else 0
let $action := request:get-parameter("action","")
let $sum :=
if ( $action= "clear")
then 0
else $sum
let $number :=
if ($action = "clear")
then 0
else xs:integer(request:get-parameter("number","0"))
let $newSum := $sum + $number
let $s := session:set-attribute("sum",$newSum)
return
<html>
<head><title>Accumulating Adder</title></head>
<body>
<h1>Accumulating Adder</h1>
<form>
{$newSum} + <input type="text" name="number" value="{$number}" />
<input type="submit" name="action" value="add"/>
<input type="submit" name="action" value="clear"/>
</form>
</body>
</html>
使用這個嘗試:http://kitwallace.co.uk/xqbook/interaction/adder4.xq
xquery version "1.0";
declare namespace request="http://exist-db.org/xquery/request";
declare namespace xs="http://www.w3.org/2001/XMLSchema";
declare option exist:serialize "method=xml media-type=text/xml indent=yes omit-xml-declaration=no";
(: get the parameters from the URL :)
let $posted-data := request:get-data()
let $arg1 := $posted-data//arg1/text()
let $arg2 := $posted-data//arg2/text()
return
<results>
<sum>{$arg1+$arg2}</sum>
</results>