XML的QL查询语言及其实现
2004-06-13 16:09
891 查看
(3)用嵌套查询进行结果分组<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
上述XML-QL查询不会将结果分组,同一本书的作者会出现在不同的<result>中,如果将同一本书的作者放在一个<result>中就好了。要将结果进行分组,可以使用嵌套查询。将以上的例子稍许改动,可以得到我们想要的结果:
WHERE <book>
$p
</book> IN “lib.xml”
<title> $t </title>,
<publisher><name>高等教育出版社</name></publisher> IN $p
CONSTRUCT <result>
<title> $t </title>
WHERE <author> $a </author> IN $p
CONSTRUCT <author> $a </author>
</result>
上述XML-QL语句中,首先指定p变量为<book>元素的内容,然后逐个判断<book>元素的内容是否包含一个<title>元素和一个<name>为“高等教育出版社”的<publisher>元素,如果符合条件,则构造结果。结果由该<book>元素的<title>子元素和一个嵌套查询的结果所组成。而嵌套查询的结果由符合条件的<book>元素中所有<author>元素所组成。
如果P变量的内容已被指定,它可以被后边的XML-QL使用。也可以通过使用CONTENT_AS关键字把p变量指定为<book>元素的内容,这样XML-QL查询就简化为:
WHERE <book>
<title> $t </title>
<publisher><name>高等教育出版社</name></publisher>
</book> CONTENT_AS $p IN “lib.xml”
CONSTRUCT <result>
<title> $t </title>
WHERE <author> $a </author> IN $p
CONSTRUCT <author> $a </author>
</result>
执行以上两个查询,得到的结果是一样的:
<result>
<title>数据库系统概论</title>
<author><lastname>萨师煊</lastname></author>
<author><lastname>王珊</lastname></author>
</result>
(4)根据值连接元素
XML-QL可以把两个或者两个以上包含相同值的元素连接起来。例如,查询所有2000年后写过书的作者的<article>元素:
WHERE <article>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</article> CONTENT_AS $a IN “lib.xml”
<book year=$y>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</book> IN “lib.xml”
y>2000
CONSTRUCT <article> $a </>
在上面的查询中,我们使用了变量f和l实现连接。我们首先把f和l指定为<author>元素中的<firstname>和<lastname>子元素的内容,同时把a元素指定为<article>元素的内容。然后判断在<article>中是否 存在一个<book>元素,其year属性大于2000,并包含<firstname>和<lastname>分别等于f和l变量<author>元素,只有在这个<book>中时,<article>元素才符合WHERE语句的条件。
上面的XML-QL中,CONSTRUCT语句中的内容在WHERE语句中出现过一次。那么,可以使用ELEMENT_AS语句来避免这样的重复。
WHERE <article>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</article> CONTENT_AS $a IN “lib.xml”
<book year=$y>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</book> ELEMENT_AS $e IN “lib.xml”
y>2000
CONSTRUCT $e
(5)在不同的XML文档中抽取数据
XML-QL可以对多个XML文档进行查询,并且把查询到的数据结合起来。以下例子是从data.xml 和taxpayers.xml两个文档中分别取得姓名(<name>元素)和收入(<income>元素)信息,然后把它们结合起来。而这两个元素是以<ssn>元素进行联系的。
WHERE <person>
<name> </> ELEMENT_AS $n
<ssn> $ssn </>
</> IN data.xml,
<taxpayer>
<ssn> $ssn </>
<income> </> ELEMENT_AS $i
</> IN taxpayers.xml
CONSTRUCT <result> $n $i </>
除了以上方法外,还可以使用Skolem函数实现上述查询(在W3C文档中查阅)。具体的方法如下所示:
{ WHERE <person>
<name></> ELEMENT_AS $n
<ssn> $ssn </>
</> IN data.xml
CONSTRUCT <result ID=SSNID($ssn)> $n </>
}
{ WHERE <taxpayer>
<ssn> $ssn </>
<income> </> ELEMENT_AS $i
</> IN taxpayers.xml
CONSTRUCT <result ID=SSNID($ssn)> $i </>
}
上述XML-QL查询不会将结果分组,同一本书的作者会出现在不同的<result>中,如果将同一本书的作者放在一个<result>中就好了。要将结果进行分组,可以使用嵌套查询。将以上的例子稍许改动,可以得到我们想要的结果:
WHERE <book>
$p
</book> IN “lib.xml”
<title> $t </title>,
<publisher><name>高等教育出版社</name></publisher> IN $p
CONSTRUCT <result>
<title> $t </title>
WHERE <author> $a </author> IN $p
CONSTRUCT <author> $a </author>
</result>
上述XML-QL语句中,首先指定p变量为<book>元素的内容,然后逐个判断<book>元素的内容是否包含一个<title>元素和一个<name>为“高等教育出版社”的<publisher>元素,如果符合条件,则构造结果。结果由该<book>元素的<title>子元素和一个嵌套查询的结果所组成。而嵌套查询的结果由符合条件的<book>元素中所有<author>元素所组成。
如果P变量的内容已被指定,它可以被后边的XML-QL使用。也可以通过使用CONTENT_AS关键字把p变量指定为<book>元素的内容,这样XML-QL查询就简化为:
WHERE <book>
<title> $t </title>
<publisher><name>高等教育出版社</name></publisher>
</book> CONTENT_AS $p IN “lib.xml”
CONSTRUCT <result>
<title> $t </title>
WHERE <author> $a </author> IN $p
CONSTRUCT <author> $a </author>
</result>
执行以上两个查询,得到的结果是一样的:
<result>
<title>数据库系统概论</title>
<author><lastname>萨师煊</lastname></author>
<author><lastname>王珊</lastname></author>
</result>
(4)根据值连接元素
XML-QL可以把两个或者两个以上包含相同值的元素连接起来。例如,查询所有2000年后写过书的作者的<article>元素:
WHERE <article>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</article> CONTENT_AS $a IN “lib.xml”
<book year=$y>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</book> IN “lib.xml”
y>2000
CONSTRUCT <article> $a </>
在上面的查询中,我们使用了变量f和l实现连接。我们首先把f和l指定为<author>元素中的<firstname>和<lastname>子元素的内容,同时把a元素指定为<article>元素的内容。然后判断在<article>中是否 存在一个<book>元素,其year属性大于2000,并包含<firstname>和<lastname>分别等于f和l变量<author>元素,只有在这个<book>中时,<article>元素才符合WHERE语句的条件。
上面的XML-QL中,CONSTRUCT语句中的内容在WHERE语句中出现过一次。那么,可以使用ELEMENT_AS语句来避免这样的重复。
WHERE <article>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</article> CONTENT_AS $a IN “lib.xml”
<book year=$y>
<author>
<firstname> $f </firstname>
<lastname> $l </lastname>
</author>
</book> ELEMENT_AS $e IN “lib.xml”
y>2000
CONSTRUCT $e
(5)在不同的XML文档中抽取数据
XML-QL可以对多个XML文档进行查询,并且把查询到的数据结合起来。以下例子是从data.xml 和taxpayers.xml两个文档中分别取得姓名(<name>元素)和收入(<income>元素)信息,然后把它们结合起来。而这两个元素是以<ssn>元素进行联系的。
WHERE <person>
<name> </> ELEMENT_AS $n
<ssn> $ssn </>
</> IN data.xml,
<taxpayer>
<ssn> $ssn </>
<income> </> ELEMENT_AS $i
</> IN taxpayers.xml
CONSTRUCT <result> $n $i </>
除了以上方法外,还可以使用Skolem函数实现上述查询(在W3C文档中查阅)。具体的方法如下所示:
{ WHERE <person>
<name></> ELEMENT_AS $n
<ssn> $ssn </>
</> IN data.xml
CONSTRUCT <result ID=SSNID($ssn)> $n </>
}
{ WHERE <taxpayer>
<ssn> $ssn </>
<income> </> ELEMENT_AS $i
</> IN taxpayers.xml
CONSTRUCT <result ID=SSNID($ssn)> $i </>
}
相关文章推荐
- XML的QL查询语言及其实现-1
- XML的QL查询语言及其实现-2
- 用hibernate的HQL(面向对象的查询语言)实现模糊查询的3种方式
- server.xml和resfile.properties配置实现图片查询
- 将xml绑定到gridview,及xml节点查询的selectNodes怎么实现多条件查询
- android 动态加载 语言xml 实现国际化
- asp.net操作xml实现创建,添加,删除,查询等功能函数
- 利用Microsoft.XMLHTTP实现无刷新查询
- 语言识别之根据字典矫正文本及其c++代码实现
- android 动态加载 语言xml 实现国际化
- 一个小语言的词法分析程序原理及其实现(1)
- 数据库查询语言QL
- Linq To Xml实现类似XPath查询(Silverlight下的XPath)
- 实例讲解hadoop中的hive查询(python语言实现) - 实践检验真理 - 51CTO技术博客
- asp下查询xml的实现代码
- php+xml实现在线英文词典查询的方法
- Spring Ioc的基本原理及其xml的实现方法(上)
- 深入解析快速排序算法的原理及其Go语言版实现
- struts2中Ajax的操作实现及其核心对象XMLHttpRequest对象的使用
- C#语言实现创建、删除和移动文件夹及其文件夹列表功能