XML的QL查询语言及其实现

类别:VC语言 点击:0 评论:0 推荐:

(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