Professional Documents
Culture Documents
XQuery 888
XQuery 888
XQuery
http://www.w3.org/TR/xquery/
Roger L. Costello
16 June 2010
2
Prerequisites
• This tutorial assumes you know
XPath 1.0 and XPath 2.0
• If you don't know XPath then please read
my XPath tutorials at:
http://www.xfront.com/xpath/
3
Usage
FitnessCenter.xml
FitnessCenter.xq
Execute XQueries in
Oxygen XML
• Open Oxygen.
• Drag and drop an XQuery file into Oxygen.
• Click on the wrench icon:
Execute XQuery in
Oxygen XML (cont.)
2. Click on New
8
Execute XQuery in
Oxygen XML (cont.)
2. Click on OK
9
Execute XQuery in
Oxygen XML (cont.)
Click on OK
10
1. Click on this
XQuery
XQuery is a superset
XPath 2.0 of XPath 2.0, which is a
superset of XPath 1.0
XPath 1.0
12
FitnessCenter.xml
13
{ XQuery expression }
Result
<ul>
<li>Jeff</li>
<li>David</li>
<li>Roger</li>
</ul>
Structure of an
XQuery Document
Prolog
(optional)
Body
(required)
21
expression
,
22
Explicit Input
<html>
<html>
<head>
<head>…</head>
<title>Member Names</title>
<body>
</head>
<ul>
<body>
<li>Jeff</li>
<h1>Member Names</h1>
<li>David</li>
<ul> Evaluate the <li>Roger</li>
{for $i in doc('FitnessCenter.xml')//Member return <li>{$i/Name/text()}</li>} XQuery </ul>
</ul>
</body>
</body>
</html>
</html>
FitnessCenter.xml
26
see example01-a
27
Sequence of Expressions
• If you have a sequence of expressions that
you want evaluated then you must:
– separate each expression by a comma
– wrap the expressions in ( … )
for $i in //Member return ("Name = ", $i/Name/text(), " FavoriteColor = ", $i/FavoriteColor/text())
Output:
Name = Jeff FavoriteColor = lightgrey Name = David FavoriteColor = lightblue Name = Roger FavoriteColor = lightyellow
Output:
<Member>Name = Jeff FavoriteColor = lightgrey</Member>
<Member>Name = David FavoriteColor = lightblue</Member>
<Member>Name = Roger FavoriteColor = lightyellow</Member>
Output:
<Member>
<Name>Name = Jeff</Name>
<FavoriteColor>FavoriteColor = lightgrey</FavoriteColor>
</Member>
<Member>
<Name>Name = David</Name>
<FavoriteColor>FavoriteColor = lightblue</FavoriteColor>
</Member>
<Member>
<Name>Name = Roger</Name>
<FavoriteColor>FavoriteColor = lightyellow</FavoriteColor>
/Member>
see example04
32
Default Namespace
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
…
</head>
<body>
<h1>Fitness Center</h1>
<div id="fitness">
{
for $i in //Member return
…
}
</div>
Trying to iterate through <Member>
</body>
elements in the default (XHTML)
</html> namespace!
34
DOCTYPE Declaration
Output types
Creating Attributes
Recall $i/Name returns a copy of the <Name> element:
for $i in //Member return $i/Name
Output:
<Name>Jeff</Name>
<Name>David</Name>
<Name>Roger</Name>
When used in assigning an attribute a value, $i/Name
returns the value of the <Name> element:
for $i in //Member return <Member name="{$i/Name}" />
Output:
<Member name="Jeff" />
<Member name="David" />
<Member name="Roger" />
40
Equivalent
for $i in //Member return <Member name="{$i/Name}" />
Output:
<Member name="Jeff" />
<Member name="David" />
<Member name="Roger" />
Output:
<Member name="Jeff" />
<Member name="David" />
<Member name="Roger" />
Output:
<Member name="Jeff" />
<Member name="David" />
Do Lab1
<Member name="Roger" />
see example05
41
Output:
<Member id="1" />
<Member id="2" />
<Member id="3" />
42
Create 2 Attributes
Output:
<Member id="1" level="platinum" />
<Member id="2" level="gold" />
<Member id="3" level="platinum" />
see example05
43
Creating 3 Attributes
Output:
<Member name="Jeff" id="1" level="platinum" />
<Member name="David" id="2" level="gold" />
<Member name="Roger" id="3" level="platinum" />
see example05
44
Output:
<Member>1</Member>
<Member>2</Member>
<Member>3</Member>
45
Equivalent
for $i in //Member return <Member>{data($i/@id)}</Member>
Output:
<Member>1</Member>
<Member>2</Member>
<Member>3</Member>
for $i in //Member return <Member>{string($i/@id)}</Member>
Output:
<Member>1</Member>
<Member>2</Member>
<Member>3</Member>
see example05
46
Output:
<Member id="1">platinum</Member>
<Member id="2">gold</Member>
<Member id="3">platinum</Member>
see example05
<?xml version="1.0"?> 47
<FitnessCenter>
<Member level="platinum">
<Name>Jeff</Name>
<FavoriteColor>lightgrey</FavoriteColor>
</Member>
<Member level="gold">
<Name>David</Name>
FitnessCenter.xml <FavoriteColor>lightblue</FavoriteColor>
</Member>
<Member level="platinum">
<Name>Roger</Name>
<FavoriteColor>lightyellow</FavoriteColor>
</Member>
</FitnessCenter>
<MemberInfo>
<Names>
{ for $i in //Member return $i/Name }
FitnessCenter.xq </Names>
<FavoriteColors>
{ for $i in //Member return $i/FavoriteColor }
</FavoriteColors>
</MemberInfo>
<?xml version="1.0"?>
<MemberInfo>
<Names>
<Name>Jeff</Name>
<Name>David</Name>
<Name>Roger</Name>
MemberInfo.xml </Names>
<FavoriteColors>
<FavoriteColor>lightgrey</FavoriteColor>
<FavoriteColor>lightblue</FavoriteColor> Do Lab2
<FavoriteColor>lightyellow</FavoriteColor>
</FavoriteColors>
</MemberInfo> see example07
<?xml version="1.0"?> 48
<FitnessCenter>
<Member level="platinum">
<Name>Jeff</Name>
<FavoriteColor>lightgrey</FavoriteColor>
</Member>
<Member level="gold">
FitnessCenter.xml <Name>David</Name>
<FavoriteColor>lightblue</FavoriteColor>
</Member>
<Member level="platinum">
<Name>Roger</Name>
<FavoriteColor>lightyellow</FavoriteColor>
</Member>
</FitnessCenter>
FitnessCenter.xq ???
<?xml version="1.0"?>
<Members>
<platinum>
<Name>Jeff</Name>
Members.xml <Name>Roger</Name>
</platinum>
<gold>
<Name>David</Name>
</gold>
</Members>
49
Non-Extensible Solution
<Members>
<platinum>
{ for $i in //Member[@level eq "platinum"] return $i/Name }
</platinum>
<gold>
{ for $i in //Member[@level eq "gold"] return $i/Name }
</gold>
</Members>
Another Example
Output:
Error
XQuery syntax error on line 4 of
file:/C:/new-xml-course/xquery/examples/example11/aircraft.xq in `...0}
element speed {160`: expected "}", found "null"
Failed to compile query: XQuery syntax error
Query processing failed: net.sf.saxon.xpath.StaticError: XQuery syntax error
56
Use commas!
<aircraft>
{
element {"altitude"} separate the units attribute from the
{
attribute {"units"} {"feet"}, text node.
text {12000}
}, separate the altitude element from the
element {"speed"}
{ speed element.
attribute {"units"} {"knots"},
text {160}
} separate the units attribute from the
}
</aircraft> text node.
<?xml version="1.0"?>
<FitnessCenter>
<Member level="platinum">
<Name>Jeff</Name>
<MembershipFee>500</MembershipFee>
</Member>
<Member level="gold">
<Name>David</Name>
FitnessCenter.xml <MembershipFee>400</MembershipFee>
</Member>
<Member level="platinum">
<Name>Roger</Name>
<MembershipFee>500</MembershipFee>
</Member>
</FitnessCenter>
FitnessCenter.xq ???
<?xml version="1.0"?>
<MembershipLevelCosts>
MembershipLevelCosts.xml <level platinum="500"/>
<level gold="400"/>
</MembershipLevelCosts>
59
FitnessCenter.xq
<MembershipLevelCosts>
{
for $i in distinct-values(//Member/@level) return
element {"level"}
{
attribute {$i} {//Member[@level eq $i][1]/MembershipFee}
}
}
</MembershipLevelCosts>
Output:
<MembershipLevelCosts>
<level platinum="500"/>
<level gold="400"/>
</MembershipLevelCosts>
see example13
60
document {value}
document
{
element {"aircraft"} Output:
{ <aircraft>
element {"altitude"} <altitude units="feet">12000</altitude>
{ <speed units="knots">160</speed>
attribute {"units"} {"feet"}, </aircraft>
text {12000}
},
element {"speed"}
{
attribute {"units"} {"knots"},
text {160}
}
}
}
see example14
63
Summary of
Computed Constructors
document {value} A document node is created.
Terminology
This is called a direct element constructor:
<altitude>12000</altitude>
element {"altitude"}
{
text {12000}
}
65
Not XML
element {"altitude"}
{
attribute {"units"} {"feet"}, Output:
text {12000} <altitude units="feet">12000</altitude>
}, <speed units="knots">160</speed>
element {"speed"}
{
attribute {"units"} {"knots"},
text {160} This is a perfectly fine output document.
} It's not an XML document. It has no
root element.
No XML Declaration
• Do not put an XML declaration at the top of
your XQuery document.
<?xml version="1.0"?>
element {"altitude"}
{
attribute {"units"} {"feet"},
text {12000}
},
element {"speed"}
{
attribute {"units"} {"knots"},
text {160}
}
67
XQuery XML
68
<Results>
{if (1 < 2) then "1 < 2 is TRUE" else "1 < 2 is FALSE"},
{if (1 > 2) then "1 > 2 is TRUE" else "1 > 2 is FALSE"}
</Results>
Output:
<Results>
1 < 2 is TRUE,
1 > 2 is FALSE
</Results >
see example15
69
Whitespace
• By default whitespace that occurs around an
evaluated expression is stripped.
Output:
<WhitespaceTests> <WhitespaceTests>
<Test> hi </Test> <Test> hi </Test>
<Test> {"hi"} </Test> <Test>hi</Test>
<Test>   {"hi"} </Test> <Test> hi</Test>
<Test>{1 to 10}</Test> <Test>1 2 3 4 5 6 7 8 9 10</Test>
<Test> {1 to 10} </Test> <Test>1 2 3 4 5 6 7 8 9 10</Test>
<Test> {"hi"},{"there"} </Test> <Test>hi,there</Test>
<Test>{" "}</Test> <Test> </Test>
<Test>{1,2,3}</Test> <Test>1 2 3</Test>
<Test> {1,2,3} </Test> <Test>1 2 3</Test>
<Test>{1}{2}{3}</Test> <Test>123</Test>
<Test> {1}{2}{3} </Test> <Test>123</Test>
</WhitespaceTests> </WhitespaceTests> see example16
70
<html>
<body>
<ul>
{ for $i in //Member order by $i/Name/text() ascending return <li>{$i/Name/text()}</li> }
</ul>
</body>
</html>
see example17
72
Equivalent
Jeff 35
This data Linda 40 Just interested
is sorted Roger 32 in the first 5
by Name Stacey 25 Members (i.e., @id <= 5)
76
<?xml version="1.0"?>
<?xml version="1.0"?>
<MemberAges>
<MemberNames>
...
$i <Member id="1">
$j <Member id="1">
<Name>Jeff</Name>
<Age>35</Age>
</Member>
</Member>
<Member id="2">
<Member id="2">
<Name>David</Name>
<Age>39</Age>
</Member>
</Member>
…
...
</MemberNames>
</MemberAges>
MemberNames.xml MemberAges.xml
<table border="1">
{
for $i in //Member, $j in doc("MemberAges.xml")//Member[@id eq $i/@id]/Age
where number($i/@id) <= 5
order by $i/Name/text() ascending
return
<tr>
<td>{$i/Name/text()}</td>
<td>{$j/text()}</td>
</tr>
}
</table>
MemberInfo.xq
see example19
77
for $i in expr1 let $j := expr2 where expr3 order by expr4 return expr5
<?xml version="1.0"?>
<?xml version="1.0"?>
<MemberAges>
<MemberNames>
...
$i <Member id="1">
$j <Member id="1">
<Name>Jeff</Name>
<Age>35</Age>
</Member>
</Member>
<Member id="2">
<Member id="2">
<Name>David</Name>
<Age>39</Age>
</Member>
</Member>
…
...
</MemberNames>
</MemberAges>
<table border="1">
{
for $i in //Member
let $j := doc("MemberAges.xml")//Member[@id eq $i/@id]/Age This is an alternate
where number($i/@id) <= 5 (equivalent) solution
order by $i/Name/text() ascending
return
<tr>
<td>{$i/Name/text()}</td>
<td>{$j/text()}</td>
</tr>
}
</table>
MemberInfo_v2.xq
see example19
78
Equivalent
for $i in //Member,
$j in doc("MemberAges.xml")//Member[@id eq $i/@id]/Age
for $i in //Member
let $j := doc("MemberAges.xml")//Member[@id eq $i/@id]/Age
79
FLWOR
• Pronounced: Flower
• for-let-where-order-return
for $i in //Member
let $j := doc("MemberAges.xml")//Member[@id eq $i/@id]/Age
where number($i/@id) <= 5
order by $i/Name/text() ascending
return ...
let $j := expr
• The let clause is not a looping mechanism.
It is only a variable assignment mechanism.
<table border="1">
<tr><th>$i</th><th>$j</th><th>$k</th></tr>
{
Output:
for $i in (1 to 3) $i $j $k
let $j := ("red", "white", "blue") 1 red white blue 4
for $k in (4 to 6) 1 red white blue 5
return 1 red white blue 6
<tr> 2 red white blue 4
<td>{$i}</td> 2 red white blue 5
<td>{$j}</td> 2 red white blue 6
<td>{$k}</td> 3 red white blue 4
</tr> 3 red white blue 5
} 3 red white blue 6
</table> Do Lab4
see example20
81
Output:
• FitnessCenter
• Member
• Name
• Member
• Name
see example20-a
82
see example20-b
83
for $i in $distinct
return
<li>
Members with {$i} as their favorite color:
<ul>
{
let $names := $source//Member[child::FavoriteColor eq $i]/Name
for $j in $names
return
<li>{data($j)}</li>
}
</ul>
</li>
}
see example20-c
</ul>
85
for $i in $distinct
return
<li>
Members with {$i} as their favorite color:
<ul>
{
for $j in $source//Member
where $j/child::FavoriteColor eq $i
return
<li>{$j/data(Name)}</li>
}
</ul>
</li>
}
</ul> see example20-d
86
Declaring variables
• The top of an XQuery document is called the Prolog.
• In the Prolog you can declare variables, functions,
namespaces, and import other XQuery documents and
schemas.
declare variable $increase := 1.1;
<html>
<body>
<table border="1">
<tr><th>Name</th><th>Old Rate</th><th>New Rate</th></tr>
{
for $i in //Member return
<tr>
<td>{$i/Name/text()}</td>
<td>{if ($i/@level eq "platinum") then 500 else if ($i/@level eq "gold") then 450 else 400}</td>
<td>{if ($i/@level eq "platinum") then 500 * $increase else if ($i/@level eq "gold") then 450 * $increase else 400 * $increase}</td>
</tr>
}
</table>
</body>
</html>
see example21
87
<?xml version="1.0"?>
<FitnessCenter>
<Member level="platinum">
<Name>Jeff</Name>
</Member> declare variable $increase := 1.1;
<Member level="gold">
<Name>David</Name> <html>
</Member> <body>
<Member level="platinum"> <table border="1">
<Name>Roger</Name> <tr><th>Name</th><th>Old Rate</th><th>New Rate</th></tr>
</Member> {
<Member level="silver"> for $i in //Member return
<Name>Stacey</Name> <tr>
</Member> <td>{$i/Name/text()}</td>
<Member level="gold"> <td>{if ($i/@level eq "platinum") then 500 else if ($i/@level eq "gold") then 450 else 400}</td>
<Name>Linda</Name> <td>{if ($i/@level eq "platinum") then 500 * $increase else if ($i/@level eq "gold") then 450 * $increase else 400 * $increase}</td>
</Member> </tr>
<Member level="platinum"> }
<Name>John</Name> </table>
</Member> </body>
</FitnessCenter> </html>
FitnessCenter.xml FitnessCenter.xq
see example21
88
Prolog, Body
• An XQuery document is composed of an optional Prolog
followed by the Body.
• Up until the last slide all of our examples have just had a
Body (we had no Prolog).
Version xquery version="1.0" encoding="UTF-8";
Declaration
Multiple Variables
This is exactly like the last example except the sequence of
Members are stored in a variable:
declare variable $members := //Member;
declare variable $increase := 1.1;
<html>
<body>
<table border="1">
<tr><th>Name</th><th>Old Rate</th><th>New Rate</th></tr>
{
for $i in $members return
<tr>
<td>{$i/Name/text()}</td>
<td>{if ($i/@level eq "platinum") then 500 else if ($i/@level eq "gold") then 450 else 400}</td>
<td>{if ($i/@level eq "platinum") then 500 * $increase else if ($i/@level eq "gold") then 450 * $increase else 400 * $increase}</td>
</tr>
}
</table>
</body>
</html>
see example22
91
Using functions
namespace declaration declare namespace ex = "http://www.example.org";
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{ex:multiply($i)}</td>
</tr>
}
</table>
</body>
</html> see example23
92
<?xml version="1.0"?>
<Numbers>
<Number>0</Number>
<Number>8</Number>
<Number>23</Number>
<Number>17</Number>
<Number>5</Number>
<Number>19</Number>
<Number>44</Number>
<Number>13</Number>
<Number>78</Number>
<Number>21</Number>
<Number>2</Number>
<Number>1</Number>
<Number>15</Number>
<Number>67</Number>
<Number>99</Number>
<Number>14</Number>
<Number>8</Number>
<Number>33</Number>
<Number>50</Number>
</Numbers>
Numbers.xml
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{ex:multiply($i)}</td>
</tr>
}
</table>
</body>
</html>
Numbers.xq
see example23
93
ex:multiply
94
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{ex:multiply($i)}</td>
</tr>
}
</table>
</body>
</html>
95
Square a number, n
declare namespace ex = "http://www.example.org";
Do Lab5
see example23-c
97
};
ex:identity-plus-lcase(doc('FitnessCenter.xml')/*)
see example23-a
99
};
ex:identity-plus-lcase(doc('FitnessCenter.xml')/*)
see example23-b
101
Modules
• You can create files just containing a Prolog. These are called modules.
• Example: I moved the Prolog in a previous example into a separate file:
module namespace m = "http://www.multiplication.org";
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
Numbers.xq {
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{m:multiply($i)}</td>
</tr>
}
</table>
</body>
</html> see example24
102
A Module defines a
targetNamespace
Namespace The module's
prefix targetNamespace
Module variables
must be QNames
module namespace m = "http://www.multiplication.org";
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{m:multiply($i)}</td>
</tr>
}
</table>
</body>
</html>
105
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>New Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{m:multiply($i)}</td>
</tr>
}
</table>
</body>
</html>
106
Filename Suffix
• Use .xq as the filename suffix for XQuery
files.
• Use .xqm as the filename suffix for XQuery
Module files.
• By adopting this convention you will be
able to quickly scan a folder and see which
files are executable (the .xq files) and which
are not (the .xqm files).
Do Lab6
107
Multiplication-Module.xqm Addition-Module.xqm
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>* Value</th><th>+ Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{m:multiply($i)}</td>
<td>{a:add($i)}</td>
</tr>
}
</table>
</body>
</html>
Math-Module.xqm
<html>
<body>
<table border="1">
<tr><th>Old Value</th><th>* Value</th><th>+ Value</th></tr>
{
for $i in //Number return
<tr>
<td>{data($i)}</td>
<td>{m:multiply($i)}</td>
<td>{m:add($i)}</td>
</tr>
}
</table>
</body>
</html>
see example26
Numbers.xq
109
Type Checking
import module namespace m = "http://www.math.org" at "Math-Module.xqm";
<html> By wrapping a
<body>
<table border="1">
value within a
<tr><th>Old Value</th><th>* Value</th><th>+ Value</th></tr> datatype you are
{
for $i in //Number return instructing the
<tr>
<td>{xsd:integer($i)}</td>
XQuery processor
<td>{xsd:integer(m:multiply($i))}</td> to validate that
<td>{xsd:integer(m:add($i))}</td>
</tr> the value is of that
}
</table> data type.
</body>
</html>
see example27
110
ChapterList.xml <html>
<body>
<table border="1">
<tr><th>Chapter</th></tr>
{
for $i in //li return
<tr>
<td>{bk:Chapter($i)}</td>
</tr>
}
</table>
</body>
</html>
CheckChapterList.xq
see example28
111
<html>
<body>
<table border="1">
<tr><th>Chapter</th></tr>
{
for $i in //li return
<tr>
<td>{bk:Chapter($i)}</td>
</tr>
}
</table>
</body>
</html>
112
ChapterList.xml <html>
<body>
<table border="1">
<tr><th>Chapter</th></tr>
{
for $i in //li return
Do this
<tr>
<td>{$i cast as Chapter}</td>
</tr>
}
</table>
</body>
</html>
CheckChapterList.xq
see example29
113
<html>
<body> Type cast the value
<table border="1">
<tr><th>Chapter</th></tr> of $i to the user-defined
{ type Chapter.
for $i in //li return
<tr>
<td>{$i cast as Chapter}</td>
</tr>
}
</table>
</body>
</html>
114
Comments
• XQuery uses the same syntax for comments
as XPath 2.0
<ul>
{
let $source := doc("FitnessCenter.xml")
let $colors := $source//FavoriteColor
let $distinct := distinct-values($colors)
Output Text
• In this tutorial we have seen XQueries that
created (X)HTML and XQueries that
created XML.
• Now let's see an XQuery that creates text.
116
<?xml version="1.0" encoding="UTF-8"?>
<bookstore storename="The ABC Book Store">
<book>
<title>The Origin of Wealth</title>
<author>Eric D. Beinhocker</author>
<date>2006</date>
XML <ISBN>1-57851-777-X</ISBN>
<publisher>Harvard Business School Press</publisher>
<cost currency="USD">29.95</cost>
</book>
…
</bookstore>
XQuery
return
(
string($source/bookstore/@storename),
for $i in $source//book return
(
"
", (: Hex A is newline :)
string-join(
(
string($i/title),
string($i/author[1]),
string($i/date),
string($i/ISBN),
string($i/publisher),
string($i/cost[@currency='USD'])
),
'/'
)
)
)
see example30
118
Every time I run an XQuery, the output has an XML declaration at the top, even if the output is not XML, e.g.,
Is there a way to specify in the XQuery the type of output (XML, text, HTML)?
Is there a way to avoid the output having an XML declaration at the top?
/Roger
119
>Is there a way to avoid the output having an XML declaration at the top?
http://www.w3.org/TR/2007/REC-xslt-xquery-serialization-20070123/
Not all processors support serialization, and those that do, do not support all serialization methods or properties of
serialization.
The way one specifies serialization in XQuery is typically through options. Here's how to specify text output for two different
products:
Using Saxon:
declare namespace saxon = "http://saxon.sf.net/";
declare option saxon:output "indent=no";
declare option saxon:output "method=text";
Using eXist:
declare namespace exist = "http://exist.sourceforge.net/NS/exist";
declare option exist:serialize "method=text indent=no";
120
return
(
string($source/bookstore/@storename),
for $i in $source//book return
(
"
",
string-join(
(
string($i/title),
string($i/author[1]),
string($i/date),
string($i/ISBN),
string($i/publisher),
string($i/cost[@currency='USD'])
),
'/'
)
)
)
Do Lab7
see example31
121
XQueryX
• XQueryX is an XML representation of an
XQuery.
• It is not convenient for humans to read and
write, but it is easy for programs to parse,
and because XQueryX is represented in
XML, standard XML tools can be used to
create, interpret, or modify queries.
122
XQuery
<bib>
{
for $b in doc("http://bstore1.example.com/bib.xml")/bib/book
where $b/publisher = "Addison-Wesley" and $b/@year > 1991
return <book year="{ $b/@year }">
{ $b/title }
</book>
}
</bib>
123
XQueryX
http://www.w3.org/TR/xqueryx/#Example1-XQueryX