XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C...
-
Upload
fernando-beans -
Category
Documents
-
view
295 -
download
1
Transcript of XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C...
![Page 1: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/1.jpg)
XML Data Management
8. XQuery
Werner Nutt
![Page 2: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/2.jpg)
Requirements for an XML Query Language
David Maier, W3C XML Query Requirements:
• Closedness: output must be XML
• Composability: wherever a set of XML elements is required, a
subquery is allowed as well
• Support for key operations:– selection
– extraction, projection
– restructuring
– combination, join
– fusion of elements
![Page 3: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/3.jpg)
Requirements for an XML Query Language
• Can benefit from a schema,
but should also be applicable without
• Retains the order of nodes
• Formal semantics:
– structure of results should be derivable from query
– defines equivalence of queries
• Queries should be representable in XML
documents can have embedded queries
![Page 4: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/4.jpg)
How Does One Design a Query Language?
• In most query languages, there are two aspects to a
query:
– Retrieving data (e.g., from … where … in SQL)
– Creating output (e.g., select … in SQL)
• Retrieval consists of
– Pattern matching (e.g., from … )
– Filtering (e.g., where … )
… although these cannot always be clearly distinguished
![Page 5: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/5.jpg)
XQuery Principles
• Data Model identical with the XPath data model
– documents are ordered, labeled trees
– nodes have identity
– nodes can have simple or complex types
(defined in XML Schema)
• A query result is an ordered list/sequence of items
(nodes, values, attributes, etc., but not lists)
– special case: the empty list ()
![Page 6: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/6.jpg)
XQuery Principles (cntd)
• XQuery can be used without schemas,
but can be checked against DTDs and XML schemas
• XQuery is a functional language
– no statements
– evaluation of expressions
– function definitions
– modules
![Page 7: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/7.jpg)
The Recipes DTD (Reminder)
<!ELEMENT recipes (recipe*)>
<!ELEMENT recipe (title, ingredient+, preparation, nutrition)>
<!ELEMENT title (#PCDATA)>
<!ELEMENT ingredient (ingredient*, preparation?)>
<!ATTLIST ingredient
name CDATA #REQUIRED
amount CDATA #IMPLIED
unit CDATA #IMPLIED>
<!ELEMENT preparation (step+)>
<!ELEMENT step (#PCDATA)>
<!ELEMENT nutrition EMPTY>
<!ATTLIST nutrition
calories CDATA #REQUIRED
fat CDATA #REQUIRED>
![Page 8: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/8.jpg)
<titles>
{for $r in doc("recipes.xml")//recipe
return
$r/title}
</titles>
returns
<titles>
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
<title>Ricotta Pie</title>
…
</titles>
A Query over the Recipes Document
![Page 9: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/9.jpg)
Query Features
XPath
<titles>
{for $r in doc("recipes.xml")//recipe
return
$r/title}
</titles>
doc(String) returns input document
Part to be returned as it is given {To be evaluated}
Iteration $var - variables
Sequence of results,one for each variable binding
![Page 10: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/10.jpg)
An Equivalent Stylesheet Template
<xsl:template match="/">
<titles>
<xsl:for-each select="//recipe">
<xsl:copy-of select="title"/>
</xsl:for-each>
</titles>
</xsl:template>
![Page 11: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/11.jpg)
Features: Summary
• The result is a new XML document
• A query consists of parts that are returned as is
• ... and others that are evaluated (everything in {...} )
• Calling the function doc(String) returns
an input document
• XPath is used to retrieve node sets and values
• Iteration over node sets:
for binds a variable to all nodes in a node set
• Variables can be used in XPath expressions
• return returns a sequence of results,
one for each binding of a variable
![Page 12: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/12.jpg)
XPath is a Fragment of XQuery
• doc("recipes.xml")//recipe[1]/title
returns
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
• doc("recipes.xml")//recipe[position()<=3]
/title
returns
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>,
<title>Ricotta Pie</title>,
<title>Linguine alla Pescadora</title>
an element
a list of elements
![Page 13: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/13.jpg)
Beware: Attributes in XPath
• doc("recipes.xml")//recipe[1]/ingredient[1]
/@name
→ attribute name {"beef cube steak"}
• string(doc("recipes.xml")//recipe[1]
/ingredient[1]/@name)
→ "beef cube steak"
an attribute, represented as a constructor
for an attribute node (not in Saxon)
a value of type string
![Page 14: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/14.jpg)
Beware: Attributes in XPath (cntd.)
• <first-ingredient>
{string(doc("recipes.xml")//recipe[1]
/ingredient[1]/@name)}
</first-ingredient>
→ <first-ingredient>beef cube steak</first-ingredient>
an element with string content
![Page 15: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/15.jpg)
Beware: Attributes in XPath (cntd.)
• <first-ingredient>
{doc("recipes.xml")//recipe[1]
/ingredient[1]/@name}
</first-ingredient>
→ <first-ingredient name="beef cube steak"/>
an element with an attribute
• Note: The XML that we write down is only the surface structure
of the data model that is underlying XQuery
![Page 16: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/16.jpg)
Beware: Attributes in XPath (cntd.)
• <first-ingredient
oldName="{doc("recipes.xml")//recipe[1]
/ingredient[1]/@name}">
Beef
</first-ingredient>
→ <first-ingredient oldName="beef cube steak">
Beef
</first-ingredient>
An attribute is cast as a string
![Page 17: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/17.jpg)
Constructor Syntax
For all constituents of documents, there are constructors
element first-ingredient
{
attribute oldName
{string(doc("recipes.xml")//recipe[1]
/ingredient[1]/@name)},
"Beef"
}
equivalent to the notation on the previous slide
attribute constructor
element constructor
![Page 18: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/18.jpg)
Iteration with the For-Clause
Syntax: for $var in xpath-expr
Example: for $r in doc("recipes.xml")//recipe
return string($r)
• The expression creates a list of bindings for a variable $var
If $var occurs in an expression exp,
then exp is evaluated for each binding
• For-clauses can be nested:
for $r in doc("recipes.xml")//recipefor $v in doc("vegetables.xml")//vegetable return ...
![Page 19: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/19.jpg)
What Does This Return?
for $i in (1,2,3)
for $j in (1,2,3)
return
element {concat("x",$i * $j)}
{$i * $j}
![Page 20: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/20.jpg)
Nested For-clauses: Example
<my-recipes>
{for $r in doc("recipes.xml")//recipe
return
<my-recipe title="{$r/title}">
{for $i in $r//ingredient
return
<my-ingredient>
{string($i/@name)}
</my-ingredient>
}
</my-recipe>
}
</my-recipes>
Returns my-recipes with titles as attributes and my-ingredientswith names as text content
![Page 21: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/21.jpg)
The Equivalent Stylesheet Template
<xsl:template match="/">
<my-recipes>
<xsl:for-each select=".//recipe">
<my-recipe title="{title}">
<xsl:for-each select="ingredient">
<my-ingredient>
<xsl:value-of select="@name"/>
</my-ingredient>
</xsl:for-each>
</my-recipe>
</xsl:for-each>
</my-recipes>
</xsl:template>
![Page 22: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/22.jpg)
The Let Clause
Syntax: let $var := xpath-expr
• binds variable $var to a list of nodes,
with the nodes in document order
• does not iterate over the list
• allows one to keep intermediate results for reuse
(not possible in SQL)
Example:
let $oorecps := doc("recipes.xml")//recipe
[.//ingredient/@name="olive oil"]
![Page 23: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/23.jpg)
Let Clause: Example
<calory-content>
{let $oorecps := doc("recipes.xml")//recipe
[.//ingredient/@name="olive oil"]
for $r in $oorecps return
<calories>
{$r/title/text()}
{": "}
{string($r/nutrition/@calories)}
</calories>}
</calory-content> Calories of recipeswith olive oil
Note the implicitstring concatenation
![Page 24: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/24.jpg)
Let Clause: Example (cntd.)
The query returns:
<calory-content>
<calories>Beef Parmesan: 1167</calories>
<calories>Linguine alla Pescadora: 532</calories>
</calory-content>
![Page 25: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/25.jpg)
The Where Clause
Syntax: where <condition>
• occurs before return clause
• similar to predicates in XPath
• comparisons on nodes:
“=“ for node equality
“<<“ and “>>” for document order
• Example:
for $r in doc("recipes.xml")//recipe where $r//ingredient/@name="olive oil"return ...
![Page 26: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/26.jpg)
Quantifiers
• Syntax:
some/every $var in <node-set>
satisfies <expr>
• $var is bound to all nodes in <node-set>
• Test succeeds if <expr> is true for some/every
binding
• Note: if <node-set> is empty, then
“some” is false and “all” is true
![Page 27: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/27.jpg)
Quantifiers (Example)
• Recipes that have some compound ingredient
• Recipes where every top level ingredient is non-compound
for $r in doc("recipes.xml")//recipewhere some $i in $r/ingredient satisfies $i/ingredient return $r/title
for $r in doc("recipes.xml")//recipewhere every $i in $r/ingredient satisfies not($i/ingredient) return $r/title
![Page 28: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/28.jpg)
Element Fusion
“To every recipe, add the attribute calories!”
<result>
{let $rs := doc("recipes.xml")//recipe
for $r in $rs return
<recipe>
{$r/nutrition/@calories}
{$r/title}
</recipe>}
</result>
an element
an attribute
![Page 29: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/29.jpg)
Element Fusion (cntd.)
The query result:
<result>
<recipe calories="1167">
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
</recipe>
<recipe calories="349"><title>Ricotta Pie</title></recipe>
<recipe calories="532"><title>Linguine Pescadoro</title></recipe>
<recipe calories="612"><title>Zuppa Inglese</title></recipe>
<recipe calories="8892">
<title>Cailles en Sarcophages</title>
</recipe>
</result>
![Page 30: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/30.jpg)
Fusion with Mixed Syntax
We mix constructor and XML–Syntax:
element result
{let $rs := doc("recipes.xml")//recipe
for $r in $rs return
<recipe>
{attribute calories {$r/nutrition/@calories}}
{$r/title}
</recipe>}
![Page 31: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/31.jpg)
The Same with Constructor Syntax Only
element result
{let $rs := doc("recipes.xml")//recipe
for $r in $rs return
element recipe
{
attribute calories {$r/nutrition/@calories},
$r/title
}
}
![Page 32: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/32.jpg)
Join condition
“Pair every ingredient with the recipes where it is used!”
let $rs := doc("recipes.xml")//recipe
for $i in $rs//ingredient
for $r in $rs
where $r//ingredient/@name=$i/@name
return
<usedin>
{$i/@name}
{$r/title}
</usedin>
Join
![Page 33: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/33.jpg)
Join (cntd.)
The query result:
<usedin name="beef cube steak">
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
</usedin>,
<usedin name="onion, sliced into thin rings">
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
</usedin>,
<usedin name="green bell pepper, sliced in rings">
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
</usedin>
![Page 34: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/34.jpg)
Join Exercise
Return all pairs of ingredients such that
• the ingredients have the same name,
• but occur with different amounts
and return
• the recipes where each of them is used
• together with the amount being used in those recipes,
while returning every pair only once.
Could a query for these ingredients be expressed in XPath?
![Page 35: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/35.jpg)
Join condition
Document Inversion
“For every ingredient, return all the recipes where it is used!”
<result>
{let $rs := doc("recipes.xml")//recipe
for $i in $rs//ingredient
return
<ingredient>
{$i/@*}
{$rs[.//ingredient/@name=$i/@name]/title}
</ingredient>}
</result>
![Page 36: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/36.jpg)
Document Inversion (cntd.)
The query result:
<result>
<ingredient amount="1" name="Alchermes liquor" unit="cup">
<title>Zuppa Inglese</title>
</ingredient>
…
<ingredient amount="2" name="olive oil" unit="tablespoon">
<title>Beef Parmesan with Garlic Angel Hair Pasta</title>
<title>Linguine Pescadoro</title>
</ingredient>
…
![Page 37: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/37.jpg)
Eliminating Duplicates
The function distinct-values(Node Set)
– extracts the values of a sequence of nodes
– creates a duplicate free list of values
Note the coercion: nodes are cast as values!
Example:
let $rs := doc("recipes.xml")//recipe
return distinct-values($rs//ingredient/@name)
yields
xdt:untypedAtomic("beef cube steak"),
xdt:untypedAtomic("onion, sliced into thin rings"),
...
by the Galaxengine
![Page 38: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/38.jpg)
Avoiding Multiple Results in a Join
We want that every ingredient is listed only once:
Eliminate duplicates using distinct-values!
<result>
{let $rs := doc("recipes.xml")//recipe
for $in in distinct-values(
$rs//ingredient/@name)
return
<recipes with="{$in}">
{$rs[.//ingredient/@name=$in]/title}
</recipes> }
</result>
![Page 39: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/39.jpg)
Avoiding Multiple Results (cntd.)
The query result:
<result> <recipes with="beef cube steak"> <title>Beef Parmesan with Garlic Angel Hair Pasta</title> </recipes>
<recipes with="onion, sliced into thin rings"> <title>Beef Parmesan with Garlic Angel Hair Pasta</title> </recipes>... <recipes with="salt"> <title>Linguine Pescadoro</title> <title>Cailles en Sarcophages</title>
</recipes>
...
![Page 40: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/40.jpg)
Syntax: order by expr [ ascending | descending ]
for $iname in doc("recipes.xml")//@name
order by $iname descending
return string($iname)
yields
"whole peppercorns",
"whole baby clams",
"white sugar",
...
The Order By Clause
![Page 41: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/41.jpg)
The Order By Clause (cntd.)
let $rs := doc("recipes.xml")//@name
for $r in $rs
order by $r/nutrition/@calories
return $r/title
In which order will the titles come?
![Page 42: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/42.jpg)
The Order By Clause (cntd.)
The interpreter must be told whether the values
should be regarded as numbers or as strings
(alphanumerical sorting is default)
for $r in $rs
order by number($r/nutrition/@calories)
return $r/title
Note:
– The query returns titles ...
– but the ordering is according to calories,
which do not appear in the output
Also possible in SQL! What if combined with distinct-values?
![Page 43: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/43.jpg)
FLWOR Expresssions (pronounced “flower”)
We have now seen the main ingredients of XQuery:
• For and Let clauses, which can be mixed
• a Where clause imposing conditions
• an Order by clause, which determines the order of results
• a Return clause, which constructs the output.
Combining these yields FLWOR expressions.
![Page 44: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/44.jpg)
Conditionals
if (expr) then expr else expr
Example
let $is := doc("recipes.xml")//ingredient
for $i in $is[not(ingredient)]
let $u := if (not($i/@unit))
then attribute unit {"pieces"}
else ()
creates an attribute unit="pieces" if none exists
and an empty item list otherwise
![Page 45: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/45.jpg)
We use the conditional to construct variants of ingredients:
let $is := doc("recipes.xml")//ingredient
for $i in $is[not(ingredient)]
let $u := if (not($i/@unit))
then attribute {"unit"} {"pieces"}
else ()
return
<ingredient>
{$i/@* | $u}
</ingredient>
Conditionals (cntd.)
Collects all attributes in a list and adds a unitif needed
![Page 46: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/46.jpg)
Conditionals (cntd.)
The query result:
<ingredient name="beef cube steak" amount="1.5"
unit="pound"/>,
...
<ingredient name="eggs" amount="12"
unit="pieces"/>,
…
![Page 47: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/47.jpg)
Exercises
Write queries that produce
• A list, containing for every recipe the recipe's title element
and an element with the number of calories
• The same, ordered according to calories
• The same, alphabetically ordered according to title
• The same, ordered according to the fat content
• The same, with title as attribute and calories as content.
• A list, containing for every recipe the top level ingredients,
dropping the lower level ingredients
![Page 48: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/48.jpg)
Sample Solution 1
A list, containing for every recipe the recipe's title element
and an element with the number of calories
<result>
{for $r in doc("recipes.xml")//recipe
return
($r/title,
<calories>
{number($r//@calories)}
</calories>)
}
</result>
The results returned are 2-element lists.
The list constructor is“( . , . )”
![Page 49: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/49.jpg)
Sample Solution 6
<results> {for $r in doc("recipes.xml")//recipe return <recipe> {attribute title {$r/title}, for $i in $r/ingredient return if (not($i/ingredient)) then $i else <ingredient> {$i/@*} </ingredient> } </recipe> }</results>
![Page 50: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/50.jpg)
Aggregation
Aggregation functions count, sum, avg, min, max
Example: The number of recipes with olive oil
let $doc := doc("recipes.xml”)
return
<number>
{count($doc//recipe
[.//ingredient/@name = "olive oil"])}
</number>
![Page 51: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/51.jpg)
Grouping and Aggregation
For each recipe, the number of simple ingredients
for $r in doc("recipes.xml")//recipe
return
<number>
{attribute title {$r/title/text()}}
{count($r//ingredient[not(ingredient)])}
</number>
![Page 52: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/52.jpg)
Grouping and Aggregation (cntd.)
The query result:
<number title="Beef Parmesan with Garlic Angel Hair Pasta">
11</number>,
<number title="Ricotta Pie">12</number>,
<number title="Linguine Pescadoro">15</number>,
<number title="Zuppa Inglese">8</number>,
<number title="Cailles en Sarcophages">30</number>
![Page 53: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/53.jpg)
Grouping and Aggregation (cntd.)
A list, containing for every ingredient,
the number of occurrences of that ingredient
let $d := doc("recipes.xml")
let $is := distinct-values($d//ingredient/@name)
return
<result>
{for $i in $is
order by $i
return
<ingredient name="{$i}">
{count($d//ingredient[@name=$i])}
</ingredient>}
</result>
![Page 54: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/54.jpg)
Nested Aggregation
“The recipe with the maximal number of calories!”
let $rs := doc("recipes.xml")//recipe
let $maxCal := max($rs//@calories)
for $r in $rs
where $r//@calories = $maxCal
return string($r/title)
returns
"Cailles en Sarcophages"
![Page 55: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/55.jpg)
User-defined Functions
declare function local:fac($n as xs:integer)
as xs:integer
{
if ($n = 0)
then 1
else $n * local:fac($n - 1)
};
local:fac(10)
FunctionDeclaration
FunctionCall
![Page 56: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/56.jpg)
Example: Nested Ingredients
declare function
local:nest($n as xs:integer, content as xs:string)
as element()
{
if ($n = 0)
then element ingredient{$content}
else element ingredient{local:nest($n - 1,$content)}
};
local:nest(3,"Stuff")
![Page 57: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/57.jpg)
What Does this Function Return?
declare function local:depth($n as node())
as xs:integer
{
if (fn:empty($n/*))
then 1
else let $cdepths
:= for $c in $n/* return local:depth($c)
return fn:max($cdepths) + 1
};
![Page 58: XML Data Management 8. XQuery Werner Nutt. Requirements for an XML Query Language David Maier, W3C XML Query Requirements: Closedness: output must be.](https://reader036.fdocuments.net/reader036/viewer/2022081505/5517434d550346b1338b45c2/html5/thumbnails/58.jpg)
Exercise
Write a function
local:element-copy
that
• takes as input a node (= XML tree)
• produces as output a copy of the tree,
but without the attributes