更新XQuery(三)

日期: 2007-12-09 来源:TechTarget中国

  > 

  import module namespace x="ns://foo" at "common.xq"
x:uris()

  当然,common.xq必须声明同一个命名空间。为了保证导入成功,两边必须一致,就像Java包一样。

  请记住,在这些导入中,"common.xq"URI并不是指一个文件路径–它只是一个含糊的名字,服务器将它以某种方式映射为common.xq内容。规范对将URI映射为资源并没有太多强制要求,因为查询不会总存在于文件中。

  函数还可以有"外部"声明。外部声明说明函数必须由系统提供。如果系统不提供外部声明,就会出错。这一特性使在外部用非XQuery语言–也许是Java语言编写支持代码成为可能。通过在查询中声明外部函数,引擎的静态分析可以确保函数存在于外部,而且在开始查询前得到正确签名。外部函数在函数体内使用关键字"external"。例如:

define function sort($elts as element()*)
  as element()* external

sort((<c/>, <a/>, <b/>))

  这个外部函数对一序列元素进行排序。执行排序过程可能是用另一种语言,或由引擎另外提供。向外部环境传递状态或从外部环境传递状态的准确语法目前还没有确定。一旦这些语法被广泛采用,查明到底是Java代码利用XQuery调用更普遍还是XQuery代码利用Java调用更普遍将是非常有趣的。

  序变量

  你还可以在序中声明和定义变量。如果没有提供变量类型的话,那么变量类型是可选的,并且可以推断出来。值要放在大括号内。例如:

define variable $x as xs:integer {7}
define variable $y {7.5}
      (: infer xs:double here 🙂

  在序中声明变量对单独的一个查询没什么意义,但对导入的模块迟早会有用。前面说过导入的模块向主模块提供了函数和变量定义。这使得序变量可以用作全局常量:

module "http://x-query.com/math"
define variable $PI as xs:decimal
  { 3.1415926535897932384626433 }

  一个变量还可以被标记为"external",以说明它的值来自外部环境。这就使存储过程参数传递和改变输入源成为可能。例如:

define variable $input
           as item()* external
define variable $quantity
           as xs:integer external

$input/item[quantity >= $quantity]

  结论

  2003年5月的XQuery草案引入了一些新的重要特性–从像trace()和error()这样的简单的新实用方法到诸如库模块、函数命名空间、序变量以及外部函数和变量等重要的改动。过去,大多数供应商都要花一些时间来升级他们的XQuery引擎以支持每个新版本,所以你要意识到这里给出的示例代码不一定立即适用于每个引擎。为了帮助你跟踪查询情况,我和Mike Clark创建了一个XQuery测试工具,叫做BumbleBee。该工具类似于XQuery的JUnit。它包含了一组标准测试查询,并使你能够编写自己的查询。对于那些对测试驱动的开发着迷的人来说,BumbleBee是一个非常棒的工具。你可以先写示例输入和期望的输出,然后写查询。每进行一次升级,就测试一次你的查询,以确保它仍能正常运行。你可以在xquery.com/bumblebee上找到BumbleBee。

  Jason Hunter (jasonhunter@servlets.com) )是一名顾问,他是《Java 编程》一书的作者、《Java 企业最佳实践》一书的合著者(这两本书均由O’Reilly & Associates出版公司出版)以及Servlets.com的发行人。

  XQJ
 
  在2003年5月的XQuery草案中没有引入但几乎同时宣布的是一个来自Oracle和IBM的提议,即创建一个用于XQuery/Java交互的通用API。因为JDBC是用于SQL的,所以这个API将用于XQuery。提议已被提交给Sun公司的Java社区进程(Java Community Process ,JCP)组织,并被该组织接受,作为JSR-225,名为"XQuery API for(用于Java的XQuery API,XQJ)"。该API很可能存在于javax.xml.XQuery包中。

  JSR确定的目标中包括:

  与JDBC和用于XML处理的Java API(JAXP)在格式上类似;
 
  提供事务性支持的面向连接的界面(因为XQuery 1.0不会有标准的更新机制,所以这一点令人很感兴趣);
 
  单次查询的无连接界面;
  
  能够从JDBC连接中创建对引擎有意义的XQJ连接;
 
  能够为重复执行而编译查询;
  
  支持参数化查询和输入参数的发现/绑定;
 
  支持使用JAXP和用于XML的流式API(Streaming API for XML,StAX)处理结果;
 
  T能够处理包括一般序列在内的任何合法结果。
 
  能够使查询结果序列化。
 
  事实终将证明,JSR对Java和J2EE程序员是极为有用的。现在,供应商必须创建用来与XQuery引擎交互的定制的API,只有最好的引擎才会认识到结果可以是任意顺序的项,而不是单独的XML文档。使用这个JSR会强化行为的规范性,另外还会提供轻松的后端可插拔性。

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

相关推荐

  • 更新XQuery(二)

    XQuery有了一些新特性,内容包括从原子化到跟踪文件结构。

  • 更新XQuery(一)

    XQuery有了一些新特性,内容包括从原子化到跟踪文件结构。