上一篇 | 下一篇

更新XQuery

发布: 2008-6-30 21:31 | 作者: admin | 来源: | 查看: 0次

更新XQuery

【字体:小 大】

更新XQuery

作者:- 文章来源:- 点击数:446 更新时间:2006-4-19

unknow

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

在"你所不了解的XQuery"(Oracle杂志,2003年5/6月刊)一文中,我介绍了XQuery,它是一项由万维网联盟(W3C)开发的技术,设计用来查询和操纵XML数据或任何能以XML形式出现的数据,如关系型数据库。那篇引文讨论了2002年11月发布的XQuery草案规范。2003年5月,W3C发布了新的XQuery草案规范,本文追踪报道了5月份发布的草案规范中最令人感兴趣的变化和新增加的特性,其中包括库模块、序(prolog)变量、外部函数以及用于调试、错误处理和格式化的新函数。

变化

5月草案增加了大量新特性,但是我首先讨论对现有特性所做的更改。有些更改是表面上的。 例如,document()输入函数(该函数使用给定的统一资源标识符[URI]返回一个文档)被改为一个新的更短的名字doc()。另外,曾经被写成{- comment -}的注释现在改用新的笑脸符号(: comment :)。是的,现在每个注释都成了一个笑话。

有些更改则是更根本的。也许最重大的改动就是distinct-values()函数不再返回节点(节点是XML结构,如元素、文档、注释以及文本节点),它只返回原子值(如整数或字符串)。尽管该函数仍然接受节点和原子值,但只返回原子值。任何进入该函数的节点都会被"原子化"并被当作原子值,然后以原子形式返回。

原子化的规则很复杂,这里给出一些基本的:由模式定义为布尔型的元素将被原子化为true/false布尔值。定义为整型的元素将被原子化为一个整数。没有被模式定义的元素将被原子化为节点的XPath字符串值(文本节点递归地连接在一起)。

为了说明:

 

distinct-values(apple,

banana, "grape")

 

返回值("apple","banana","grape"),假设在模式中没有声明 。在下面的例子中,如果我们假设 被模式定义为布尔型,那么下面的语句:

 

distinct-values(0,

false)

 

返回false(),因为它是两个元素的原子值。记住false()是XQuery常量,表示"假"。

现在你也许会想,"当我想返回节点时,可以使用distinct-nodes()函数。" 是的,但该函数只能根据节点标识删除重复节点(那些完全相同的节点,类似于Java中引用的等效节点)。没有能删除等效节点的函数。这会使查询变得复杂,因为没有办法能轻松地删除等效节点。

回过头来看我以前的那篇文章"你所不了解的XQuery",你将发现有些示例会受到这一改动的影响。在那篇文章中,下面的查询返回了艺术家名字的惟一列表,其中每一个名字前后都带有 标记:

 

distinct-values(document("itunes.xml")

/itunes/Tracks/Track/Artist)

 

示例输出类似于:

 

Marc Cohn

Pink Floyd

 

现在,执行同样的查询则返回原子值:

 

Marc Cohn

Pink Floyd

 

由于distinct-values()去掉了 标记(这是原子化过程的一部分),所以你必须在完成distinct-values()调用后添加标记,如下所示:

 

let $artists :=

distinct-values(doc("itunes.xml")

/itunes/Tracks/Track/Artist)

for $a in $artists

return { $a }

不是每种情况都是这么轻松地得到处理。看一下W3C 使用案例文档中的示例1.1.9.4在2002年11月版与2003年5月版中是如何变化的。该示例返回每位作者的著作列表。它使用了distinct-values(),根据2002年11月的规范,它的代码如下:

 

{

for $a in distinct-values(

document("http://www.bn.com/bib.xml")

//author)

return

{ $a }

{

for $b in document(

"http://www.bn.com/bib.xml")

/bib/book

where some $ba in $b/author

satisfies deep-equal($ba,$a)

 

; return $b/title

}

}

字号: | 推荐给好友

71/71234567>

评分:0

我来说两句