eXist Xquery Examples

eXist Xquery Examples

  Copyright@ ♂猜猜♂. 2005. All rights reserved

以下ex:>代表输入表达式 re:>表示输出结果

--author:邢晓宁 content:插入[使用existxquery数据库检索工具]说明--

 

[基础操作]

 

1 条件表达式

       ex:>if (3 < 4) then "yes!" else "no!"

       re:>yes!

      

       ex:>

              for $x in (-1.5, 0.4, 1.7)

              return <amount>

                     {

                            if ($x < 0)

                                   then concat("(", -$x, ")")

                            else $x

                     } </amount>

       re:>

              <amount>(1.5)</amount>

              <amount>0.4</amount>

              <amount>1.7</amount>

       说明:注意第一行的输出和其它两行有所不同

                            -$x$x取反

      

2 定义本地变量

       ex:>let $x := 5 let $y := 6 return 10*$x+$y

       re:>56    

      

3 使用",",其功能相当于数组

       ex:>3,4,5

       re:>3

              4

              5

       扩展加入其它语句

      

       ex:>3,4,5,let $t:=56 return $t

       re:>3

              4

              5

             56   

                    

4 return中使用{}        {expression} 执行出来表达式的结果

       ex:>

              let $i := 2 return

              let $r := <em>Value </em>

              return

      <p>{$r} of 10*{$i} is {10*$i}.</p>

  re:>

      <p><em>Value </em> of 10*2 is 20.</p>

                          

5 简单循环语句

       ex:>for $x in (1 to 3) return ($x,10+$x)

       re:>1

             11

             2

             12

             3

             13

      

      

       ex:>for $speech in document("/db/tonybooks/Catalog.xml")//categoryName

                     return <br/>{$speech}

       re:>

      

       ex:>

              <html>{

             let $book := document("mybook.xml")/book

             for $ch in $book/chapter

           return <h2>{$ch/title)</h2>

              }</html>

       re:>    

     

6 使用text(),返回内容

       ex:>let $book:=document("examples.xml")/example-queries/query

                     return $book/code/text()

       ex:>let $doc := document("examples.xml")//query/code/text()

                     return $doc          

                    

                    

                    

[函数的定义与调用]

       ex:>

              declare namespace jnb = "http://ociweb.com/jnb";

              declare variable $jnb:pi as xs:decimal { 3.1416 };

              declare function jnb:fib($i as xs:integer) as xs:integer {

                if ($i = 0 or $i = 1)

                    then 1

                else jnb:fib($i - 1) + jnb:fib($i - 2)

              };

              jnb:fib(3), jnb:fib(4), jnb:fib(5), $jnb:pi

       re:>

              3

              5

              8

              3.1416

 

 

[节点和节点类型   ]

一下两个作用相同

       ex:><greeting from="weiqi">Hello, World!</greeting>

       re:><greeting from="weiqi">Hello, World!</greeting>

      

       ex:> document {

                        element { "greeting" } {

                         attribute { "from " } { "weiqi" },

                          "Hello, World!"

                        }

                      }

       re:><greeting from ="weiqi">Hello, World!</greeting>

      

 

[flwor表达式/数据库检索命令]

标准类型for, let, where, order by, return

1 for语句

       ex:>

              for $x in (1, 2, 3)

                     return <number>{ $x }</number>

       re:>

              <number>1</number>

              <number>2</number>

              <number>3</number>

2 let语句

       ex:>

              let $a := (1, 2, 3)

                     return <numbers>{ $a }</numbers>

       re:><numbers>1 2 3</numbers>

3 where语句

       ex:>

              for $x in (1, 2, 3)

                     where $x >= 2

                     return <number>{ $x }</number>

       re:>

              <number>2</number>

              <number>3</number>

4 order by 语句

       ex:>

              for $x in (<greeting/>, <greeting from="weiqi"/>, <greeting from="brian"/>)

              order by $x/@from ascending empty least

              return $x

       re:>

              <greeting/>

              <greeting from="brian"/>

              <greeting from="weiqi"/>

 

       说明order by 有以下几个属性:

                     descendingascendingempty greatestempty least

       分别测试一下

      

      

 

[数量操作]该操作非常有用该操作非常有用

