XQuery/DOJO 資料
外觀
< XQuery
您希望將 XQuery 與使用 JSON 語法變體的 DOJO JavaScript 庫一起使用。
DOJO 是一個用於在 javascript 中開發豐富客戶端小程式的框架:從不錯到核心 Web 應用程式。有一天,您可能希望以一種方式交付您的資料,以便您或其他人可以輕鬆地從 DOJO 中使用它。
DOJO 指定了它自己獨特的將資料包裝在 JSON 格式物件中的方式,因此它可以被許多其小部件使用:樹、網格、組合框、輸入欄位等。下面的示例(注意使用單引號,這使其無效 JSON)取自其網路提供的文件
{ identifier: 'abbr',
label: 'name',
items: [
{ abbr:'ec', name:'Ecuador', capital:'Quito' },
{ abbr:'eg', name:'Egypt', capital:'Cairo' }
]}
現在,例如,如果您想從伺服器端搜尋中饋送增量使用者輸入小部件,xquery(至少在 eXist 中)使這變得輕而易舉。請閱讀下面的指令碼作為對該概念的介紹,很可能它可以最佳化。搜尋本身使用 lucene 全文索引,返回速度很快。
xquery version "1.0";
import module namespace json="http://www.json.org";
declare namespace request="http://exist-db.org/xquery/request";
declare option exist:serialize "method=html media-type=text/javascript";
(: where the data lives:)
let $coll := "/db/apps/myapp/data"
(: what we are looking for, sanitize remote input :)
let $tmp := xs:string(request:get-parameter("q", ""))
let $querystring := replace($tmp, "[^0-9a-zA-Z\-,. ]", "")
let $query :=
<query>
<near slop="10" ordered="no">{$querystring}</near>
</query>
return
(: fetch results, dont forget to create an index in collection.xconf :)
let $hits := collection($coll)//article[ft:query(., $query)]
let $count := count($hits)
let $result :=
<result>
<identifier>id</identifier>
<label>title</label>
<count>{$count}</count>
{
for $item in $hits
return
<items>
<id>{string($item/@id)}</id>
{$item/title}
</items>
}
</result>
return
json:xml-to-json($result)
xquery 擴充套件 json:xml-to-json($node as node()) 完成了所有魔法。在結果變數中,資料結構以 DOJO 想要的方式(預設情況下)建立,如上所示。另一件事需要注意:DOJO 希望識別符號是唯一的。由您來設計您的資料以滿足此要求。另一個注意事項:截至今天(2010 年 9 月初的 eXist 主幹),輸出中的數字被引用,由您在客戶端轉換它們以進行最佳處理。