跳转到内容

XQuery/DOJO 数据

来自维基教科书,开放的书籍,开放的世界

您希望将 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 主干),输出中的数字被引用,由您在客户端转换它们以进行最佳处理。

华夏公益教科书