1 some every 例子

       ex:>some $x in (1, 2, 3) satisfies $x >= 2

       re:>true

      

       ex:>every $x in (1, 2, 3) satisfies $x >= 2

       re:>false

      

       ex:>some $x in (1, 2, 3), $y in (3, 4, 5) satisfies $x = $y

       re:>true

      

       ex:>every $x in (1, 2, 3), $y in (3, 4, 5) satisfies $x = $y

       re:>false

 

2 count($a)

       ex:>let $a:=collection("tonybooks")//category

              return count($a)

       re:>返回401

      

       ex:>for $a in collection("tonybooks")//category

              return count($a)

       re:>返回40

       区别以上例子

      

      

3 多重循环语句

       ex:>

                     for $c in customers

                            for $o in orders     

                     where $c.cust_id=$o.cust_id and $o.part_id="xx"

                     return $c.name

       以上语句等价于sql语句

              select customers.name   from customers, orders

              where customers.cust_id=orders.cust_id  and orders.part_id="xx"

       ex:>

                     for $book in bib.xml//book

                     let $title := $book/title

                     where $book/publisher = 'Addison-Wesley'

                     return

                     <bookInfo>{ $title }</bookInfo>

 

 

[xpath例子]

       greetings.xml:

              <?xml version="1.0" encoding="UTF-8"?>

              <greetings>

                <greeting from="weiqi">Nihao!</greeting>

                <greeting from="brian">Hi!</greeting>

                <greeting from="luc">Bonjour!</greeting>

              </greetings>

             

       ex:>doc("greetings.xml")/greetings

       re:><greetings>

                       <greeting from="weiqi">Nihao!</greeting>

                       <greeting from="brian">Hi!</greeting>

                       <greeting from="luc">Bonjour!</greeting>

                     </greetings>

                    

       ex:>doc("greetings.xml")//greeting

       re:><greeting from="weiqi">Nihao!</greeting>

                     <greeting from="brian">Hi!</greeting>

                     <greeting from="luc">Bonjour!</greeting>

       说明:注意以上两个例子的区别/greetings//greetings

                            前者表示从根节点开始逐级遍历,后者表示任何级的节点都遍历             

      

                    

       ex:>doc("greetings.xml")//greeting[@from="weiqi"]

       re:><greeting from="weiqi">Nihao!</greeting>

       说明:@from 用来引用节点中的属性名称

                            引用节点名直接输入例如:greeting 或者 greetings就可以

                           

       ex:>doc("greetings.xml")//greeting/@from

       re:>from="weiqi" from="brian" from="luc"

      

       ex:>doc("greetings.xml")//greeting[1]

       re:><greeting from="weiqi>Nihao!</greeting>

       说明:使用"节点名"[n]表示输出第几个节点内容

 

 

 

待查:

       let $a := 3,4  --错误

       let $b := ($a, $a)

       let $c := 99

       let $d := ()

       return (count($a), count($b), count($c), count($d))

       evaluates to (2, 4, 1, 0) because $b is the same as (3,4,3,4).

待查:

       children(<p>This is <em>very</em> cool.</p>)

       returns this sequence of 3 values:

       "This is ", <em>very</em>, " cool."

      

 

      

================以下为未整理部分=============

[Modules]

You can put functions and variables declarations into library modules. A library module is a file that starts with a module namespace declaration and contains declarations of functions, variables, etc., but does not contain an expression at the end. A main module contains an expression at the end. Both library modules and main modules can import other library modules to access variables and functions declared in the imported module.

 

(: libfib.xq :)

module namespace jnb = "http://ociweb.com/jnb";

declare function jnb:fib($i as xs:integer) as xs:integer {

  if ($i <= 1)

  then 1

  else jnb:fib($i - 1) + jnb:fib($i - 2)

};

 

(: mainfib.xq: )

import module namespace jnb = "http://ociweb.com/jnb" at "libfib.xq";

jnb:fib(6)

 

[weiqi@gao] $ xquery mainfib.xq          # Saxon

13

Qexo supports compiled modules. A library module is compiled to a Java class whose name is derived from the module namespace URI. A main module is compiled to a Java class whose name is derived from the module file name.

 

[weiqi@gao] $ qexo -C libfib.xq          # Compile to Java class com.ociweb.jnb

(compiling libfib.xq)

[weiqi@gao] $ qexo --main -C mainfib.xq  # Compile to Java class mainfib

(compiling mainfib.xq)

