跳轉到內容

XQuery/加法器

來自華夏公益教科書,自由的教科書

我們想建立一個簡單的 XQuery,它接受兩個引數並返回這兩個數字的總和。

使用 URL 引數的示例程式(HTTP GET)

[編輯 | 編輯原始碼]
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

使用 HTTP POST 的示例

[編輯 | 編輯原始碼]
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>
華夏公益教科書