(3)用嵌套查询进行结果分组
上述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 </>
}本文地址:http://com.8s8s.com/it/it800.htm