Professional Documents
Culture Documents
16 XQuery
16 XQuery
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
XQuery
XQ
:
y XPATH, XPATH
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
| .
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
, , ,
If-then-else
(Boolean) and or
or, and
Path
P
th ()
(
)
XML documents
d
t
/, //,
/
// .., ., child::,
hild etc.
t
XML
(Constructor)
XQuery
for let,
for,
let where
where, order by,
by return
Quantified
Sequence-related (sequences)
Type-related
(Casting)
, , ,
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
true
doc( catalog
catalog.xml
xml )/catalog/product[4]/number < 500
false
1>2
() = ((1, 2))
false
false
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.
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.
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
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
<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
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