You are on page 1of 49

http://www.w3.

org/XML/Query

XQuery W3C
group.



1999

Quilt
XQL XML
XML-QL
QL. To
XQuery 1.0 2007.

XQuery :
y .

y ,

.
y declarative
p
procedural.
Declarative:
Procedural:
y , .
y .
y XML 1
1.0,
0

Namespaces, XML Schema, Xpath.

XQuery
XQ


:

y XPATH, XPATH

XML . (predicates) XPATH


XML .
y XSLT, XSLT L
XML ( ) .
y SQL, XQuery SQL,
- XQuery XML
SQL .

XML

XQuery
XQ

SQL
.
y XML Schema, XML .
XQuery XML
XML Schema XML XML
Schema.

H XQuery
( ):
y XML
y XML Web

URI
y XML
URI
y XML native XML
.
y XML .

XQuery XQuery1.0
Xpath 2.0 Data Model (XDM).

y (Node), (element)

(attribute)
y (Atomic value), (integer, string, ).
y Item (), .
y (Sequence),
(Sequence) .

XQuery :
y
y
y
y
y

(Element), XML ,
(Attributes)
(Attributes), XML ,

(Documents), XML ,

((Text),
),

,
,
(Processing Instruction),
XML Schema XQuery,
namespace,
namespace
(comment), .

:
Children - :
, .
,

( )
.
Parent - :



.
Ancestors - :
, , ,
Descendants - :
, ,
Siblings - :
.

.

10

<catalog>
<product dept="MEN">
<number>784</number>
<name language="en">Cotton Dress Shirt</name>
<colorChoices>white gray</colorChoices>
<desc>Our <i>favorite</i> shirt!</desc>
</product>
</catalog>

11

12

XML
.
catalog.
catalog
XPath 1.0
( catalog).
catalog)
H XQuery 1.0/XPath 2.0


XPath
a 1.0
0
.
,

.

13



,

y , . String

string(doc("catalog.xml")/catalog/product/number)
784,
string(<desc>Our <i>favorite</i> shirt!</desc>)
Our favorite shirt
y , XML
XML Schema. data
.

data(doc("catalog.xml")/catalog/product/number)
784, Schema
,
784 untyped.
untyped
.

14

string(doc("catalog.xml")/catalog/product/number)
784,

<catalog>
<product
p
dept="MEN">
p
<number>784</number>
<name language="en">Cotton Dress Shirt</name>
<colorChoices>white gray</colorChoices>
<desc>Our <i>favorite</i> shirt!</desc>
</product>
</catalog>

15

784
784
, xs:integer
xs:string untyped.
,
@dept=ACC
.

16



, , .
.
:

doc("catalog.xml")/catalog/product
(
g
)
gp

product.
p

17

d
doc


XML .

doc("http://datypic.com/order.xml")
order.xml

http://datypic.com/
p
yp

doc("order.xml")
order.xml
order xml
default.

18


doc("file:///C:/Documents%20and%20Settings/my%20order.xml")




order.xml

C:/Documents and Settings/my order.xml, file:///


%20 .
doc("catalog.xml")/catalog/product
product
doc("catalog.xml")/catalog/product/(number | name)
number names

| .

19


doc("catalog.xml")/catalog/product/(* except number)


p
product