[weiqi@gao] $ java mainfib

13

 

-------------------------------------------------------------------------

 

Type Specification

 

XQuery is a strongly typed programming language. Like Java and C#, for example, it's a mix of static typing (type consistency checked at compile-time) and dynamic typing (run-time type tests). However, the types in XQuery are different from the classes familiar from object-oriented programming. Instead, it has types to match XQuery's data model, and it allows you to import types form XML Schema.

if ($child instance of element section)

then process-section($child)

else ( ) {--nothing--}

This invokes the process-section function if the value of $child is an element whose tag name is section. XQuery has a convenient typeswitch shorthand for matching a value against a number of types. The following converts a set of tag names to a different set.

 

define function convert($x) {

  typeswitch ($x)

    case element para return <p>{process-children($x)}</p>

    case element emph  return <em>{process-children($x)}</em>

    default return process-children($x)

}

 

define function process-children($x) {

  for $ch in children($x)

  return convert($ch)

}

 

 

Hello,

I am a beginner in Xquery.

In my schema I have element which has IDREF attribute.I want to extract id value to which points and check whether that value is equivalent to some value.

 

eg:

<AUTHOR EMAILID ="psmith@sfsu.edu">

<FNAME>smith</FNAME>

<MI>j</MI>

<LNAME>jen</LNAME>

</AUTHOR>

<PAPER PAPERID = 10 EMAILID = "sai@yahoo.com">

<MAINATHR>SHARMA</MAINATHR>

<TITLE>ABC</TITLE>

</PAPER>

<PAPER PAPERID = 10 EMAILID = "sha@yahoo.com">

<MAINATHR>SHARMA</MAINATHR>

<TITLE>ABC</TITLE>

</PAPER>

 

 

 

let $id := "sai@yahoo.com",

for $paper in $doc/PAPER[@EMAILID = $id],

for $author in $doc/AUTHOR[@EMAILID = $id]

return

<result PAPERID="{$paper/@PAPERID}">

{$author/FNAME}

<result>

 

 

 

for $paper in $doc/PAPER,

for $author in $doc/AUTHOR

where $paper/@EMAILID = $auther/$EMAILID

return

<result PAPERID="{$paper/@PAPERID}">

{$author/FNAME}

<result>

如上例程序,在xquery中引用节点和节点属性名称的时候稍有不同。

节点  paper 属性 @paper

 

 

 

 

 

I am completely new to XQuery..

I have the following which I would like to run on an .xml file...

 

for $book in bib.xml//book

let $title := $book/title

where $book/publisher = 'Addison-Wesley'

return

 

<bookInfo>

{ $title }

 

</bookInfo>

 

and the bib.xml file

<bib>

<book year="1994">

<title>TCP/IP Illustrated</title>

<author><last>Stevens</last><first>W.</first></author>

<publisher>Addison-Wesley</publisher>

<price> 65.95</price>

</book>

 

<book year="1992">

<title>Advanced Programming in the Unix environment</title>

<author><last>Stevens</last><first>W.</first></author>

<publisher>Addison-Wesley</publisher>

<price>65.95</price>

</book>

 

<book year="2000">

<title>Data on the Web</title>

<author><last>Abiteboul</last><first>Serge</first></author>

<author><last>Buneman</last><first>Peter</first></author>

<author><last>Suciu</last><first>Dan</first></author>

<publisher>Morgan Kaufmann Publishers</publisher>

<price>39.95</price>

</book>

 

<book year="1999">

<title>The Economics of Technology and Content for Digital TV</title>

<editor>

<last>Gerbarg</last><first>Darcy</first>

<affiliation>CITI</affiliation>

</editor>

<publisher>Kluwer Academic Publishers</publisher>

<price>129.95</price>

</book>

 

</bib>

 

 

-----------------------------------------------

最后附上一个好的教材:

http://monetdb.cwi.nl/XQuery/Demo/index.html
http://www.xml.com/pub/a/2005/03/02/xquery.html
http://www.xml.com/pub/a/2005/03/23/xquery-2.html
http://www.w3schools.com/xquery/default.asp

个人搜集的资料
http://blog.csdn.net/thefirstwind/articles/454268.aspx
http://sygbz.blogchina.com/inc/XQUERY.doc

Copyright@ ♂猜猜♂. 2005. All rights reserved


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值