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