number
doc( catalog.xml
doc("catalog
xml")/catalog/product/(if
)/catalog/product/(if (desc) then desc else name)
desc
name

20

d
doc-available
il bl

true

XML false
.

if (doc-available("http://datypic.com/new_order.xml"))
(d
il bl ("htt //d t i
/
d
l"))
then doc("http://datypic.com/new_order.xml")
else ( )
if
.

21

collection
ll i



XML .

collection("http://datypic.com/orders")

collection
XML .

1.
2
2.
3.

URI


XML

.

22

XQuery
.


/
XQuery case-sensitive


.

XQuery .

.

23

, , ,

=, !=, <, <=, >, >=, eq, ne, lt, le,


, gt, ge, is, <<, >>

If-then-else

if, then, else

(Boolean) and or

or, and

Path
P
th ()
(
)

XML documents
d
t
/, //,
/
// .., ., child::,
hild etc.
t

XML
(Constructor)

<, >, element, attribute


FLWOR

XQuery

for let,
for,
let where
where, order by,
by return

Quantified

some, every, in, satisfies

Sequence-related (sequences)
Type-related

(Casting)

to, union (|), intersect, except


instance of, typeswitch, cast as,
castable, treat, validate

, , ,

+, -, *, div, idiv, mod

24

.

,

"ACC" 29.99.
29 99
,

,
2. (1), (1.5)
(1.52).
1.


.
xs:date("2006-05-03").
, Boolean true( ) false( ).

25



$ .


.
:
. :
substring($prodName,
b t i ($ dN
1 5)
1,
5).

100

.
:


XQuery
XQ

1. (: :)
2. <! -->

: SQL.

26


.
:
1. () ,
2. () ,
3. () .

false.

27

doc( catalog.xml )/catalog/product[2]/name = 'Floppy Sun Hat'

true

doc( catalog
catalog.xml
xml )/catalog/product[4]/number < 500

false

1>2
() = ((1, 2))

false
false

(2, 5) > (1, 3)


(1, a ) = (2, b )

true
Type error

28

:
y eq
q ((equal
q
to))
=,
y ne (not equal to) !=,
y lt (less than) <,
y le (less than or equal to) <=
<=,
y gt (greater than) >,
y ge (greater than or equal to) >=.

false.

untyped
yp (
(


))

string.
casting, :
xs:integer($prodNum1)

29


3gt 4

f l
false

abc lt def

true
Typeerror,ifnumber isuntyped
doc(catalog.xml)/catalog/product[4]/numberlt 500 ornonnumeric
<a>3</a>gt<z>2</z>
true
,
andz areuntyped
yp
false,sincea
<a>03</a>gt<z>2</z>
andtreatedlikestrings
(1,2)eq(1,2)
Typeerror

30


is.

false.

$n1 is $n2

false

$n1 is $n1

true

doc( catalog.xml)/catalog/product[1] is
doc(catalog.xml)//product[number = 557]

true

doc( catalog.xml)/catalog/product[2]/@dept is
doc(catalog.xml)/catalog/product[3]/@dept

false

31

boolean

b l


and
d or

. , or
.

.


true( ) and true( ) or false( ) and false( )


(true( ) and true( )) or (false( ) and false( ))
true()

true( ) and (true( ) or false( )) and false( )
false()

32

XQuery

XQ


not
.
false.

not(true())
not($numItems >0)
> 0)
not(doc(catalog.xml)/catalog/
product)
not(())
not()

false
false if$numItems
if $numItems >0
>0
false ifthereisatleastoneproduct child
ofcatalog incatalog.xml
true
true

33

doc(catalog.xml)/catalog
doc(catalog.xml)//product

doc(catalog.xml)//product/@dept
doc(catalog.xml)/catalog/*

doc(catalog.xml)/catalog/*/number

catalog

product

dept

product

catalog
number

catalog

34

child::product

product

product

child::*

self::node()

attribute::dept
p

@dept
@
p

attribute::*

@*

d
descendant::product
d t
d t

.//product
// d t

dept

product


name
product

number

child::product/descendant::
name
product//name
parent::node/number

../number

35

doc
d

(predicates).
[ ].

doc("catalog.xml")/catalog/product[name = "Floppy Sun Hat"]

p
product

"Floppy
ppy

Sun Hat

doc( catalog.xml
doc("catalog
xml")/catalog/product[number
)/catalog/product[number < 500]
product < 500
doc("catalog.xml")/catalog/product[@dept = "ACC"]
product
"ACC"

36

doc("catalog.xml")/catalog/product[desc]


p
product

desc
doc("catalog.xml")/catalog/product[@desc]
product desc
doc("catalog.xml")/catalog/product[@desc] /number
number
product desc

37

d
doc
predicates

doc("prices.xml")//priceList[@effDate eq '2006-11-15']
pricelist effDate
'2006-11-15.
doc("prices.xml")//priceList[prod/@num
doc("prices
xml")//priceList[prod/@num eq 557]
pricelist prod
num 557. eq

38

d
doc

.

(
g
)
gp
[ ]
doc("catalog.xml")/catalog/product[4]
product catalog
.
doc("catalog.xml")/catalog/product[99]
( 99
product)
d t)

39

1.
2.
3.
4.
5
5.

doc("catalog.xml")/catalog/product/name[1]
(
(doc("catalog.xml")/catalog/product/name)[1]
(
g
)
gp
)[ ]
doc("catalog.xml")/catalog/descendant::name[1]
doc("catalog.xml")/catalog//name[1]
doc("catalog
doc(
catalog.xml
xml")/catalog/descendant
)/catalog/descendant-or-self::node(
or self::node( )/name[1]

1. name product.
2. name XML .
3. name XML .

name catalog
g
.
4. name product.
5 4 5
5.
5.
.

40

1.
2.
3.
4.

doc("catalog.xml")/catalog/product[position( ) < 3]
doc("catalog.xml")/catalog/product/*[position(
(
g
)
gp
[p
( ) < 3]]
doc("catalog.xml")/catalog/product[1 to 3]
doc("catalog.xml")/catalog/product[position( ) = (1 to 3)]

1.
2.
3.
4.

product.
product.
.
product.

41

1.
2.
3.
4.

doc("catalog.xml")/catalog/product[number < 500][@dept = "ACC"]


doc("catalog.xml")/catalog/product[number
(
g
)
gp
[
< 500 and @
@dept
p = "ACC"]]
doc("catalog.xml")/catalog/product[@dept = "ACC"][2]
doc("catalog.xml")/catalog/product[2][@dept = "ACC"]

1. product
number < 500 dept = ACC.
2
2.
1
1.
3. product
dept = ACC. 3 product.
4. product dept
= ACC.

42

1.
2.
3.
4.

doc("catalog.xml")/catalog/product[contains(@dept, "A")]
doc("catalog.xml")/catalog/product[*
(
g
)
gp
[ except
p number]]
doc("catalog.xml")/catalog/product[@dept = ("ACC", "WMN", "MEN")]
doc("catalog.xml")/catalog/product[position( ) mod 3 = 0]

1. product dept
A.
2
2.



product
d

number.
3. product dept
.
4. product 3.
, 3, 6,

43

1.
2.
3.
4.

doc("catalog.xml")/catalog/product[number < 500]


doc("catalog.xml")/catalog/product/number[.
(
g
)
gp
[ < 500]]
doc("catalog.xml")/catalog/product/name[starts-with(., "T")]
doc("catalog.xml")/catalog/product/desc[string-length( ) > 20]

1. product number
500.
2
2.

number
b product
d

500.
3. name product
.
4. desc product
20.
.
.

44

XQuery FLWOR
( flower - ).
FLWOR
(XML, HTML, )
.
:
ACC

for $product in doc("catalog.xml")/catalog/product


let $name := $product/name
where $product/@dept = "ACC"
order by $name
return $name

<name language="en">Deluxe Travel Bag</name>


<name language="en">Floppy Sun Hat</name>

45

FLWOR :

ffor
for ,
prod, XML Xpath
, doc(
doc("catalog.xml")/catalog/product.
catalog.xml )/catalog/product.
y doc XQuery
.
, for FLWOR .
let
let .
name $product/name
where
where (predicates).
$product/@dept = "ACC" product
dept ACC.
ACC
order by
order by .
return
return .
.

46

XQuery
XQ

IF THEN ELSE
IF-THEN-ELSE.

IF () () ELSE ()
IF boolean and or

for $prod in (doc("catalog.xml")/catalog/product)


return if ($prod/@dept = 'ACC')
then <accessoryNum>{data($prod/number)}</accessoryNum>
else <otherNum>{data($prod/number)}</otherNum>

<otherNum>557</otherNum>
<accessoryNum>563</accessoryNum>
<accessoryNum>443</accessoryNum>
<otherNum>784</otherNum>

47

2
for $prod in (doc("catalog.xml")/catalog/product)
return if (($prod/@dept
p
@ p = 'ACC'))
then (<accessoryNum>{data($prod/number)}</accessoryNum>,
<accessoryName>{data($prod/name)}</accessoryName>)
else <otherNum>{data($prod/number)}</otherNum>

<otherNum>557</otherNum>

<accessoryNum>563</accessoryNum>

<accessoryName>Floppy Sun Hat</accessoryName>

<accessoryNum>443</accessoryNum>
accessoryNum 443 /accessoryNum

<accessoryName>Deluxe Travel Bag</accessoryName>



<otherNum>784</otherNum>

48

3
for $prod in (doc("catalog.xml")/catalog/product)
return if (($prod/@dept
p
@ p = 'ACC'))
then <accessory>{data($prod/number)}</accessory>
else if ($prod/@dept = 'WMN')
then <womens>{data($prod/number)}</womens>
else if ($prod/@dept = 'MEN')
then <mens>{data($prod/number)}</mens>
else <other>{data($prod/number)}</other>

<womens>557</womens>
womens 557 /womens
<accessory>563</accessory>
<accessory>443</accessory>
<mens>784</mens>
784 /
.

49

You might also like