You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
7361 lines
239 KiB
7361 lines
239 KiB
<?xml version="1.0" encoding="utf-8"?>
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="EN" xml:lang="EN">
|
|
<head>
|
|
<meta name="generator" content=
|
|
"HTML Tidy for Mac OS X (vers 1st December 2004), see www.w3.org" />
|
|
|
|
<title>XML Query Use Cases</title>
|
|
<style type="text/css">
|
|
/*<![CDATA[*/
|
|
code { font-family: monospace; }
|
|
|
|
div.constraint,
|
|
div.issue,
|
|
div.note,
|
|
div.notice { margin-left: 2em; }
|
|
|
|
div.issue
|
|
p.title { margin-left: -2em; }
|
|
|
|
ol.enumar { list-style-type: decimal; }
|
|
ol.enumla { list-style-type: lower-alpha; }
|
|
ol.enumlr { list-style-type: lower-roman; }
|
|
ol.enumua { list-style-type: upper-alpha; }
|
|
ol.enumur { list-style-type: upper-roman; }
|
|
|
|
li p { margin-top: 0.3em;
|
|
margin-bottom: 0.3em; }
|
|
|
|
sup small { font-style: italic;
|
|
color: #8F8F8F;
|
|
}
|
|
|
|
div.exampleInner pre { margin-left: 1em;
|
|
margin-top: 0em; margin-bottom: 0em}
|
|
div.exampleOuter {border: 4px double gray;
|
|
margin: 0em; padding: 0em}
|
|
div.exampleInner { background-color: #d5dee3;
|
|
border-top-width: 4px;
|
|
border-top-style: double;
|
|
border-top-color: #d3d3d3;
|
|
border-bottom-width: 4px;
|
|
border-bottom-style: double;
|
|
border-bottom-color: #d3d3d3;
|
|
padding: 4px; margin: 0em }
|
|
div.exampleWrapper { margin: 4px }
|
|
div.exampleHeader { font-weight: bold;
|
|
margin: 4px}
|
|
|
|
div.issue { border-bottom-color: black;
|
|
border-bottom-style: solid;
|
|
border-bottom-width: 1pt;
|
|
margin-bottom: 20pt;
|
|
}
|
|
|
|
th.issue-toc-head { border-bottom-color: black;
|
|
border-bottom-style: solid;
|
|
border-bottom-width: 1pt;
|
|
}
|
|
|
|
|
|
table.small { font-size: x-small; }
|
|
/*]]>*/
|
|
</style>
|
|
<link type="text/css" rel="stylesheet" href=
|
|
"http://www.w3.org/StyleSheets/TR/W3C-WG-NOTE" />
|
|
</head>
|
|
|
|
<body>
|
|
<div class="head">
|
|
<p><a href="http://www.w3.org/"><img width="72" height="48"
|
|
alt="W3C" src="http://www.w3.org/Icons/w3c_home" /></a></p>
|
|
|
|
<h1><a id="title" name="title"></a>XML Query Use Cases</h1>
|
|
|
|
<h2><a id="w3c-doctype" name="w3c-doctype"></a>W3C Working
|
|
Group Note 23 March 2007</h2>
|
|
|
|
<dl>
|
|
<dt>This version:</dt>
|
|
|
|
<dd><a href=
|
|
"http://www.w3.org/TR/2007/NOTE-xquery-use-cases-20070323/">http://www.w3.org/TR/2007/NOTE-xquery-use-cases-20070323/</a></dd>
|
|
|
|
<dt>Latest version:</dt>
|
|
|
|
<dd><a href=
|
|
"http://www.w3.org/TR/xquery-use-cases/">http://www.w3.org/TR/xquery-use-cases/</a></dd>
|
|
|
|
<dt>Previous version:</dt>
|
|
|
|
<dd><a href=
|
|
"http://www.w3.org/TR/2006/WD-xquery-use-cases-20060608/">http://www.w3.org/TR/2006/WD-xquery-use-cases-20060608/</a></dd>
|
|
|
|
<dt>Editors:</dt>
|
|
|
|
<dd>Don Chamberlin, IBM Almaden Research Center <a href=
|
|
"mailto:chamberlin@almaden.ibm.com"><chamberlin@almaden.ibm.com
|
|
></a></dd>
|
|
|
|
<dd>Peter Fankhauser, Infonyte GmbH <a href=
|
|
"mailto:fankhauser@infonyte.com"><fankhauser@infonyte.com></a></dd>
|
|
|
|
<dd>Daniela Florescu, Oracle corporation <a href=
|
|
"mailto:dana.florescu@oracle.com"><dana.florescu@oracle.com></a></dd>
|
|
|
|
<dd>Massimo Marchiori, University of Venice <a href=
|
|
"mailto:massimo@w3.org"><massimo@w3.org></a></dd>
|
|
|
|
<dd>Jonathan Robie, DataDirect Technologies <a href=
|
|
"mailto:jonathan.robie@datadirect.com"><jonathan.robie@datadirect.com></a></dd>
|
|
</dl>
|
|
|
|
<p>This document is also available in these non-normative
|
|
formats: <a href=
|
|
"http://www.w3.org/TR/2007/NOTE-xquery-use-cases-20070323/xquery-use-cases.xml">
|
|
XML</a>.</p>
|
|
|
|
<p class="copyright"><a href=
|
|
"http://www.w3.org/Consortium/Legal/ipr-notice#Copyright">Copyright</a> © 2007 <a href="http://www.w3.org/">
|
|
<acronym title=
|
|
"World Wide Web Consortium">W3C</acronym></a><sup>®</sup>
|
|
(<a href="http://www.csail.mit.edu/"><acronym title=
|
|
"Massachusetts Institute of Technology">MIT</acronym></a>,
|
|
<a href="http://www.ercim.org/"><acronym title=
|
|
"European Research Consortium for Informatics and Mathematics">ERCIM</acronym></a>,
|
|
<a href="http://www.keio.ac.jp/">Keio</a>), All Rights
|
|
Reserved. W3C <a href=
|
|
"http://www.w3.org/Consortium/Legal/ipr-notice#Legal_Disclaimer">
|
|
liability</a>, <a href=
|
|
"http://www.w3.org/Consortium/Legal/ipr-notice#W3C_Trademarks">trademark</a>
|
|
and <a href=
|
|
"http://www.w3.org/Consortium/Legal/copyright-documents">document
|
|
use</a> rules apply.</p>
|
|
</div>
|
|
<hr />
|
|
|
|
<div>
|
|
<h2><a id="abstract" name="abstract"></a>Abstract</h2>
|
|
|
|
<p>This document specifies usage scenarios for XQuery.</p>
|
|
</div>
|
|
|
|
<div>
|
|
<h2><a id="status" name="status"></a>Status of this
|
|
Document</h2>
|
|
|
|
<p><em>This section describes the status of this document at
|
|
the time of its publication. Other documents may supersede this
|
|
document. A list of current W3C publications and the latest
|
|
revision of this technical report can be found in the <a href=
|
|
"http://www.w3.org/TR/">W3C technical reports index</a> at
|
|
http://www.w3.org/TR/.</em></p>
|
|
|
|
<p>This is the W3C <a href=
|
|
"http://www.w3.org/2005/10/Process-20051014/tr.html#tr-end">Working
|
|
Group Note</a> of "XML Query (XQuery) Use Cases", produced by
|
|
the W3C <a href="http://www.w3.org/XML/Query/">XML Query
|
|
Working Group</a>, part of the <a href=
|
|
"http://www.w3.org/XML/Activity">XML Activity</a>. This
|
|
document is being published as a <a href=
|
|
"http://www.w3.org/2005/10/Process-20051014/tr.html#tr-end">Working
|
|
Group Note</a> to persistently record the Use Cases that guided
|
|
the development of <a href=
|
|
"http://www.w3.org/TR/xquery/">XQuery 1.0: An XML Query
|
|
Language</a> and its associated specifications as W3C
|
|
Recommendations.</p>
|
|
|
|
<p>Please submit comments about this document using W3C's
|
|
<a href="http://www.w3.org/Bugs/Public/">public Bugzilla
|
|
system</a> (instructions can be found at <a href=
|
|
"http://www.w3.org/XML/2005/04/qt-bugzilla">http://www.w3.org/XML/2005/04/qt-bugzilla</a>).
|
|
If access to that system is not feasible, you may send your
|
|
comments to the W3C XSLT/XPath/XQuery public comments mailing
|
|
list, <a href=
|
|
"mailto:public-qt-comments@w3.org">public-qt-comments@w3.org</a>.
|
|
It will be very helpful if you include the string
|
|
[XQRecUseCases] in the subject line of your report, whether
|
|
made in Bugzilla or in email. Each Bugzilla entry and email
|
|
message should contain only one comment. Archives of the
|
|
comments and responses are available at <a href=
|
|
"http://lists.w3.org/Archives/Public/public-qt-comments/">http://lists.w3.org/Archives/Public/public-qt-comments/</a>.</p>
|
|
|
|
<!--*
|
|
<p>Publication as a <a href=
|
|
"http://www.w3.org/2005/10/Process-20051014/tr.html#tr-end">Working
|
|
Group Note</a> does not imply endorsement by the W3C
|
|
Membership. This is a draft document and may be updated,
|
|
replaced or obsoleted by other documents at any time. It is
|
|
inappropriate to cite this document as other than work in
|
|
progress.</p>
|
|
*-->
|
|
|
|
<p>Publication as a <a
|
|
href="http://www.w3.org/2005/10/Process-20051014/tr.html#tr-end">Working
|
|
Group Note</a> does not imply endorsement by the W3C Membership. At
|
|
the time of publication, work on this document was considered complete
|
|
and no further revisions are anticipated. It is a stable document and
|
|
may be used as reference material or cited from another
|
|
document. However, this document may be updated, replaced, or made
|
|
obsolete by other documents at any time.</p>
|
|
|
|
<p>This document was produced by a group operating under the
|
|
<a href=
|
|
"http://www.w3.org/Consortium/Patent-Policy-20040205/">5
|
|
February 2004 W3C Patent Policy</a>. W3C maintains a <a href=
|
|
"http://www.w3.org/2004/01/pp-impl/18797/status#disclosures">public
|
|
list of any patent disclosures</a> made in connection with the
|
|
deliverables of the group; that page also includes instructions
|
|
for disclosing a patent. An individual who has actual knowledge
|
|
of a patent which the individual believes contains <a href=
|
|
"http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential">
|
|
Essential Claim(s)</a> must disclose the information in
|
|
accordance with <a href=
|
|
"http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure">
|
|
section 6 of the W3C Patent Policy</a>.</p>
|
|
</div>
|
|
|
|
<div class="toc">
|
|
<h2><a id="contents" name="contents"></a>Table of Contents</h2>
|
|
|
|
<p class="toc">1 <a href="#ucforxq">Use Cases for XML
|
|
Queries</a><br />
|
|
    1.1 <a href="#xmp">Use Case "XMP":
|
|
Experiences and Exemplars</a><br />
|
|
        1.1.1 <a href=
|
|
"#xmp-dtd">Document Type Definitions (DTD)</a><br />
|
|
        1.1.2 <a href=
|
|
"#xmp-data">Sample Data</a><br />
|
|
        1.1.3 <a href=
|
|
"#xmp-dtd-q5">DTD for Q5</a><br />
|
|
        1.1.4 <a href=
|
|
"#xmp-data-q5">Sample Data for Q5</a><br />
|
|
        1.1.5 <a href=
|
|
"#xmp-dtd-q9">DTD for Q9</a><br />
|
|
        1.1.6 <a href=
|
|
"#xmp-data-q9">Data for Q9</a><br />
|
|
        1.1.7 <a href=
|
|
"#xmp-dtd-q10">DTD for Q10</a><br />
|
|
        1.1.8 <a href=
|
|
"#xmp-data-q10">Data for Q10</a><br />
|
|
        1.1.9 <a href=
|
|
"#xmp-queries-results">Queries and Results</a><br />
|
|
            1.1.9.1
|
|
<a href="#xmp-queries-results-q1">Q1</a><br />
|
|
            1.1.9.2
|
|
<a href="#xmp-queries-results-q2">Q2</a><br />
|
|
            1.1.9.3
|
|
<a href="#xmp-queries-results-q3">Q3</a><br />
|
|
            1.1.9.4
|
|
<a href="#xmp-queries-results-q4">Q4</a><br />
|
|
            1.1.9.5
|
|
<a href="#xmp-queries-results-q5">Q5</a><br />
|
|
            1.1.9.6
|
|
<a href="#xmp-queries-results-q6">Q6</a><br />
|
|
            1.1.9.7
|
|
<a href="#xmp-queries-results-q7">Q7</a><br />
|
|
            1.1.9.8
|
|
<a href="#xmp-queries-results-q8">Q8</a><br />
|
|
            1.1.9.9
|
|
<a href="#xmp-queries-results-q9">Q9</a><br />
|
|
            1.1.9.10
|
|
<a href="#xmp-queries-results-q10">Q10</a><br />
|
|
            1.1.9.11
|
|
<a href="#xmp-queries-results-q11">Q11</a><br />
|
|
            1.1.9.12
|
|
<a href="#xmp-queries-results-q12">Q12</a><br />
|
|
    1.2 <a href="#tree">Use Case "TREE":
|
|
Queries that preserve hierarchy</a><br />
|
|
        1.2.1 <a href=
|
|
"#tree-description">Description</a><br />
|
|
        1.2.2 <a href=
|
|
"#tree-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.2.3 <a href=
|
|
"#tree-data">Sample Data</a><br />
|
|
        1.2.4 <a href=
|
|
"#tree-queries-results">Queries and Results</a><br />
|
|
            1.2.4.1
|
|
<a href="#tree-queries-results-q1">Q1</a><br />
|
|
            1.2.4.2
|
|
<a href="#tree-queries-results-q2">Q2</a><br />
|
|
            1.2.4.3
|
|
<a href="#tree-queries-results-q3">Q3</a><br />
|
|
            1.2.4.4
|
|
<a href="#tree-queries-results-q4">Q4</a><br />
|
|
            1.2.4.5
|
|
<a href="#tree-queries-results-q5">Q5</a><br />
|
|
            1.2.4.6
|
|
<a href="#tree-queries-results-q6">Q6</a><br />
|
|
    1.3 <a href="#seq">Use Case "SEQ" -
|
|
Queries based on Sequence</a><br />
|
|
        1.3.1 <a href=
|
|
"#seq-description">Description</a><br />
|
|
        1.3.2 <a href=
|
|
"#seq-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.3.3 <a href=
|
|
"#seq-data">Sample Data</a><br />
|
|
        1.3.4 <a href=
|
|
"#seq-queries-results">Queries and Results</a><br />
|
|
            1.3.4.1
|
|
<a href="#seq-queries-results-q1">Q1</a><br />
|
|
            1.3.4.2
|
|
<a href="#seq-queries-results-q2">Q2</a><br />
|
|
            1.3.4.3
|
|
<a href="#seq-queries-results-q3">Q3</a><br />
|
|
            1.3.4.4
|
|
<a href="#seq-queries-results-q4">Q4</a><br />
|
|
            1.3.4.5
|
|
<a href="#seq-queries-results-q5">Q5</a><br />
|
|
    1.4 <a href="#rdb">Use Case "R" -
|
|
Access to Relational Data</a><br />
|
|
        1.4.1 <a href=
|
|
"#rdb-description">Description</a><br />
|
|
        1.4.2 <a href=
|
|
"#rdb-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.4.3 <a href=
|
|
"#rdb-data">Sample Data</a><br />
|
|
        1.4.4 <a href=
|
|
"#rdb-queries-results">Queries and Results</a><br />
|
|
            1.4.4.1
|
|
<a href="#rdb-queries-results-q1">Q1</a><br />
|
|
            1.4.4.2
|
|
<a href="#rdb-queries-results-q2">Q2</a><br />
|
|
            1.4.4.3
|
|
<a href="#rdb-queries-results-q3">Q3</a><br />
|
|
            1.4.4.4
|
|
<a href="#rdb-queries-results-q4">Q4</a><br />
|
|
            1.4.4.5
|
|
<a href="#rdb-queries-results-q5">Q5</a><br />
|
|
            1.4.4.6
|
|
<a href="#rdb-queries-results-q6">Q6</a><br />
|
|
            1.4.4.7
|
|
<a href="#rdb-queries-results-q7">Q7</a><br />
|
|
            1.4.4.8
|
|
<a href="#rdb-queries-results-q8">Q8</a><br />
|
|
            1.4.4.9
|
|
<a href="#rdb-queries-results-q9">Q9</a><br />
|
|
            1.4.4.10
|
|
<a href="#rdb-queries-results-q10">Q10</a><br />
|
|
            1.4.4.11
|
|
<a href="#rdb-queries-results-q11">Q11</a><br />
|
|
            1.4.4.12
|
|
<a href="#rdb-queries-results-q12">Q12</a><br />
|
|
            1.4.4.13
|
|
<a href="#rdb-queries-results-q13">Q13</a><br />
|
|
            1.4.4.14
|
|
<a href="#rdb-queries-results-q14">Q14</a><br />
|
|
            1.4.4.15
|
|
<a href="#rdb-queries-results-q15">Q15</a><br />
|
|
            1.4.4.16
|
|
<a href="#rdb-queries-results-q16">Q16</a><br />
|
|
            1.4.4.17
|
|
<a href="#rdb-queries-results-q17">Q17</a><br />
|
|
            1.4.4.18
|
|
<a href="#rdb-queries-results-q18">Q18</a><br />
|
|
    1.5 <a href="#sgml">Use Case "SGML":
|
|
Standard Generalized Markup Language</a><br />
|
|
        1.5.1 <a href=
|
|
"#sgml-description">Description</a><br />
|
|
        1.5.2 <a href=
|
|
"#sgml-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.5.3 <a href=
|
|
"#sgml-data">Sample Data</a><br />
|
|
        1.5.4 <a href=
|
|
"#sgml-queries-results">Queries and Results</a><br />
|
|
            1.5.4.1
|
|
<a href="#sgml-queries-results-q1">Q1</a><br />
|
|
            1.5.4.2
|
|
<a href="#sgml-queries-results-q2">Q2</a><br />
|
|
            1.5.4.3
|
|
<a href="#sgml-queries-results-q3">Q3</a><br />
|
|
            1.5.4.4
|
|
<a href="#sgml-queries-results-q4">Q4</a><br />
|
|
            1.5.4.5
|
|
<a href="#sgml-queries-results-q5">Q5</a><br />
|
|
            1.5.4.6
|
|
<a href="#sgml-queries-results-q6">Q6</a><br />
|
|
            1.5.4.7
|
|
<a href="#sgml-queries-results-q7">Q7</a><br />
|
|
            1.5.4.8
|
|
<a href="#sgml-queries-results-q8a">Q8a</a><br />
|
|
            1.5.4.9
|
|
<a href="#sgml-queries-results-q8b">Q8b</a><br />
|
|
            1.5.4.10
|
|
<a href="#sgml-queries-results-q9">Q9</a><br />
|
|
            1.5.4.11
|
|
<a href="#sgml-queries-results-q10">Q10</a><br />
|
|
    1.6 <a href="#text">Use Case "STRING":
|
|
String Search</a><br />
|
|
        1.6.1 <a href=
|
|
"#text-description">Description</a><br />
|
|
        1.6.2 <a href=
|
|
"#text-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.6.3 <a href=
|
|
"#text-data">Sample Data</a><br />
|
|
        1.6.4 <a href=
|
|
"#text-queries-results">Queries and Results</a><br />
|
|
            1.6.4.1
|
|
<a href="#text-queries-results-q1">Q1</a><br />
|
|
            1.6.4.2
|
|
<a href="#text-queries-results-q2">Q2</a><br />
|
|
            1.6.4.3
|
|
<a href="#text-queries-results-q3">Q3</a><br />
|
|
            1.6.4.4
|
|
<a href="#text-queries-results-q4">Q4</a><br />
|
|
            1.6.4.5
|
|
<a href="#text-queries-results-q5">Q5</a><br />
|
|
    1.7 <a href="#ns">Use Case "NS" -
|
|
Queries Using Namespaces</a><br />
|
|
        1.7.1 <a href=
|
|
"#ns-description">Description</a><br />
|
|
        1.7.2 <a href=
|
|
"#ns-dtd">Document Type Definition (DTD)</a><br />
|
|
        1.7.3 <a href=
|
|
"#ns-data">Sample Data</a><br />
|
|
        1.7.4 <a href=
|
|
"#ns-queries-results">Queries and Results</a><br />
|
|
            1.7.4.1
|
|
<a href="#ns-queries-results-q1">Q1</a><br />
|
|
            1.7.4.2
|
|
<a href="#ns-queries-results-q2">Q2</a><br />
|
|
            1.7.4.3
|
|
<a href="#ns-queries-results-q3">Q3</a><br />
|
|
            1.7.4.4
|
|
<a href="#ns-queries-results-q4">Q4</a><br />
|
|
            1.7.4.5
|
|
<a href="#ns-queries-results-q5">Q5</a><br />
|
|
            1.7.4.6
|
|
<a href="#ns-queries-results-q6">Q6</a><br />
|
|
            1.7.4.7
|
|
<a href="#ns-queries-results-q7">Q7</a><br />
|
|
            1.7.4.8
|
|
<a href="#ns-queries-results-q8">Q8</a><br />
|
|
    1.8 <a href="#parts">Use Case "PARTS" -
|
|
Recursive Parts Explosion</a><br />
|
|
        1.8.1 <a href=
|
|
"#parts-description">Description</a><br />
|
|
        1.8.2 <a href=
|
|
"#parts-dtd">Document Type Definitions (DTD)</a><br />
|
|
        1.8.3 <a href=
|
|
"#parts-data">Sample Data</a><br />
|
|
        1.8.4 <a href=
|
|
"#parts-queries-results">Queries and Results</a><br />
|
|
            1.8.4.1
|
|
<a href="#parts-queries-results-q1">Q1</a><br />
|
|
    1.9 <a href="#strong">Use Case "STRONG"
|
|
- queries that exploit strongly typed data</a><br />
|
|
        1.9.1 <a href=
|
|
"#strong-description">Description</a><br />
|
|
        1.9.2 <a href=
|
|
"#strong-schema">Schema</a><br />
|
|
        1.9.3 <a href=
|
|
"#strong-data">Sample Data</a><br />
|
|
        1.9.4 <a href=
|
|
"#strong-queries-results">Queries</a><br />
|
|
            1.9.4.1
|
|
<a href="#strong-queries-results-q1">Q1</a><br />
|
|
            1.9.4.2
|
|
<a href="#strong-queries-results-q2">Q2</a><br />
|
|
            1.9.4.3
|
|
<a href="#strong-queries-results-q3">Q3</a><br />
|
|
            1.9.4.4
|
|
<a href="#strong-queries-results-q4">Q4</a><br />
|
|
            1.9.4.5
|
|
<a href="#strong-queries-results-q5">Q5</a><br />
|
|
            1.9.4.6
|
|
<a href="#strong-queries-results-q6">Q6</a><br />
|
|
            1.9.4.7
|
|
<a href="#strong-queries-results-q7">Q7</a><br />
|
|
            1.9.4.8
|
|
<a href="#strong-queries-results-q8">Q8</a><br />
|
|
            1.9.4.9
|
|
<a href="#strong-queries-results-q9">Q9</a><br />
|
|
            1.9.4.10
|
|
<a href="#strong-queries-results-q10">Q10</a><br />
|
|
            1.9.4.11
|
|
<a href="#strong-queries-results-q11">Q11</a><br />
|
|
            1.9.4.12
|
|
<a href="#strong-queries-results-q12">Q12</a><br /></p>
|
|
|
|
<h3><a id="appendices" name="appendices"></a>Appendices</h3>
|
|
|
|
<p class="toc">A <a href=
|
|
"#acknowledgements">Acknowledgements</a><br />
|
|
B <a href="#ChangeLog">Change Log</a> (Non-Normative)<br />
|
|
    B.1 <a href="#id-2006-05-08">8 May
|
|
2006</a><br />
|
|
    B.2 <a href="#id-2005-08-31">31 Aug
|
|
2005</a><br />
|
|
    B.3 <a href="#id-2005-07-11">11 July
|
|
2005</a><br />
|
|
    B.4 <a href="#id-2005-04-04">04 April
|
|
2005</a><br />
|
|
    B.5 <a href="#id-2005-01-30">30 Jan
|
|
2005</a><br />
|
|
C <a href="#references">References</a>
|
|
(Non-Normative)<br /></p>
|
|
</div>
|
|
<hr />
|
|
|
|
<div class="body">
|
|
<div class="div1">
|
|
<h2><a id="ucforxq" name="ucforxq"></a>1 Use Cases for XML
|
|
Queries</h2>
|
|
|
|
<p>The use cases listed below were created by the XML Query
|
|
Working Group to illustrate important applications for an XML
|
|
query language. Each use case is focused on a specific
|
|
application area, and contains a Document Type Definition
|
|
(DTD) and example input data. Each use case specifies a set
|
|
of queries that might be applied to the input data, and the
|
|
expected results for each query. Since the English
|
|
description of each query is concise, the expected results
|
|
form an important part of the definition of each query,
|
|
specifying the expected output format. These use cases were
|
|
originally published as part of the <a href=
|
|
"#xquery-requirements">[XQuery Requirements]</a> document,
|
|
without solutions in concrete query languages. Now it is
|
|
being republished with solutions for <a href=
|
|
"#xquery">[XQuery]</a>. These use cases are also being used
|
|
by the <a href="http://www.w3.org/XML/Group/xquery-test/">W3C
|
|
XML Query Testing Task Force</a>.</p>
|
|
|
|
<p>The input environment for each use case is stated in its
|
|
Document Type Definition (DTD) section. All of these use
|
|
cases assume that input is provided in the form of one or
|
|
more documents with specific names. For instance, the authors
|
|
in a document may be accessed with expressions like this:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
doc("http://bstore1.example.com/bib.xml")//author
|
|
</pre>
|
|
</div>
|
|
|
|
<p>Some implementations of XQuery bind input to external
|
|
variables. If the environment has bound the external variable
|
|
$b to the same document used in the above query, this
|
|
expression would return the same set of authors:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
$b//author
|
|
</pre>
|
|
</div>
|
|
|
|
<p>Some implementations of XQuery predefine a single 'context
|
|
item', which is available at the root level of a query, and
|
|
which is used to resolve paths that begin with a leading
|
|
slash. In such an implementation, if the context item is
|
|
bound to document node of the same well-formed document used
|
|
in the previous examples, this expression would return the
|
|
same set of authors:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
//author
|
|
</pre>
|
|
</div>
|
|
|
|
<p>Previous versions of this document accessed implicit
|
|
documents using the <code>input()</code> function, which no
|
|
longer exists. The <code>input()</code> function had similar
|
|
functionality to a predefined context item, except that it
|
|
could be bound to a sequence of nodes, whereas the context
|
|
item may only be bound to a single node. The use cases that
|
|
used <code>input()</code> have been rewritten to use explicit
|
|
file names.</p>
|
|
|
|
<p>Several implementors have asked that we make the queries
|
|
from these use cases available in a separate file to make it
|
|
easier for them to test their parsers. These queries may be
|
|
found in <a href="#UseCaseQueries">[Use Case Sample
|
|
Queries]</a>. Also, the queries from the XQuery specification
|
|
itself have been made available in <a href=
|
|
"#XQueryQueries">[XQuery Sample Queries]</a>.</p>
|
|
|
|
<p>To make output more readable, the output of queries has
|
|
been formatted using whitespace which may not be returned by
|
|
a query processor. This whitespace should not be considered
|
|
normative for the correctness of results.</p>
|
|
|
|
<p>These queries were tested with a dynamic implementation of
|
|
XQuery. Some queries may require additional type declarations
|
|
to be used with an implementation that implements the Static
|
|
Typing feature.</p>
|
|
|
|
<div class="div2">
|
|
<h3><a id="xmp" name="xmp"></a>1.1 Use Case "XMP":
|
|
Experiences and Exemplars</h3>
|
|
|
|
<p>This use case contains several example queries that
|
|
illustrate requirements gathered from the database and
|
|
document communities.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-dtd" name="xmp-dtd"></a>1.1.1 Document
|
|
Type Definitions (DTD)</h4>
|
|
|
|
<p>Most of the example queries in this use case are based
|
|
on a bibliography document named
|
|
"http://bstore1.example.com/bib.xml" with the following
|
|
DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT bib (book* )>
|
|
<!ELEMENT book (title, (author+ | editor+ ), publisher, price )>
|
|
<!ATTLIST book year CDATA #REQUIRED >
|
|
<!ELEMENT author (last, first )>
|
|
<!ELEMENT editor (last, first, affiliation )>
|
|
<!ELEMENT title (#PCDATA )>
|
|
<!ELEMENT last (#PCDATA )>
|
|
<!ELEMENT first (#PCDATA )>
|
|
<!ELEMENT affiliation (#PCDATA )>
|
|
<!ELEMENT publisher (#PCDATA )>
|
|
<!ELEMENT price (#PCDATA )>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-data" name="xmp-data"></a>1.1.2 Sample
|
|
Data</h4>
|
|
|
|
<p>Here is the data found at
|
|
"bstore1.example.com/bib.xml":</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<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>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-dtd-q5" name="xmp-dtd-q5"></a>1.1.3 DTD
|
|
for Q5</h4>
|
|
|
|
<p>Q5 also uses information on book reviews and prices
|
|
from a separate data source named
|
|
"http://bstore2.example.com/reviews.xml" with the
|
|
following DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT reviews (entry*)>
|
|
<!ELEMENT entry (title, price, review)>
|
|
<!ELEMENT title (#PCDATA)>
|
|
<!ELEMENT price (#PCDATA)>
|
|
<!ELEMENT review (#PCDATA)>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-data-q5" name="xmp-data-q5"></a>1.1.4
|
|
Sample Data for Q5</h4>
|
|
|
|
<p>Here are the contents of
|
|
"http://bstore2.example.com/reviews.xml":</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<reviews>
|
|
<entry>
|
|
<title>Data on the Web</title>
|
|
<price>34.95</price>
|
|
<review>
|
|
A very good discussion of semi-structured database
|
|
systems and XML.
|
|
</review>
|
|
</entry>
|
|
<entry>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<price>65.95</price>
|
|
<review>
|
|
A clear and detailed discussion of UNIX programming.
|
|
</review>
|
|
</entry>
|
|
<entry>
|
|
<title>TCP/IP Illustrated</title>
|
|
<price>65.95</price>
|
|
<review>
|
|
One of the best books on TCP/IP.
|
|
</review>
|
|
</entry>
|
|
</reviews>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-dtd-q9" name="xmp-dtd-q9"></a>1.1.5 DTD
|
|
for Q9</h4>
|
|
|
|
<p>Q9 uses an input document named "books.xml", with the
|
|
following DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT chapter (title, section*)>
|
|
<!ELEMENT section (title, section*)>
|
|
<!ELEMENT title (#PCDATA)>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-data-q9" name="xmp-data-q9"></a>1.1.6 Data
|
|
for Q9</h4>
|
|
|
|
<p>Here are the contents of books.xml:</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<chapter>
|
|
<title>Data Model</title>
|
|
<section>
|
|
<title>Syntax For Data Model</title>
|
|
</section>
|
|
<section>
|
|
<title>XML</title>
|
|
<section>
|
|
<title>Basic Syntax</title>
|
|
</section>
|
|
<section>
|
|
<title>XML and Semistructured Data</title>
|
|
</section>
|
|
</section>
|
|
</chapter>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-dtd-q10" name="xmp-dtd-q10"></a>1.1.7 DTD
|
|
for Q10</h4>
|
|
|
|
<p>Q10 uses an input document named "prices.xml", with
|
|
the following DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT prices (book*)>
|
|
<!ELEMENT book (title, source, price)>
|
|
<!ELEMENT title (#PCDATA)>
|
|
<!ELEMENT source (#PCDATA)>
|
|
<!ELEMENT price (#PCDATA)>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-data-q10" name="xmp-data-q10"></a>1.1.8
|
|
Data for Q10</h4>
|
|
|
|
<p>Here are the contents of prices.xml:</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<prices>
|
|
<book>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<source>bstore2.example.com</source>
|
|
<price>65.95</price>
|
|
</book>
|
|
<book>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<source>bstore1.example.com</source>
|
|
<price>65.95</price>
|
|
</book>
|
|
<book>
|
|
<title>TCP/IP Illustrated</title>
|
|
<source>bstore2.example.com</source>
|
|
<price>65.95</price>
|
|
</book>
|
|
<book>
|
|
<title>TCP/IP Illustrated</title>
|
|
<source>bstore1.example.com</source>
|
|
<price>65.95</price>
|
|
</book>
|
|
<book>
|
|
<title>Data on the Web</title>
|
|
<source>bstore2.example.com</source>
|
|
<price>34.95</price>
|
|
</book>
|
|
<book>
|
|
<title>Data on the Web</title>
|
|
<source>bstore1.example.com</source>
|
|
<price>39.95</price>
|
|
</book>
|
|
</prices>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="xmp-queries-results" name=
|
|
"xmp-queries-results"></a>1.1.9 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q1" name=
|
|
"xmp-queries-results-q1"></a>1.1.9.1 Q1</h5>
|
|
|
|
<p>List books published by Addison-Wesley after 1991,
|
|
including their year and title.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<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>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
<book year="1994">
|
|
<title>TCP/IP Illustrated</title>
|
|
</book>
|
|
<book year="1992">
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
</book>
|
|
</bib>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q2" name=
|
|
"xmp-queries-results-q2"></a>1.1.9.2 Q2</h5>
|
|
|
|
<p>Create a flat list of all the title-author pairs,
|
|
with each pair enclosed in a "result" element.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")/bib/book,
|
|
$t in $b/title,
|
|
$a in $b/author
|
|
return
|
|
<result>
|
|
{ $t }
|
|
{ $a }
|
|
</result>
|
|
}
|
|
</results>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
<result>
|
|
<title>TCP/IP Illustrated</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<title>Data on the Web</title>
|
|
<author>
|
|
<last>Abiteboul</last>
|
|
<first>Serge</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<title>Data on the Web</title>
|
|
<author>
|
|
<last>Buneman</last>
|
|
<first>Peter</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<title>Data on the Web</title>
|
|
<author>
|
|
<last>Suciu</last>
|
|
<first>Dan</first>
|
|
</author>
|
|
</result>
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q3" name=
|
|
"xmp-queries-results-q3"></a>1.1.9.3 Q3</h5>
|
|
|
|
<p>For each book in the bibliography, list the title
|
|
and authors, grouped inside a "result" element.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")/bib/book
|
|
return
|
|
<result>
|
|
{ $b/title }
|
|
{ $b/author }
|
|
</result>
|
|
}
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
<result>
|
|
<title>TCP/IP Illustrated</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</result>
|
|
<result>
|
|
<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>
|
|
</result>
|
|
<result>
|
|
<title>The Economics of Technology and Content for Digital TV</title>
|
|
</result>
|
|
</results>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q4" name=
|
|
"xmp-queries-results-q4"></a>1.1.9.4 Q4</h5>
|
|
|
|
<p>For each author in the bibliography, list the
|
|
author's name and the titles of all books by that
|
|
author, grouped inside a "result" element.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
{
|
|
let $a := doc("http://bstore1.example.com/bib/bib.xml")//author
|
|
for $last in distinct-values($a/last),
|
|
$first in distinct-values($a[last=$last]/first)
|
|
order by $last, $first
|
|
return
|
|
<result>
|
|
<author>
|
|
<last>{ $last }</last>
|
|
<first>{ $first }</first>
|
|
</author>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")/bib/book
|
|
where some $ba in $b/author
|
|
satisfies ($ba/last = $last and $ba/first=$first)
|
|
return $b/title
|
|
}
|
|
</result>
|
|
}
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The order in which values are returned by
|
|
distinct-values() is undefined. The distinct-values()
|
|
function returns atomic values, extracting the names
|
|
from the elements.</p>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
<result>
|
|
<author>
|
|
<last>Abiteboul</last>
|
|
<first>Serge</first>
|
|
</author>
|
|
<title>Data on the Web</title>
|
|
</result>
|
|
<result>
|
|
<author>
|
|
<last>Buneman</last>
|
|
<first>Peter</first>
|
|
</author>
|
|
<title>Data on the Web</title>
|
|
</result>
|
|
<result>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
<title>TCP/IP Illustrated</title>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
</result>
|
|
<result>
|
|
<author>
|
|
<last>Suciu</last>
|
|
<first>Dan</first>
|
|
</author>
|
|
<title>Data on the Web</title>
|
|
</result>
|
|
</results>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q5" name=
|
|
"xmp-queries-results-q5"></a>1.1.9.5 Q5</h5>
|
|
|
|
<p>For each book found at both bstore1.example.com and
|
|
bstore2.example.com, list the title of the book and its
|
|
price from each source.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<books-with-prices>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book,
|
|
$a in doc("http://bstore2.example.com/reviews.xml")//entry
|
|
where $b/title = $a/title
|
|
return
|
|
<book-with-prices>
|
|
{ $b/title }
|
|
<price-bstore2>{ $a/price/text() }</price-bstore2>
|
|
<price-bstore1>{ $b/price/text() }</price-bstore1>
|
|
</book-with-prices>
|
|
}
|
|
</books-with-prices>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<books-with-prices>
|
|
<book-with-prices>
|
|
<title>TCP/IP Illustrated</title>
|
|
<price-bstore2>65.95</price-bstore2>
|
|
<price-bstore1>65.95</price-bstore1>
|
|
</book-with-prices>
|
|
<book-with-prices>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<price-bstore2>65.95</price-bstore2>
|
|
<price-bstore1>65.95</price-bstore1>
|
|
</book-with-prices>
|
|
<book-with-prices>
|
|
<title>Data on the Web</title>
|
|
<price-bstore2>34.95</price-bstore2>
|
|
<price-bstore1>39.95</price-bstore1>
|
|
</book-with-prices>
|
|
</books-with-prices>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q6" name=
|
|
"xmp-queries-results-q6"></a>1.1.9.6 Q6</h5>
|
|
|
|
<p>For each book that has at least one author, list the
|
|
title and first two authors, and an empty "et-al"
|
|
element if the book has additional authors.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book
|
|
where count($b/author) > 0
|
|
return
|
|
<book>
|
|
{ $b/title }
|
|
{
|
|
for $a in $b/author[position()<=2]
|
|
return $a
|
|
}
|
|
{
|
|
if (count($b/author) > 2)
|
|
then <et-al/>
|
|
else ()
|
|
}
|
|
</book>
|
|
}
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
<book>
|
|
<title>TCP/IP Illustrated</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</book>
|
|
<book>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</book>
|
|
<book>
|
|
<title>Data on the Web</title>
|
|
<author>
|
|
<last>Abiteboul</last>
|
|
<first>Serge</first>
|
|
</author>
|
|
<author>
|
|
<last>Buneman</last>
|
|
<first>Peter</first>
|
|
</author>
|
|
<et-al/>
|
|
</book>
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q7" name=
|
|
"xmp-queries-results-q7"></a>1.1.9.7 Q7</h5>
|
|
|
|
<p>List the titles and years of all books published by
|
|
Addison-Wesley after 1991, in alphabetic order.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book
|
|
where $b/publisher = "Addison-Wesley" and $b/@year > 1991
|
|
order by $b/title
|
|
return
|
|
<book>
|
|
{ $b/@year }
|
|
{ $b/title }
|
|
</book>
|
|
}
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
<book year="1992">
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
</book>
|
|
<book year="1994">
|
|
<title>TCP/IP Illustrated</title>
|
|
</book>
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q8" name=
|
|
"xmp-queries-results-q8"></a>1.1.9.8 Q8</h5>
|
|
|
|
<p>Find books in which the name of some element ends
|
|
with the string "or" and the same element contains the
|
|
string "Suciu" somewhere in its content. For each such
|
|
book, return the title and the qualifying element.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book
|
|
let $e := $b/*[contains(string(.), "Suciu")
|
|
and ends-with(local-name(.), "or")]
|
|
where exists($e)
|
|
return
|
|
<book>
|
|
{ $b/title }
|
|
{ $e }
|
|
</book>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In the above solution, string(), local-name() and
|
|
ends-with() are functions defined in the Functions and
|
|
Operators document.</p>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<book>
|
|
<title>Data on the Web</title>
|
|
<author>
|
|
<last>Suciu</last>
|
|
<first>Dan</first>
|
|
</author>
|
|
</book>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q9" name=
|
|
"xmp-queries-results-q9"></a>1.1.9.9 Q9</h5>
|
|
|
|
<p>In the document "books.xml", find all section or
|
|
chapter titles that contain the word "XML", regardless
|
|
of the level of nesting.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
{
|
|
for $t in doc("books.xml")//(chapter | section)/title
|
|
where contains($t/text(), "XML")
|
|
return $t
|
|
}
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
<title>XML</title>
|
|
<title>XML and Semistructured Data</title>
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q10" name=
|
|
"xmp-queries-results-q10"></a>1.1.9.10 Q10</h5>
|
|
|
|
<p>In the document "prices.xml", find the minimum price
|
|
for each book, in the form of a "minprice" element with
|
|
the book title as its title attribute.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
{
|
|
let $doc := doc("prices.xml")
|
|
for $t in distinct-values($doc//book/title)
|
|
let $p := $doc//book[title = $t]/price
|
|
return
|
|
<minprice title="{ $t }">
|
|
<price>{ min($p) }</price>
|
|
</minprice>
|
|
}
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<results>
|
|
<minprice title="Advanced Programming in the Unix environment">
|
|
<price>65.95</price>
|
|
</minprice>
|
|
<minprice title="TCP/IP Illustrated">
|
|
<price>65.95</price>
|
|
</minprice>
|
|
<minprice title="Data on the Web">
|
|
<price>34.95</price>
|
|
</minprice>
|
|
</results>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q11" name=
|
|
"xmp-queries-results-q11"></a>1.1.9.11 Q11</h5>
|
|
|
|
<p>For each book with an author, return the book with
|
|
its title and authors. For each book with an editor,
|
|
return a reference with the book title and the editor's
|
|
affiliation.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book[author]
|
|
return
|
|
<book>
|
|
{ $b/title }
|
|
{ $b/author }
|
|
</book>
|
|
}
|
|
{
|
|
for $b in doc("http://bstore1.example.com/bib.xml")//book[editor]
|
|
return
|
|
<reference>
|
|
{ $b/title }
|
|
{$b/editor/affiliation}
|
|
</reference>
|
|
}
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
<book>
|
|
<title>TCP/IP Illustrated</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</book>
|
|
<book>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
<author>
|
|
<last>Stevens</last>
|
|
<first>W.</first>
|
|
</author>
|
|
</book>
|
|
<book>
|
|
<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>
|
|
</book>
|
|
<reference>
|
|
<title>The Economics of Technology and Content for Digital TV</title>
|
|
<affiliation>CITI</affiliation>
|
|
</reference>
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="xmp-queries-results-q12" name=
|
|
"xmp-queries-results-q12"></a>1.1.9.12 Q12</h5>
|
|
|
|
<p>Find pairs of books that have different titles but
|
|
the same set of authors (possibly in a different
|
|
order).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
{
|
|
for $book1 in doc("http://bstore1.example.com/bib.xml")//book,
|
|
$book2 in doc("http://bstore1.example.com/bib.xml")//book
|
|
let $aut1 := for $a in $book1/author
|
|
order by $a/last, $a/first
|
|
return $a
|
|
let $aut2 := for $a in $book2/author
|
|
order by $a/last, $a/first
|
|
return $a
|
|
where $book1 << $book2
|
|
and not($book1/title = $book2/title)
|
|
and deep-equal($aut1, $aut2)
|
|
return
|
|
<book-pair>
|
|
{ $book1/title }
|
|
{ $book2/title }
|
|
</book-pair>
|
|
}
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<bib>
|
|
<book-pair>
|
|
<title>TCP/IP Illustrated</title>
|
|
<title>Advanced Programming in the Unix environment</title>
|
|
</book-pair>
|
|
</bib>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The above solution uses a function, deep-equal(),
|
|
which compares sequences. Two sequences are equal if
|
|
all items in corresponding positions in the two
|
|
sequences are equal - if the sequences are node
|
|
sequences, the values of the nodes are used for
|
|
comparison.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="tree" name="tree"></a>1.2 Use Case "TREE":
|
|
Queries that preserve hierarchy</h3>
|
|
|
|
<p>Some XML document-types have a very flexible structure
|
|
in which text is mixed with elements and many elements are
|
|
optional. These document-types show a wide variation in
|
|
structure from one document to another. In documents of
|
|
these types, the ways in which elements are ordered and
|
|
nested are usually quite important.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="tree-description" name=
|
|
"tree-description"></a>1.2.1 Description</h4>
|
|
|
|
<p>An XML query language should have the ability to
|
|
extract elements from documents while preserving their
|
|
original hierarchy. This Use Case illustrates this
|
|
requirement by means of a flexible document type named
|
|
Book.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="tree-dtd" name="tree-dtd"></a>1.2.2 Document
|
|
Type Definition (DTD)</h4>
|
|
|
|
<p>This use case is based on an input document named
|
|
"book.xml". The DTD for this schema is found in a file
|
|
called "book.dtd":</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT book (title, author+, section+)>
|
|
<!ELEMENT title (#PCDATA)>
|
|
<!ELEMENT author (#PCDATA)>
|
|
<!ELEMENT section (title, (p | figure | section)* )>
|
|
<!ATTLIST section
|
|
id ID #IMPLIED
|
|
difficulty CDATA #IMPLIED>
|
|
<!ELEMENT p (#PCDATA)>
|
|
<!ELEMENT figure (title, image)>
|
|
<!ATTLIST figure
|
|
width CDATA #REQUIRED
|
|
height CDATA #REQUIRED >
|
|
<!ELEMENT image EMPTY>
|
|
<!ATTLIST image
|
|
source CDATA #REQUIRED >
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="tree-data" name="tree-data"></a>1.2.3 Sample
|
|
Data</h4>
|
|
|
|
<p>The queries in this use case are based on the
|
|
following sample data.</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0"?>
|
|
<!DOCTYPE book SYSTEM "book.dtd">
|
|
<book>
|
|
<title>Data on the Web</title>
|
|
<author>Serge Abiteboul</author>
|
|
<author>Peter Buneman</author>
|
|
<author>Dan Suciu</author>
|
|
<section id="intro" difficulty="easy" >
|
|
<title>Introduction</title>
|
|
<p>Text ... </p>
|
|
<section>
|
|
<title>Audience</title>
|
|
<p>Text ... </p>
|
|
</section>
|
|
<section>
|
|
<title>Web Data and the Two Cultures</title>
|
|
<p>Text ... </p>
|
|
<figure height="400" width="400">
|
|
<title>Traditional client/server architecture</title>
|
|
<image source="csarch.gif"/>
|
|
</figure>
|
|
<p>Text ... </p>
|
|
</section>
|
|
</section>
|
|
<section id="syntax" difficulty="medium" >
|
|
<title>A Syntax For Data</title>
|
|
<p>Text ... </p>
|
|
<figure height="200" width="500">
|
|
<title>Graph representations of structures</title>
|
|
<image source="graphs.gif"/>
|
|
</figure>
|
|
<p>Text ... </p>
|
|
<section>
|
|
<title>Base Types</title>
|
|
<p>Text ... </p>
|
|
</section>
|
|
<section>
|
|
<title>Representing Relational Databases</title>
|
|
<p>Text ... </p>
|
|
<figure height="250" width="400">
|
|
<title>Examples of Relations</title>
|
|
<image source="relations.gif"/>
|
|
</figure>
|
|
</section>
|
|
<section>
|
|
<title>Representing Object Databases</title>
|
|
<p>Text ... </p>
|
|
</section>
|
|
</section>
|
|
</book>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="tree-queries-results" name=
|
|
"tree-queries-results"></a>1.2.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q1" name=
|
|
"tree-queries-results-q1"></a>1.2.4.1 Q1</h5>
|
|
|
|
<p>Prepare a (nested) table of contents for Book1,
|
|
listing all the sections and their titles. Preserve the
|
|
original attributes of each <section> element, if
|
|
any.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:toc($book-or-section as element()) as element()*
|
|
{
|
|
for $section in $book-or-section/section
|
|
return
|
|
<section>
|
|
{ $section/@* , $section/title , local:toc($section) }
|
|
</section>
|
|
};
|
|
|
|
<toc>
|
|
{
|
|
for $s in doc("book.xml")/book return local:toc($s)
|
|
}
|
|
</toc>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<toc>
|
|
<section id="intro" difficulty="easy">
|
|
<title>Introduction</title>
|
|
<section>
|
|
<title>Audience</title>
|
|
</section>
|
|
<section>
|
|
<title>Web Data and the Two Cultures</title>
|
|
</section>
|
|
</section>
|
|
<section id="syntax" difficulty="medium">
|
|
<title>A Syntax For Data</title>
|
|
<section>
|
|
<title>Base Types</title>
|
|
</section>
|
|
<section>
|
|
<title>Representing Relational Databases</title>
|
|
</section>
|
|
<section>
|
|
<title>Representing Object Databases</title>
|
|
</section>
|
|
</section>
|
|
</toc>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q2" name=
|
|
"tree-queries-results-q2"></a>1.2.4.2 Q2</h5>
|
|
|
|
<p>Prepare a (flat) figure list for Book1, listing all
|
|
the figures and their titles. Preserve the original
|
|
attributes of each <figure> element, if any.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<figlist>
|
|
{
|
|
for $f in doc("book.xml")//figure
|
|
return
|
|
<figure>
|
|
{ $f/@* }
|
|
{ $f/title }
|
|
</figure>
|
|
}
|
|
</figlist>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<figlist>
|
|
<figure height="400" width="400">
|
|
<title>Traditional client/server architecture</title>
|
|
</figure>
|
|
<figure height="200" width="500">
|
|
<title>Graph representations of structures</title>
|
|
</figure>
|
|
<figure height="250" width ="400">
|
|
<title>Examples of Relations</title>
|
|
</figure>
|
|
</figlist>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q3" name=
|
|
"tree-queries-results-q3"></a>1.2.4.3 Q3</h5>
|
|
|
|
<p>How many sections are in Book1, and how many
|
|
figures?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<section_count>{ count(doc("book.xml")//section) }</section_count>,
|
|
<figure_count>{ count(doc("book.xml")//figure) }</figure_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<section_count>7</section_count>
|
|
<figure_count>3</figure_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q4" name=
|
|
"tree-queries-results-q4"></a>1.2.4.4 Q4</h5>
|
|
|
|
<p>How many top-level sections are in Book1?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<top_section_count>
|
|
{
|
|
count(doc("book.xml")/book/section)
|
|
}
|
|
</top_section_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<top_section_count>2</top_section_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q5" name=
|
|
"tree-queries-results-q5"></a>1.2.4.5 Q5</h5>
|
|
|
|
<p>Make a flat list of the section elements in Book1.
|
|
In place of its original attributes, each section
|
|
element should have two attributes, containing the
|
|
title of the section and the number of figures
|
|
immediately contained in the section.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<section_list>
|
|
{
|
|
for $s in doc("book.xml")//section
|
|
let $f := $s/figure
|
|
return
|
|
<section title="{ $s/title/text() }" figcount="{ count($f) }"/>
|
|
}
|
|
</section_list>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<section_list>
|
|
<section title="Introduction" figcount="0"/>
|
|
<section title="Audience" figcount="0"/>
|
|
<section title="Web Data and the Two Cultures" figcount="1"/>
|
|
<section title="A Syntax For Data" figcount="1"/>
|
|
<section title="Base Types" figcount="0"/>
|
|
<section title="Representing Relational Databases" figcount="1"/>
|
|
<section title="Representing Object Databases" figcount="0"/>
|
|
</section_list>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="tree-queries-results-q6" name=
|
|
"tree-queries-results-q6"></a>1.2.4.6 Q6</h5>
|
|
|
|
<p>Make a nested list of the section elements in Book1,
|
|
preserving their original attributes and hierarchy.
|
|
Inside each section element, include the title of the
|
|
section and an element that includes the number of
|
|
figures immediately contained in the section.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:section-summary($book-or-section as element()*)
|
|
as element()*
|
|
{
|
|
for $section in $book-or-section
|
|
return
|
|
<section>
|
|
{ $section/@* }
|
|
{ $section/title }
|
|
<figcount>
|
|
{ count($section/figure) }
|
|
</figcount>
|
|
{ local:section-summary($section/section) }
|
|
</section>
|
|
};
|
|
|
|
<toc>
|
|
{
|
|
for $s in doc("book.xml")/book/section
|
|
return local:section-summary($s)
|
|
}
|
|
</toc>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<table border="1" summary="Editorial note">
|
|
<tr>
|
|
<td width="50%" valign="top" align="left">
|
|
<b>Editorial note</b></td>
|
|
|
|
<td width="50%" valign="top" align="right">
|
|
 </td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td valign="top" align="left" colspan="2">This
|
|
solution was provided by Michael Wenger, a student
|
|
at the University of Würzburg.</td>
|
|
</tr>
|
|
</table>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<toc>
|
|
<section id="intro" difficulty="easy">
|
|
<title>Introduction</title>
|
|
<figcount>0</figcount>
|
|
<section>
|
|
<title>Audience</title>
|
|
<figcount>0</figcount>
|
|
</section>
|
|
<section>
|
|
<title>Web Data and the Two Cultures</title>
|
|
<figcount>1</figcount>
|
|
</section>
|
|
</section>
|
|
<section id="syntax" difficulty="medium">
|
|
<title>A Syntax For Data</title>
|
|
<figcount>1</figcount>
|
|
<section>
|
|
<title>Base Types</title>
|
|
<figcount>0</figcount>
|
|
</section>
|
|
<section>
|
|
<title>Representing Relational Databases</title>
|
|
<figcount>1</figcount>
|
|
</section>
|
|
<section>
|
|
<title>Representing Object Databases</title>
|
|
<figcount>0</figcount>
|
|
</section>
|
|
</section>
|
|
</toc>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="seq" name="seq"></a>1.3 Use Case "SEQ" - Queries
|
|
based on Sequence</h3>
|
|
|
|
<p>This use case illustrates queries based on the sequence
|
|
in which elements appear in a document.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="seq-description" name=
|
|
"seq-description"></a>1.3.1 Description</h4>
|
|
|
|
<p>Although sequence is not significant in most
|
|
traditional database systems or object systems, it can be
|
|
quite significant in structured documents. This use case
|
|
presents a series of queries based on a medical
|
|
report.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="seq-dtd" name="seq-dtd"></a>1.3.2 Document
|
|
Type Definition (DTD)</h4>
|
|
|
|
<p>This use case is based on a medical report using the
|
|
HL7 Patient Record Architecture. We simplify the DTD in
|
|
this example, using only what is needed to understand the
|
|
queries.</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!DOCTYPE report [
|
|
<!ELEMENT report (section*)>
|
|
<!ELEMENT section (section.title, section.content)>
|
|
<!ELEMENT section.title (#PCDATA )>
|
|
<!ELEMENT section.content (#PCDATA | anesthesia | prep
|
|
| incision | action | observation )*>
|
|
<!ELEMENT anesthesia (#PCDATA)>
|
|
<!ELEMENT prep ( (#PCDATA | action)* )>
|
|
<!ELEMENT incision ( (#PCDATA | geography | instrument)* )>
|
|
<!ELEMENT action ( (#PCDATA | instrument )* )>
|
|
<!ELEMENT observation (#PCDATA)>
|
|
<!ELEMENT geography (#PCDATA)>
|
|
<!ELEMENT instrument (#PCDATA)>
|
|
]>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="seq-data" name="seq-data"></a>1.3.3 Sample
|
|
Data</h4>
|
|
|
|
<p>The queries in this use case are based on the
|
|
following sample data.</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<report>
|
|
<section>
|
|
<section.title>Procedure</section.title>
|
|
<section.content>
|
|
The patient was taken to the operating room where she was placed
|
|
in supine position and
|
|
<anesthesia>induced under general anesthesia.</anesthesia>
|
|
<prep>
|
|
<action>A Foley catheter was placed to decompress the bladder</action>
|
|
and the abdomen was then prepped and draped in sterile fashion.
|
|
</prep>
|
|
<incision>
|
|
A curvilinear incision was made
|
|
<geography>in the midline immediately infraumbilical</geography>
|
|
and the subcutaneous tissue was divided
|
|
<instrument>using electrocautery.</instrument>
|
|
</incision>
|
|
The fascia was identified and
|
|
<action>#2 0 Maxon stay sutures were placed on each side of the midline.
|
|
</action>
|
|
<incision>
|
|
The fascia was divided using
|
|
<instrument>electrocautery</instrument>
|
|
and the peritoneum was entered.
|
|
</incision>
|
|
<observation>The small bowel was identified.</observation>
|
|
and
|
|
<action>
|
|
the
|
|
<instrument>Hasson trocar</instrument>
|
|
was placed under direct visualization.
|
|
</action>
|
|
<action>
|
|
The
|
|
<instrument>trocar</instrument>
|
|
was secured to the fascia using the stay sutures.
|
|
</action>
|
|
</section.content>
|
|
</section>
|
|
</report>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="seq-queries-results" name=
|
|
"seq-queries-results"></a>1.3.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="seq-queries-results-q1" name=
|
|
"seq-queries-results-q1"></a>1.3.4.1 Q1</h5>
|
|
|
|
<p>In the Procedure section of Report1, what
|
|
Instruments were used in the second Incision?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
for $s in doc("report1.xml")//section[section.title = "Procedure"]
|
|
return ($s//incision)[2]/instrument
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<instrument>electrocautery</instrument>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="seq-queries-results-q2" name=
|
|
"seq-queries-results-q2"></a>1.3.4.2 Q2</h5>
|
|
|
|
<p>In the Procedure section of Report1, what are the
|
|
first two Instruments to be used?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
for $s in doc("report1.xml")//section[section.title = "Procedure"]
|
|
return ($s//instrument)[position()<=2]
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<instrument>using electrocautery.</instrument>
|
|
<instrument>electrocautery</instrument>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="seq-queries-results-q3" name=
|
|
"seq-queries-results-q3"></a>1.3.4.3 Q3</h5>
|
|
|
|
<p>In Report1, what Instruments were used in the first
|
|
two Actions after the second Incision?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
let $i2 := (doc("report1.xml")//incision)[2]
|
|
for $a in (doc("report1.xml")//action)[. >> $i2][position()<=2]
|
|
return $a//instrument
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<instrument>Hasson trocar</instrument>
|
|
<instrument>trocar</instrument>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="seq-queries-results-q4" name=
|
|
"seq-queries-results-q4"></a>1.3.4.4 Q4</h5>
|
|
|
|
<p>In Report1, find "Procedure" sections where no
|
|
Anesthesia element occurs before the first Incision</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
for $p in doc("report1.xml")//section[section.title = "Procedure"]
|
|
where not(some $a in $p//anesthesia satisfies
|
|
$a << ($p//incision)[1] )
|
|
return $p
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>(No sections satisfy Q4, thankfully.)</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="seq-queries-results-q5" name=
|
|
"seq-queries-results-q5"></a>1.3.4.5 Q5</h5>
|
|
|
|
<p>In Report1, what happened between the first Incision
|
|
and the second Incision?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:precedes($a as node(), $b as node()) as xs:boolean
|
|
{
|
|
$a << $b
|
|
and
|
|
empty($a//node() intersect $b)
|
|
};
|
|
|
|
|
|
declare function local:follows($a as node(), $b as node()) as xs:boolean
|
|
{
|
|
$a >> $b
|
|
and
|
|
empty($b//node() intersect $a)
|
|
};
|
|
|
|
<critical_sequence>
|
|
{
|
|
let $proc := doc("report1.xml")//section[section.title="Procedure"][1]
|
|
for $n in $proc//node()
|
|
where local:follows($n, ($proc//incision)[1])
|
|
and local:precedes($n, ($proc//incision)[2])
|
|
return $n
|
|
}
|
|
</critical_sequence>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Here is another solution that is perhaps more
|
|
efficient and less readable:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<critical_sequence>
|
|
{
|
|
let $proc := doc("report1.xml")//section[section.title="Procedure"][1],
|
|
$i1 := ($proc//incision)[1],
|
|
$i2 := ($proc//incision)[2]
|
|
for $n in $proc//node() except $i1//node()
|
|
where $n >> $i1 and $n << $i2
|
|
return $n
|
|
}
|
|
</critical_sequence>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<critical_sequence>
|
|
The fascia was identified and
|
|
<action>#2 0 Maxon stay sutures were placed on each side of the midline.
|
|
</action>#2 0 Maxon stay sutures were placed on each side of the midline.
|
|
</critical_sequence>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In the above output, the contents of the critical
|
|
sequence element include a text node, an action
|
|
element, and the text node containing the content of
|
|
the action element. But the serialization we are using
|
|
already shows all descendants of a given node. If $c is
|
|
bound to a sequence of nodes, the following expression
|
|
eliminates members of the sequence that are descendants
|
|
of another node already found in the sequence:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
$c except $c//node()
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In the following solution, the between() function
|
|
takes a sequence of nodes, a starting node, and an
|
|
ending node, and returns the nodes between them:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:between($seq as node()*, $start as node(), $end as node())
|
|
as item()*
|
|
{
|
|
let $nodes :=
|
|
for $n in $seq except $start//node()
|
|
where $n >> $start and $n << $end
|
|
return $n
|
|
return $nodes except $nodes//node()
|
|
};
|
|
|
|
<critical_sequence>
|
|
{
|
|
let $proc := doc("report1.xml")//section[section.title="Procedure"][1],
|
|
$first := ($proc//incision)[1],
|
|
$second:= ($proc//incision)[2]
|
|
return local:between($proc//node(), $first, $second)
|
|
}
|
|
</critical_sequence>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Here is the output from the above query:</p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<critical_sequence>
|
|
The fascia was identified and
|
|
<action>#2 0 Maxon stay sutures were placed on each side of the midline.
|
|
</action>
|
|
</critical_sequence>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="rdb" name="rdb"></a>1.4 Use Case "R" - Access to
|
|
Relational Data</h3>
|
|
|
|
<p>One important use of an XML query language will be to
|
|
access data stored in relational databases. This use case
|
|
describes one possible way in which this access might be
|
|
accomplished.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="rdb-description" name=
|
|
"rdb-description"></a>1.4.1 Description</h4>
|
|
|
|
<p>A relational database system might present a view in
|
|
which each table (relation) takes the form of an XML
|
|
document. One way to represent a database table as an XML
|
|
document is to allow the document element to represent
|
|
the table itself, and each row (tuple) inside the table
|
|
to be represented by a nested element. Inside the
|
|
tuple-elements, each column is in turn represented by a
|
|
nested element. Columns that allow null values are
|
|
represented by optional elements, and a missing element
|
|
denotes a null value.</p>
|
|
|
|
<p>As an example, consider a relational database used by
|
|
an online auction. The auction maintains a USERS table
|
|
containing information on registered users, each
|
|
identified by a unique userid, who can either offer items
|
|
for sale or bid on items. An ITEMS table lists items
|
|
currently or recently for sale, with the userid of the
|
|
user who offered each item. A BIDS table contains all
|
|
bids on record, keyed by the userid of the bidder and the
|
|
item number of the item to which the bid applies.</p>
|
|
|
|
<p>The three tables used by the online auction are below,
|
|
with their column-names indicated in parentheses.</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
USERS ( USERID, NAME, RATING ) ITEMS ( ITEMNO,
|
|
DESCRIPTION, OFFERED_BY, START_DATE, END_DATE,
|
|
RESERVE_PRICE ) BIDS ( USERID, ITEMNO, BID, BID_DATE
|
|
)
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="rdb-dtd" name="rdb-dtd"></a>1.4.2 Document
|
|
Type Definition (DTD)</h4>
|
|
|
|
<p>This use case is based on three separate input
|
|
documents named users.xml, items.xml, and bids.xml. Each
|
|
of the documents represents one of the tables in the
|
|
relational database described above, using the following
|
|
DTDs:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!DOCTYPE users [ <!ELEMENT users
|
|
(user_tuple*)> <!ELEMENT user_tuple
|
|
(userid, name, rating?)> <!ELEMENT userid
|
|
(#PCDATA)> <!ELEMENT name
|
|
(#PCDATA)> <!ELEMENT rating
|
|
(#PCDATA)> ]> <!DOCTYPE items [
|
|
<!ELEMENT items (item_tuple*)>
|
|
<!ELEMENT item_tuple (itemno, description,
|
|
offered_by, start_date?, end_date?, reserve_price?
|
|
)> <!ELEMENT itemno (#PCDATA)>
|
|
<!ELEMENT description (#PCDATA)>
|
|
<!ELEMENT offered_by (#PCDATA)>
|
|
<!ELEMENT start_date (#PCDATA)>
|
|
<!ELEMENT end_date (#PCDATA)>
|
|
<!ELEMENT reserve_price (#PCDATA)>
|
|
]> <!DOCTYPE bids [ <!ELEMENT bids
|
|
(bid_tuple*)> <!ELEMENT bid_tuple (userid,
|
|
itemno, bid, bid_date)> <!ELEMENT userid
|
|
(#PCDATA)> <!ELEMENT itemno
|
|
(#PCDATA)> <!ELEMENT bid (#PCDATA)>
|
|
<!ELEMENT bid_date (#PCDATA)>
|
|
]>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="rdb-data" name="rdb-data"></a>1.4.3 Sample
|
|
Data</h4>
|
|
|
|
<p>Here is an abbreviated set of data showing the XML
|
|
format of the instances:</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<items>
|
|
<item_tuple>
|
|
<itemno>1001</itemno>
|
|
<description>Red Bicycle</description>
|
|
<offered_by>U01</offered_by>
|
|
<start_date>1999-01-05</start_date>
|
|
<end_date>1999-01-20</end_date>
|
|
<reserve_price>40</reserve_price>
|
|
</item_tuple>
|
|
<!-- !!! Snip !!! -->
|
|
|
|
<users>
|
|
<user_tuple>
|
|
<userid>U01</userid>
|
|
<name>Tom Jones</name>
|
|
<rating>B</rating>
|
|
</user_tuple>
|
|
<!-- !!! Snip !!! -->
|
|
|
|
<bids>
|
|
<bid_tuple>
|
|
<userid>U02</userid>
|
|
<itemno>1001</itemno>
|
|
<bid>35</bid>
|
|
<bid_date>1999-01-07</bid_date>
|
|
</bid_tuple>
|
|
<bid_tuple>
|
|
<!-- !!! Snip !!! -->
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The entire data set is represented by the following
|
|
table:</p>
|
|
|
|
<table border="1">
|
|
<caption>
|
|
USERS
|
|
</caption>
|
|
|
|
<thead>
|
|
<tr>
|
|
<td>USERID</td>
|
|
|
|
<td>NAME</td>
|
|
|
|
<td>RATING</td>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<tr>
|
|
<td>U01</td>
|
|
|
|
<td>Tom Jones</td>
|
|
|
|
<td>B</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>Mary Doe</td>
|
|
|
|
<td>A</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U03</td>
|
|
|
|
<td>Dee Linquent</td>
|
|
|
|
<td>D</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>Roger Smith</td>
|
|
|
|
<td>C</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U05</td>
|
|
|
|
<td>Jack Sprat</td>
|
|
|
|
<td>B</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U06</td>
|
|
|
|
<td>Rip Van Winkle</td>
|
|
|
|
<td>B</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<table border="1">
|
|
<caption>
|
|
ITEMS
|
|
</caption>
|
|
|
|
<thead>
|
|
<tr>
|
|
<td>ITEMNO</td>
|
|
|
|
<td>DESCRIPTION</td>
|
|
|
|
<td>OFFERED_BY</td>
|
|
|
|
<td>START_DATE</td>
|
|
|
|
<td>END_DATE</td>
|
|
|
|
<td>RESERVE_PRICE</td>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<tr>
|
|
<td>1001</td>
|
|
|
|
<td>Red Bicycle</td>
|
|
|
|
<td>U01</td>
|
|
|
|
<td>1999-01-05</td>
|
|
|
|
<td>1999-01-20</td>
|
|
|
|
<td>40</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1002</td>
|
|
|
|
<td>Motorcycle</td>
|
|
|
|
<td>U02</td>
|
|
|
|
<td>1999-02-11</td>
|
|
|
|
<td>1999-03-15</td>
|
|
|
|
<td>500</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1003</td>
|
|
|
|
<td>Old Bicycle</td>
|
|
|
|
<td>U02</td>
|
|
|
|
<td>1999-01-10</td>
|
|
|
|
<td>1999-02-20</td>
|
|
|
|
<td>25</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1004</td>
|
|
|
|
<td>Tricycle</td>
|
|
|
|
<td>U01</td>
|
|
|
|
<td>1999-02-25</td>
|
|
|
|
<td>1999-03-08</td>
|
|
|
|
<td>15</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1005</td>
|
|
|
|
<td>Tennis Racket</td>
|
|
|
|
<td>U03</td>
|
|
|
|
<td>1999-03-19</td>
|
|
|
|
<td>1999-04-30</td>
|
|
|
|
<td>20</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1006</td>
|
|
|
|
<td>Helicopter</td>
|
|
|
|
<td>U03</td>
|
|
|
|
<td>1999-05-05</td>
|
|
|
|
<td>1999-05-25</td>
|
|
|
|
<td>50000</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1007</td>
|
|
|
|
<td>Racing Bicycle</td>
|
|
|
|
<td>U04</td>
|
|
|
|
<td>1999-01-20</td>
|
|
|
|
<td>1999-02-20</td>
|
|
|
|
<td>200</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>1008</td>
|
|
|
|
<td>Broken Bicycle</td>
|
|
|
|
<td>U01</td>
|
|
|
|
<td>1999-02-05</td>
|
|
|
|
<td>1999-03-06</td>
|
|
|
|
<td>25</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<table border="1">
|
|
<caption>
|
|
BIDS
|
|
</caption>
|
|
|
|
<thead>
|
|
<tr>
|
|
<td>USERID</td>
|
|
|
|
<td>ITEMNO</td>
|
|
|
|
<td>BID</td>
|
|
|
|
<td>BID_DATE</td>
|
|
</tr>
|
|
</thead>
|
|
|
|
<tbody>
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>1001</td>
|
|
|
|
<td>35</td>
|
|
|
|
<td>1999-01-07</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>1001</td>
|
|
|
|
<td>40</td>
|
|
|
|
<td>1999-01-08</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>1001</td>
|
|
|
|
<td>45</td>
|
|
|
|
<td>1999-01-11</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>1001</td>
|
|
|
|
<td>50</td>
|
|
|
|
<td>1999-01-13</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>1001</td>
|
|
|
|
<td>55</td>
|
|
|
|
<td>1999-01-15</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U01</td>
|
|
|
|
<td>1002</td>
|
|
|
|
<td>400</td>
|
|
|
|
<td>1999-02-14</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>1002</td>
|
|
|
|
<td>600</td>
|
|
|
|
<td>1999-02-16</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U03</td>
|
|
|
|
<td>1002</td>
|
|
|
|
<td>800</td>
|
|
|
|
<td>1999-02-17</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>1002</td>
|
|
|
|
<td>1000</td>
|
|
|
|
<td>1999-02-25</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U02</td>
|
|
|
|
<td>1002</td>
|
|
|
|
<td>1200</td>
|
|
|
|
<td>1999-03-02</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>1003</td>
|
|
|
|
<td>15</td>
|
|
|
|
<td>1999-01-22</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U05</td>
|
|
|
|
<td>1003</td>
|
|
|
|
<td>20</td>
|
|
|
|
<td>1999-02-03</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U01</td>
|
|
|
|
<td>1004</td>
|
|
|
|
<td>40</td>
|
|
|
|
<td>1999-03-05</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U03</td>
|
|
|
|
<td>1007</td>
|
|
|
|
<td>175</td>
|
|
|
|
<td>1999-01-25</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U05</td>
|
|
|
|
<td>1007</td>
|
|
|
|
<td>200</td>
|
|
|
|
<td>1999-02-08</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>U04</td>
|
|
|
|
<td>1007</td>
|
|
|
|
<td>225</td>
|
|
|
|
<td>1999-02-12</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="rdb-queries-results" name=
|
|
"rdb-queries-results"></a>1.4.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q1" name=
|
|
"rdb-queries-results-q1"></a>1.4.4.1 Q1</h5>
|
|
|
|
<p>List the item number and description of all bicycles
|
|
that currently have an auction in progress, ordered by
|
|
item number.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $i in doc("items.xml")//item_tuple
|
|
where $i/start_date <= current-date()
|
|
and $i/end_date >= current-date()
|
|
and contains($i/description, "Bicycle")
|
|
order by $i/itemno
|
|
return
|
|
<item_tuple>
|
|
{ $i/itemno }
|
|
{ $i/description }
|
|
</item_tuple>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="note">
|
|
<p class="prefix"><b>Note:</b></p>
|
|
|
|
<p>This solution assumes that the current date is
|
|
1999-01-31.</p>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<item_tuple>
|
|
<itemno>1003</itemno>
|
|
<description>Old Bicycle</description>
|
|
</item_tuple>
|
|
<item_tuple>
|
|
<itemno>1007</itemno>
|
|
<description>Racing Bicycle</description>
|
|
</item_tuple>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The above query returns an element named
|
|
<code>item_tuple</code>, but its definition does not
|
|
match the definition of item_tuple in the DTD.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q2" name=
|
|
"rdb-queries-results-q2"></a>1.4.4.2 Q2</h5>
|
|
|
|
<p>For all bicycles, list the item number, description,
|
|
and highest bid (if any), ordered by item number.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $i in doc("items.xml")//item_tuple
|
|
let $b := doc("bids.xml")//bid_tuple[itemno = $i/itemno]
|
|
where contains($i/description, "Bicycle")
|
|
order by $i/itemno
|
|
return
|
|
<item_tuple>
|
|
{ $i/itemno }
|
|
{ $i/description }
|
|
<high_bid>{ max($b/bid) }</high_bid>
|
|
</item_tuple>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<item_tuple>
|
|
<itemno>1001</itemno>
|
|
<description>Red Bicycle</description>
|
|
<high_bid>55</high_bid>
|
|
</item_tuple>
|
|
<item_tuple>
|
|
<itemno>1003</itemno>
|
|
<description>Old Bicycle</description>
|
|
<high_bid>20</high_bid>
|
|
</item_tuple>
|
|
<item_tuple>
|
|
<itemno>1007</itemno>
|
|
<description>Racing Bicycle</description>
|
|
<high_bid>225</high_bid>
|
|
</item_tuple>
|
|
<item_tuple>
|
|
<itemno>1008</itemno>
|
|
<description>Broken Bicycle</description>
|
|
<high_bid></high_bid>
|
|
</item_tuple>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q3" name=
|
|
"rdb-queries-results-q3"></a>1.4.4.3 Q3</h5>
|
|
|
|
<p>Find cases where a user with a rating worse
|
|
(alphabetically, greater) than "C" is offering an item
|
|
with a reserve price of more than 1000.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $u in doc("users.xml")//user_tuple
|
|
for $i in doc("items.xml")//item_tuple
|
|
where $u/rating > "C"
|
|
and $i/reserve_price > 1000
|
|
and $i/offered_by = $u/userid
|
|
return
|
|
<warning>
|
|
{ $u/name }
|
|
{ $u/rating }
|
|
{ $i/description }
|
|
{ $i/reserve_price }
|
|
</warning>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<warning>
|
|
<name>Dee Linquent</name>
|
|
<rating>D</rating>
|
|
<description>Helicopter</description>
|
|
<reserve_price>50000</reserve_price>
|
|
</warning>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q4" name=
|
|
"rdb-queries-results-q4"></a>1.4.4.4 Q4</h5>
|
|
|
|
<p>List item numbers and descriptions of items that
|
|
have no bids.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $i in doc("items.xml")//item_tuple
|
|
where empty(doc("bids.xml")//bid_tuple[itemno = $i/itemno])
|
|
return
|
|
<no_bid_item>
|
|
{ $i/itemno }
|
|
{ $i/description }
|
|
</no_bid_item>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<no_bid_item>
|
|
<itemno>1005</itemno>
|
|
<description>Tennis Racket</description>
|
|
</no_bid_item>
|
|
<no_bid_item>
|
|
<itemno>1006</itemno>
|
|
<description>Helicopter</description>
|
|
</no_bid_item>
|
|
<no_bid_item>
|
|
<itemno>1008</itemno>
|
|
<description>Broken Bicycle</description>
|
|
</no_bid_item>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q5" name=
|
|
"rdb-queries-results-q5"></a>1.4.4.5 Q5</h5>
|
|
|
|
<p>For bicycle(s) offered by Tom Jones that have
|
|
received a bid, list the item number, description,
|
|
highest bid, and name of the highest bidder, ordered by
|
|
item number.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $seller in doc("users.xml")//user_tuple,
|
|
$buyer in doc("users.xml")//user_tuple,
|
|
$item in doc("items.xml")//item_tuple,
|
|
$highbid in doc("bids.xml")//bid_tuple
|
|
where $seller/name = "Tom Jones"
|
|
and $seller/userid = $item/offered_by
|
|
and contains($item/description , "Bicycle")
|
|
and $item/itemno = $highbid/itemno
|
|
and $highbid/userid = $buyer/userid
|
|
and $highbid/bid = max(
|
|
doc("bids.xml")//bid_tuple
|
|
[itemno = $item/itemno]/bid
|
|
)
|
|
order by ($item/itemno)
|
|
return
|
|
<jones_bike>
|
|
{ $item/itemno }
|
|
{ $item/description }
|
|
<high_bid>{ $highbid/bid }</high_bid>
|
|
<high_bidder>{ $buyer/name }</high_bidder>
|
|
</jones_bike>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The above query does several joins, and requires the
|
|
results in a particular order. If there were no
|
|
<code>order by</code> clause, results would be reported
|
|
in document order. If you do not care about the order,
|
|
you can use the <code>unordered</code> function to
|
|
inform the query processor that the order of the lists
|
|
in the for clause is not significant, which means that
|
|
the tuples can be generated in any order. This can
|
|
enable better optimization.</p>
|
|
|
|
<p><em>Unordered Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
unordered (
|
|
for $seller in doc("users.xml")//user_tuple,
|
|
$buyer in doc("users.xml")//user_tuple,
|
|
$item in doc("items.xml")//item_tuple,
|
|
$highbid in doc("bids.xml")//bid_tuple
|
|
where $seller/name = "Tom Jones"
|
|
and $seller/userid = $item/offered_by
|
|
and contains($item/description , "Bicycle")
|
|
and $item/itemno = $highbid/itemno
|
|
and $highbid/userid = $buyer/userid
|
|
and $highbid/bid = max(
|
|
doc("bids.xml")//bid_tuple
|
|
[itemno = $item/itemno]/bid
|
|
)
|
|
return
|
|
<jones_bike>
|
|
{ $item/itemno }
|
|
{ $item/description }
|
|
<high_bid>{ $highbid/bid }</high_bid>
|
|
<high_bidder>{ $buyer/name }</high_bidder>
|
|
</jones_bike>
|
|
)
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<jones_bike>
|
|
<itemno>1001</itemno>
|
|
<description>Red Bicycle</description>
|
|
<high_bid>
|
|
<bid>55</bid>
|
|
</high_bid>
|
|
<high_bidder>
|
|
<name>Mary Doe</name>
|
|
</high_bidder>
|
|
</jones_bike>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q6" name=
|
|
"rdb-queries-results-q6"></a>1.4.4.6 Q6</h5>
|
|
|
|
<p>For each item whose highest bid is more than twice
|
|
its reserve price, list the item number, description,
|
|
reserve price, and highest bid.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $item in doc("items.xml")//item_tuple
|
|
let $b := doc("bids.xml")//bid_tuple[itemno = $item/itemno]
|
|
let $z := max($b/bid)
|
|
where $item/reserve_price * 2 < $z
|
|
return
|
|
<successful_item>
|
|
{ $item/itemno }
|
|
{ $item/description }
|
|
{ $item/reserve_price }
|
|
<high_bid>{$z }</high_bid>
|
|
</successful_item>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<successful_item>
|
|
<itemno>1002</itemno>
|
|
<description>Motorcycle</description>
|
|
<reserve_price>500</reserve_price>
|
|
<high_bid>1200</high_bid>
|
|
</successful_item>
|
|
<successful_item>
|
|
<itemno>1004</itemno>
|
|
<description>Tricycle</description>
|
|
<reserve_price>15</reserve_price>
|
|
<high_bid>40</high_bid>
|
|
</successful_item>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q7" name=
|
|
"rdb-queries-results-q7"></a>1.4.4.7 Q7</h5>
|
|
|
|
<p>Find the highest bid ever made for a bicycle or
|
|
tricycle.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
let $allbikes := doc("items.xml")//item_tuple
|
|
[contains(description, "Bicycle")
|
|
or contains(description, "Tricycle")]
|
|
let $bikebids := doc("bids.xml")//bid_tuple[itemno = $allbikes/itemno]
|
|
return
|
|
<high_bid>
|
|
{
|
|
max($bikebids/bid)
|
|
}
|
|
</high_bid>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<high_bid>225</high_bid>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q8" name=
|
|
"rdb-queries-results-q8"></a>1.4.4.8 Q8</h5>
|
|
|
|
<p>How many items were actioned (auction ended) in
|
|
March 1999?</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
let $item := doc("items.xml")//item_tuple
|
|
[end_date >= xs:date("1999-03-01") and end_date <= xs:date("1999-03-31")]
|
|
return
|
|
<item_count>
|
|
{
|
|
count($item)
|
|
}
|
|
</item_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<item_count>3</item_count>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q9" name=
|
|
"rdb-queries-results-q9"></a>1.4.4.9 Q9</h5>
|
|
|
|
<p>List the number of items auctioned each month in
|
|
1999 for which data is available, ordered by month.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
let $end_dates := doc("items.xml")//item_tuple/end_date
|
|
for $m in distinct-values(for $e in $end_dates
|
|
return month-from-date($e))
|
|
let $item := doc("items.xml")
|
|
//item_tuple[year-from-date(end_date) = 1999
|
|
and month-from-date(end_date) = $m]
|
|
order by $m
|
|
return
|
|
<monthly_result>
|
|
<month>{ $m }</month>
|
|
<item_count>{ count($item) }</item_count>
|
|
</monthly_result>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<monthly_result>
|
|
<month>1</month>
|
|
<item_count>1</item_count>
|
|
</monthly_result>
|
|
<monthly_result>
|
|
<month>2</month>
|
|
<item_count>2</item_count>
|
|
</monthly_result>
|
|
<monthly_result>
|
|
<month>3</month>
|
|
<item_count>3</item_count>
|
|
</monthly_result>
|
|
<monthly_result>
|
|
<month>4</month>
|
|
<item_count>1</item_count>
|
|
</monthly_result>
|
|
<monthly_result>
|
|
<month>5</month>
|
|
<item_count>1</item_count>
|
|
</monthly_result>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q10" name=
|
|
"rdb-queries-results-q10"></a>1.4.4.10 Q10</h5>
|
|
|
|
<p>For each item that has received a bid, list the item
|
|
number, the highest bid, and the name of the highest
|
|
bidder, ordered by item number.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $highbid in doc("bids.xml")//bid_tuple,
|
|
$user in doc("users.xml")//user_tuple
|
|
where $user/userid = $highbid/userid
|
|
and $highbid/bid = max(doc("bids.xml")//bid_tuple[itemno=$highbid/itemno]/bid)
|
|
order by $highbid/itemno
|
|
return
|
|
<high_bid>
|
|
{ $highbid/itemno }
|
|
{ $highbid/bid }
|
|
<bidder>{ $user/name/text() }</bidder>
|
|
</high_bid>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<high_bid>
|
|
<itemno>1001</itemno>
|
|
<bid>55</bid>
|
|
<bidder>Mary Doe</bidder>
|
|
</high_bid>
|
|
<high_bid>
|
|
<itemno>1002</itemno>
|
|
<bid>1200</bid>
|
|
<bidder>Mary Doe</bidder>
|
|
</high_bid>
|
|
<high_bid>
|
|
<itemno>1003</itemno>
|
|
<bid>20</bid>
|
|
<bidder>Jack Sprat</bidder>
|
|
</high_bid>
|
|
<high_bid>
|
|
<itemno>1004</itemno>
|
|
<bid>40</bid>
|
|
<bidder>Tom Jones</bidder>
|
|
</high_bid>
|
|
<high_bid>
|
|
<itemno>1007</itemno>
|
|
<bid>225</bid>
|
|
<bidder>Roger Smith</bidder>
|
|
</high_bid>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q11" name=
|
|
"rdb-queries-results-q11"></a>1.4.4.11 Q11</h5>
|
|
|
|
<p>List the item number and description of the item(s)
|
|
that received the highest bid ever recorded, and the
|
|
amount of that bid.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
let $highbid := max(doc("bids.xml")//bid_tuple/bid)
|
|
return
|
|
<result>
|
|
{
|
|
for $item in doc("items.xml")//item_tuple,
|
|
$b in doc("bids.xml")//bid_tuple[itemno = $item/itemno]
|
|
where $b/bid = $highbid
|
|
return
|
|
<expensive_item>
|
|
{ $item/itemno }
|
|
{ $item/description }
|
|
<high_bid>{ $highbid }</high_bid>
|
|
</expensive_item>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<expensive_item>
|
|
<itemno>1002</itemno>
|
|
<description>Motorcycle</description>
|
|
<high_bid>1200</high_bid>
|
|
</expensive_item>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q12" name=
|
|
"rdb-queries-results-q12"></a>1.4.4.12 Q12</h5>
|
|
|
|
<p>List the item number and description of the item(s)
|
|
that received the largest number of bids, and the
|
|
number of bids it (or they) received.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:bid_summary()
|
|
as element()*
|
|
{
|
|
for $i in distinct-values(doc("bids.xml")//itemno)
|
|
let $b := doc("bids.xml")//bid_tuple[itemno = $i]
|
|
return
|
|
<bid_count>
|
|
<itemno>{ $i }</itemno>
|
|
<nbids>{ count($b) }</nbids>
|
|
</bid_count>
|
|
};
|
|
|
|
<result>
|
|
{
|
|
let $bid_counts := local:bid_summary(),
|
|
$maxbids := max($bid_counts/nbids),
|
|
$maxitemnos := $bid_counts[nbids = $maxbids]
|
|
for $item in doc("items.xml")//item_tuple,
|
|
$bc in $bid_counts
|
|
where $bc/nbids = $maxbids and $item/itemno = $bc/itemno
|
|
return
|
|
<popular_item>
|
|
{ $item/itemno }
|
|
{ $item/description }
|
|
<bid_count>{ $bc/nbids/text() }</bid_count>
|
|
</popular_item>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<popular_item>
|
|
<itemno>1001</itemno>
|
|
<description>Red Bicycle</description>
|
|
<bid_count>5</bid_count>
|
|
</popular_item>
|
|
<popular_item>
|
|
<itemno>1002</itemno>
|
|
<description>Motorcycle</description>
|
|
<bid_count>5</bid_count>
|
|
</popular_item>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q13" name=
|
|
"rdb-queries-results-q13"></a>1.4.4.13 Q13</h5>
|
|
|
|
<p>For each user who has placed a bid, give the userid,
|
|
name, number of bids, and average bid, in order by
|
|
userid.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $uid in distinct-values(doc("bids.xml")//userid),
|
|
$u in doc("users.xml")//user_tuple[userid = $uid]
|
|
let $b := doc("bids.xml")//bid_tuple[userid = $uid]
|
|
order by $u/userid
|
|
return
|
|
<bidder>
|
|
{ $u/userid }
|
|
{ $u/name }
|
|
<bidcount>{ count($b) }</bidcount>
|
|
<avgbid>{ avg($b/bid) }</avgbid>
|
|
</bidder>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<bidder>
|
|
<userid>U01</userid>
|
|
<name>Tom Jones</name>
|
|
<bidcount>2</bidcount>
|
|
<avgbid>220</avgbid>
|
|
</bidder>
|
|
<bidder>
|
|
<userid>U02</userid>
|
|
<name>Mary Doe</name>
|
|
<bidcount>5</bidcount>
|
|
<avgbid>387</avgbid>
|
|
</bidder>
|
|
<bidder>
|
|
<userid>U03</userid>
|
|
<name>Dee Linquent</name>
|
|
<bidcount>2</bidcount>
|
|
<avgbid>487.5</avgbid>
|
|
</bidder>
|
|
<bidder>
|
|
<userid>U04</userid>
|
|
<name>Roger Smith</name>
|
|
<bidcount>5</bidcount>
|
|
<avgbid>266</avgbid>
|
|
</bidder>
|
|
<bidder>
|
|
<userid>U05</userid>
|
|
<name>Jack Sprat</name>
|
|
<bidcount>2</bidcount>
|
|
<avgbid>110</avgbid>
|
|
</bidder>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q14" name=
|
|
"rdb-queries-results-q14"></a>1.4.4.14 Q14</h5>
|
|
|
|
<p>List item numbers and average bids for items that
|
|
have received three or more bids, in descending order
|
|
by average bid.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $i in distinct-values(doc("bids.xml")//itemno)
|
|
let $b := doc("bids.xml")//bid_tuple[itemno = $i]
|
|
let $avgbid := avg($b/bid)
|
|
where count($b) >= 3
|
|
order by $avgbid descending
|
|
return
|
|
<popular_item>
|
|
<itemno>{ $i }</itemno>
|
|
<avgbid>{ $avgbid }</avgbid>
|
|
</popular_item>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<popular_item>
|
|
<itemno>1002</itemno>
|
|
<avgbid>800</avgbid>
|
|
</popular_item>
|
|
<popular_item>
|
|
<itemno>1007</itemno>
|
|
<avgbid>200</avgbid>
|
|
</popular_item>
|
|
<popular_item>
|
|
<itemno>1001</itemno>
|
|
<avgbid>45</avgbid>
|
|
</popular_item>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q15" name=
|
|
"rdb-queries-results-q15"></a>1.4.4.15 Q15</h5>
|
|
|
|
<p>List names of users who have placed multiple bids of
|
|
at least $100 each.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $u in doc("users.xml")//user_tuple
|
|
let $b := doc("bids.xml")//bid_tuple[userid=$u/userid and bid>=100]
|
|
where count($b) > 1
|
|
return
|
|
<big_spender>{ $u/name/text() }</big_spender>
|
|
}
|
|
</result>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<big_spender>Mary Doe</big_spender>
|
|
<big_spender>Dee Linquent</big_spender>
|
|
<big_spender>Roger Smith</big_spender>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q16" name=
|
|
"rdb-queries-results-q16"></a>1.4.4.16 Q16</h5>
|
|
|
|
<p>List all registered users in order by userid; for
|
|
each user, include the userid, name, and an indication
|
|
of whether the user is active (has at least one bid on
|
|
record) or inactive (has no bid on record).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $u in doc("users.xml")//user_tuple
|
|
let $b := doc("bids.xml")//bid_tuple[userid = $u/userid]
|
|
order by $u/userid
|
|
return
|
|
<user>
|
|
{ $u/userid }
|
|
{ $u/name }
|
|
{
|
|
if (empty($b))
|
|
then <status>inactive</status>
|
|
else <status>active</status>
|
|
}
|
|
</user>
|
|
}
|
|
</result>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<user>
|
|
<userid>U01</userid>
|
|
<name>Tom Jones</name>
|
|
<status>active</status>
|
|
</user>
|
|
<user>
|
|
<userid>U02</userid>
|
|
<name>Mary Doe</name>
|
|
<status>active</status>
|
|
</user>
|
|
<user>
|
|
<userid>U03</userid>
|
|
<name>Dee Linquent</name>
|
|
<status>active</status>
|
|
</user>
|
|
<user>
|
|
<userid>U04</userid>
|
|
<name>Roger Smith</name>
|
|
<status>active</status>
|
|
</user>
|
|
<user>
|
|
<userid>U05</userid>
|
|
<name>Jack Sprat</name>
|
|
<status>active</status>
|
|
</user>
|
|
<user>
|
|
<userid>U06</userid>
|
|
<name>Rip Van Winkle</name>
|
|
<status>inactive</status>
|
|
</user>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q17" name=
|
|
"rdb-queries-results-q17"></a>1.4.4.17 Q17</h5>
|
|
|
|
<p>List the names of users, if any, who have bid on
|
|
every item.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<frequent_bidder>
|
|
{
|
|
for $u in doc("users.xml")//user_tuple
|
|
where
|
|
every $item in doc("items.xml")//item_tuple satisfies
|
|
some $b in doc("bids.xml")//bid_tuple satisfies
|
|
($item/itemno = $b/itemno and $u/userid = $b/userid)
|
|
return
|
|
$u/name
|
|
}
|
|
</frequent_bidder>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<frequent_bidder />
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>(No users satisfy Q17.)</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="rdb-queries-results-q18" name=
|
|
"rdb-queries-results-q18"></a>1.4.4.18 Q18</h5>
|
|
|
|
<p>List all users in alphabetic order by name. For each
|
|
user, include descriptions of all the items (if any)
|
|
that were bid on by that user, in alphabetic order.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $u in doc("users.xml")//user_tuple
|
|
order by $u/name
|
|
return
|
|
<user>
|
|
{ $u/name }
|
|
{
|
|
for $b in distinct-values(doc("bids.xml")//bid_tuple
|
|
[userid = $u/userid]/itemno)
|
|
for $i in doc("items.xml")//item_tuple[itemno = $b]
|
|
let $descr := $i/description/text()
|
|
order by $descr
|
|
return
|
|
<bid_on_item>{ $descr }</bid_on_item>
|
|
}
|
|
</user>
|
|
}
|
|
</result>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
<user>
|
|
<name>Dee Linquent</name>
|
|
<bid_on_item>Motorcycle</bid_on_item>
|
|
<bid_on_item>Racing Bicycle</bid_on_item>
|
|
</user>
|
|
<user>
|
|
<name>Jack Sprat</name>
|
|
<bid_on_item>Old Bicycle</bid_on_item>
|
|
<bid_on_item>Racing Bicycle</bid_on_item>
|
|
</user>
|
|
<user>
|
|
<name>Mary Doe</name>
|
|
<bid_on_item>Motorcycle</bid_on_item>
|
|
<bid_on_item>Red Bicycle</bid_on_item>
|
|
</user>
|
|
<user>
|
|
<name>Rip Van Winkle</name>
|
|
</user>
|
|
<user>
|
|
<name>Roger Smith</name>
|
|
<bid_on_item>Motorcycle</bid_on_item>
|
|
<bid_on_item>Old Bicycle</bid_on_item>
|
|
<bid_on_item>Racing Bicycle</bid_on_item>
|
|
<bid_on_item>Red Bicycle</bid_on_item>
|
|
</user>
|
|
<user>
|
|
<name>Tom Jones</name>
|
|
<bid_on_item>Motorcycle</bid_on_item>
|
|
<bid_on_item>Tricycle</bid_on_item>
|
|
</user>
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="sgml" name="sgml"></a>1.5 Use Case "SGML":
|
|
Standard Generalized Markup Language</h3>
|
|
|
|
<div class="div3">
|
|
<h4><a id="sgml-description" name=
|
|
"sgml-description"></a>1.5.1 Description</h4>
|
|
|
|
<p>The example document and queries in this Use Case were
|
|
first created for a 1992 conference on Standard
|
|
Generalized Markup Language (SGML). For our use, the
|
|
Document Type Definition (DTD) and example document have
|
|
been translated from SGML to XML.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="sgml-dtd" name="sgml-dtd"></a>1.5.2 Document
|
|
Type Definition (DTD)</h4>
|
|
|
|
<p>This use case is based on data conforming to the DTD
|
|
shown below.</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!NOTATION cgm PUBLIC "Computer Graphics Metafile">
|
|
<!NOTATION ccitt PUBLIC "CCITT group 4 raster">
|
|
|
|
<!ENTITY % text "(#PCDATA | emph)*">
|
|
<!ENTITY infoflow SYSTEM "infoflow.ccitt" NDATA ccitt>
|
|
<!ENTITY tagexamp SYSTEM "tagexamp.cgm" NDATA cgm>
|
|
|
|
<!ELEMENT report (title, chapter+)>
|
|
<!ELEMENT title %text;>
|
|
<!ELEMENT chapter (title, intro?, section*)>
|
|
<!ATTLIST chapter
|
|
shorttitle CDATA #IMPLIED>
|
|
<!ELEMENT intro (para | graphic)+>
|
|
<!ELEMENT section (title, intro?, topic*)>
|
|
<!ATTLIST section
|
|
shorttitle CDATA #IMPLIED
|
|
sectid ID #IMPLIED>
|
|
<!ELEMENT topic (title, (para | graphic)+)>
|
|
<!ATTLIST topic
|
|
shorttitle CDATA #IMPLIED
|
|
topicid ID #IMPLIED>
|
|
<!ELEMENT para (#PCDATA | emph | xref)*>
|
|
<!ATTLIST para
|
|
security (u | c | s | ts) "u">
|
|
<!ELEMENT emph %text;>
|
|
<!ELEMENT graphic EMPTY>
|
|
<!ATTLIST graphic
|
|
graphname ENTITY #REQUIRED>
|
|
<!ELEMENT xref EMPTY>
|
|
<!ATTLIST xref
|
|
xrefid IDREF #IMPLIED>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="sgml-data" name="sgml-data"></a>1.5.3 Sample
|
|
Data</h4>
|
|
|
|
<p>The queries in this use case are based on the
|
|
following sample data, which is found in the file
|
|
"sgml.xml". Line numbers have been added to the data to
|
|
allow the results of queries to be conveniently
|
|
specified.</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
0: <!DOCTYPE report SYSTEM "report.dtd">
|
|
1: <report>
|
|
2: <title>Getting started with SGML</title>
|
|
3: <chapter>
|
|
4: <title>The business challenge</title>
|
|
5: <intro>
|
|
6: <para>With the ever-changing and growing global market, companies and
|
|
7: large organizations are searching for ways to become more viable and
|
|
8: competitive. Downsizing and other cost-cutting measures demand more
|
|
9: efficient use of corporate resources. One very important resource is
|
|
10: an organization's information.</para>
|
|
11: <para>As part of the move toward integrated information management,
|
|
12: whole industries are developing and implementing standards for
|
|
13: exchanging technical information. This report describes how one such
|
|
14: standard, the Standard Generalized Markup Language (SGML), works as
|
|
15: part of an overall information management strategy.</para>
|
|
16: <graphic graphname="infoflow"/></intro></chapter>
|
|
17: <chapter>
|
|
18: <title>Getting to know SGML</title>
|
|
19: <intro>
|
|
20: <para>While SGML is a fairly recent technology, the use of
|
|
21: <emph>markup</emph> in computer-generated documents has existed for a
|
|
22: while.</para></intro>
|
|
23: <section shorttitle="What is markup?">
|
|
24: <title>What is markup, or everything you always wanted to know about
|
|
25: document preparation but were afraid to ask?</title>
|
|
26: <intro>
|
|
27: <para>Markup is everything in a document that is not content. The
|
|
28: traditional meaning of markup is the manual <emph>marking</emph> up
|
|
29: of typewritten text to give instructions for a typesetter or
|
|
30: compositor about how to fit the text on a page and what typefaces to
|
|
31: use. This kind of markup is known as <emph>procedural markup</emph>.</para></intro>
|
|
32: <topic topicid="top1">
|
|
33: <title>Procedural markup</title>
|
|
34: <para>Most electronic publishing systems today use some form of
|
|
35: procedural markup. Procedural markup codes are good for one
|
|
36: presentation of the information.</para></topic>
|
|
37: <topic topicid="top2">
|
|
38: <title>Generic markup</title>
|
|
39: <para>Generic markup (also known as descriptive markup) describes the
|
|
40: <emph>purpose</emph> of the text in a document. A basic concept of
|
|
41: generic markup is that the content of a document must be separate from
|
|
42: the style. Generic markup allows for multiple presentations of the
|
|
43: information.</para></topic>
|
|
44: <topic topicid="top3">
|
|
45: <title>Drawbacks of procedural markup</title>
|
|
46: <para>Industries involved in technical documentation increasingly
|
|
47: prefer generic over procedural markup schemes. When a company changes
|
|
48: software or hardware systems, enormous data translation tasks arise,
|
|
49: often resulting in errors.</para></topic></section>
|
|
50: <section shorttitle="What is SGML?">
|
|
51: <title>What <emph>is</emph> SGML in the grand scheme of the universe, anyway?</title>
|
|
52: <intro>
|
|
53: <para>SGML defines a strict markup scheme with a syntax for defining
|
|
54: document data elements and an overall framework for marking up
|
|
55: documents.</para>
|
|
56: <para>SGML can describe and create documents that are not dependent on
|
|
57: any hardware, software, formatter, or operating system. Since SGML documents
|
|
58: conform to an international standard, they are portable.</para></intro></section>
|
|
59: <section shorttitle="How does SGML work?">
|
|
60: <title>How is SGML and would you recommend it to your grandmother?</title>
|
|
61: <intro>
|
|
62: <para>You can break a typical document into three layers: structure,
|
|
63: content, and style. SGML works by separating these three aspects and
|
|
64: deals mainly with the relationship between structure and content.</para></intro>
|
|
65: <topic topicid="top4">
|
|
66: <title>Structure</title>
|
|
67: <para>At the heart of an SGML application is a file called the DTD, or
|
|
68: Document Type Definition. The DTD sets up the structure of a document,
|
|
69: much like a database schema describes the types of information it
|
|
70: handles.</para>
|
|
71: <para>A database schema also defines the relationships between the
|
|
72: various types of data. Similarly, a DTD specifies <emph>rules</emph>
|
|
73: to help ensure documents have a consistent, logical structure.</para></topic>
|
|
74: <topic topicid="top5">
|
|
75: <title>Content</title>
|
|
76: <para>Content is the information itself. The method for identifying
|
|
77: the information and its meaning within this framework is called
|
|
78: <emph>tagging</emph>. Tagging must
|
|
79: conform to the rules established in the DTD (see <xref xrefid="top4"/>).</para>
|
|
80: <graphic graphname="tagexamp"/></topic>
|
|
81: <topic topicid="top6">
|
|
82: <title>Style</title>
|
|
83: <para>SGML does not standardize style or other processing methods for
|
|
84: information stored in SGML.</para></topic></section></chapter>
|
|
85: <chapter>
|
|
86: <title>Resources</title>
|
|
87: <section>
|
|
88: <title>Conferences, tutorials, and training</title>
|
|
89: <intro>
|
|
90: <para>The Graphic Communications Association has been
|
|
91: instrumental in the development of SGML. GCA provides conferences,
|
|
92: tutorials, newsletters, and publication sales for both members and
|
|
93: non-members.</para>
|
|
94: <para security="c">Exiled members of the former Soviet Union's secret
|
|
95: police, the KGB, have infiltrated the upper ranks of the GCA and are
|
|
96: planning the Final Revolution as soon as DSSSL is completed.</para>
|
|
97: </intro>
|
|
98: </section>
|
|
99: </chapter>
|
|
100:</report>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="sgml-queries-results" name=
|
|
"sgml-queries-results"></a>1.5.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q1" name=
|
|
"sgml-queries-results-q1"></a>1.5.4.1 Q1</h5>
|
|
|
|
<p>Locate all paragraphs in the report (all "para"
|
|
elements occurring anywhere within the "report"
|
|
element).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
doc("sgml.xml")//report//para
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Elements whose start-tags are on lines 6, 11, 20,
|
|
27, 34, 39, 46, 53, 56, 62, 67, 71, 76, 83, 90, 94</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q2" name=
|
|
"sgml-queries-results-q2"></a>1.5.4.2 Q2</h5>
|
|
|
|
<p>Locate all paragraph elements in an introduction
|
|
(all "para" elements directly contained within an
|
|
"intro" element).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
doc("sgml.xml")//intro/para
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Elements whose start-tags are on lines 6, 11, 20,
|
|
27, 53, 56, 62, 90, 94</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q3" name=
|
|
"sgml-queries-results-q3"></a>1.5.4.3 Q3</h5>
|
|
|
|
<p>Locate all paragraphs in the introduction of a
|
|
section that is in a chapter that has no introduction
|
|
(all "para" elements directly contained within an
|
|
"intro" element directly contained in a "section"
|
|
element directly contained in a "chapter" element. The
|
|
"chapter" element must not directly contain an "intro"
|
|
element).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $c in doc("sgml.xml")//chapter
|
|
where empty($c/intro)
|
|
return $c/section/intro/para
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Elements whose start-tags are on lines 90, 94</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q4" name=
|
|
"sgml-queries-results-q4"></a>1.5.4.4 Q4</h5>
|
|
|
|
<p>Locate the second paragraph in the third section in
|
|
the second chapter (the second "para" element occurring
|
|
in the third "section" element occurring in the second
|
|
"chapter" element occurring in the "report").</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
(((doc("sgml.xml")//chapter)[2]//section)[3]//para)[2]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Element whose start-tag is on line 67</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q5" name=
|
|
"sgml-queries-results-q5"></a>1.5.4.5 Q5</h5>
|
|
|
|
<p>Locate all classified paragraphs (all "para"
|
|
elements whose "security" attribute has the value
|
|
"c").</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
doc("sgml.xml")//para[@security = "c"]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Element whose start-tag is on line 94</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q6" name=
|
|
"sgml-queries-results-q6"></a>1.5.4.6 Q6</h5>
|
|
|
|
<p>List the short titles of all sections (the values of
|
|
the "shorttitle" attributes of all "section" elements,
|
|
expressing each short title as the value of a new
|
|
element.)</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $s in doc("sgml.xml")//section/@shorttitle
|
|
return <stitle>{ $s }</stitle>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Attribute values in start-tags on lines 23, 50,
|
|
59</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q7" name=
|
|
"sgml-queries-results-q7"></a>1.5.4.7 Q7</h5>
|
|
|
|
<p>Locate the initial letter of the initial paragraph
|
|
of all introductions (the first character in the
|
|
content [character content as well as element content]
|
|
of the first "para" element contained in an "intro"
|
|
element).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $i in doc("sgml.xml")//intro/para[1]
|
|
return
|
|
<first_letter>{ substring(string($i), 1, 1) }</first_letter>
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Character after start-tag on lines 6, 20, 27, 53,
|
|
62, 90</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q8a" name=
|
|
"sgml-queries-results-q8a"></a>1.5.4.8 Q8a</h5>
|
|
|
|
<p>Locate all sections with a title that has "is SGML"
|
|
in it. The string may occur anywhere in the descendants
|
|
of the title element, and markup boundaries are
|
|
ignored.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
doc("sgml.xml")//section[.//title[contains(., "is SGML")]]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Elements whose start-tags are on lines 50, 59</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q8b" name=
|
|
"sgml-queries-results-q8b"></a>1.5.4.9 Q8b</h5>
|
|
|
|
<p>Same as (Q8a), but the string "is SGML" cannot be
|
|
interrupted by sub-elements, and must appear in a
|
|
single text node.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
doc("sgml.xml")//section[.//title/text()[contains(., "is SGML")]]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Element whose start-tag is on line 59</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q9" name=
|
|
"sgml-queries-results-q9"></a>1.5.4.10 Q9</h5>
|
|
|
|
<p>Locate all the topics referenced by a
|
|
cross-reference anywhere in the report (all the "topic"
|
|
elements whose "topicid" attribute value is the same as
|
|
an "xrefid" attribute value of any "xref" element).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
for $id in doc("sgml.xml")//xref/@xrefid
|
|
return doc("sgml.xml")//topic[@topicid = $id]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Element whose start-tag is on line 65</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="sgml-queries-results-q10" name=
|
|
"sgml-queries-results-q10"></a>1.5.4.11 Q10</h5>
|
|
|
|
<p>Locate the closest title preceding the
|
|
cross-reference ("xref") element whose "xrefid"
|
|
attribute is "top4" (the "title" element that would be
|
|
touched last before this "xref" element when touching
|
|
each element in document order).</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<result>
|
|
{
|
|
let $x := doc("sgml.xml")//xref[@xrefid = "top4"],
|
|
$t := doc("sgml.xml")//title[. << $x]
|
|
return $t[last()]
|
|
}
|
|
</result>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<p>Given xref on line 79, element whose start-tag is on
|
|
line 75</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="text" name="text"></a>1.6 Use Case "STRING":
|
|
String Search</h3>
|
|
|
|
<div class="div3">
|
|
<h4><a id="text-description" name=
|
|
"text-description"></a>1.6.1 Description</h4>
|
|
|
|
<p>This use case is based on company profiles and a set
|
|
of news documents which contain data for PR, mergers and
|
|
acquisitions, etc. Given a company, the use case
|
|
illustrates several different queries for searching text
|
|
in news documents and different ways of providing query
|
|
results by matching the information from the company
|
|
profile and the content of the news items.</p>
|
|
|
|
<p>In this use case, the <code>contains</code> function
|
|
is used to test whether a string occurs within a node or
|
|
a string. Obviously, using full-text functions would
|
|
provide more powerful searching, but the current
|
|
Functions and Operators draft does not have full-text
|
|
functions.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="text-dtd" name="text-dtd"></a>1.6.2 Document
|
|
Type Definition (DTD)</h4>
|
|
|
|
<p>This use case uses data that corresponds to the
|
|
following DTDs:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT company (name, ticker_symbol?, description?,
|
|
business_code, partners?, competitors?)>
|
|
<!ELEMENT name (#PCDATA)>
|
|
<!ELEMENT ticker_symbol (#PCDATA)>
|
|
<!ELEMENT description (#PCDATA)>
|
|
<!ELEMENT business_code (#PCDATA)>
|
|
<!ELEMENT partners (partner+)>
|
|
<!ELEMENT partner (#PCDATA)>
|
|
<!ELEMENT competitors (competitor+)>
|
|
<!ELEMENT competitor (#PCDATA)>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!ELEMENT news (news_item*)>
|
|
<!ELEMENT news_item (title, content, date, author?, news_agent)>
|
|
<!ELEMENT title (#PCDATA)>
|
|
<!ELEMENT content (par | figure)+ >
|
|
<!ELEMENT date (#PCDATA)>
|
|
<!ELEMENT author (#PCDATA)>
|
|
<!ELEMENT news_agent (#PCDATA)>
|
|
<!ELEMENT par (#PCDATA | quote | footnote)*>
|
|
<!ELEMENT quote (#PCDATA)>
|
|
<!ELEMENT footnote (#PCDATA)>
|
|
<!ELEMENT figure (title, image)>
|
|
<!ELEMENT image EMPTY>
|
|
<!ATTLIST image
|
|
source CDATA #REQUIRED >
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="text-data" name="text-data"></a>1.6.3 Sample
|
|
Data</h4>
|
|
|
|
<p>The queries in this use case are based on the
|
|
following input data, which is found in the file
|
|
"string.xml".</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
<news>
|
|
<news_item>
|
|
<title> Gorilla Corporation acquires YouNameItWeIntegrateIt.com </title>
|
|
<content>
|
|
<par> Today, Gorilla Corporation announced that it will purchase
|
|
YouNameItWeIntegrateIt.com. The shares of
|
|
YouNameItWeIntegrateIt.com dropped $3.00 as a result of this
|
|
announcement.
|
|
</par>
|
|
|
|
<par> As a result of this acquisition, the CEO of
|
|
YouNameItWeIntegrateIt.com Bill Smarts resigned. He did not
|
|
announce what he will do next. Sources close to
|
|
YouNameItWeIntegrateIt.com hint that Bill Smarts might be
|
|
taking a position in Foobar Corporation.
|
|
</par>
|
|
|
|
<par>YouNameItWeIntegrateIt.com is a leading systems integrator
|
|
that enables <quote>brick and mortar</quote> companies to
|
|
have a presence on the web.
|
|
</par>
|
|
|
|
</content>
|
|
<date>1-20-2000</date>
|
|
<author>Mark Davis</author>
|
|
<news_agent>News Online</news_agent>
|
|
</news_item>
|
|
|
|
<news_item>
|
|
<title>Foobar Corporation releases its new line of Foo products
|
|
today</title>
|
|
<content>
|
|
<par> Foobar Corporation releases the 20.9 version of its Foo
|
|
products. The new version of Foo products solve known
|
|
performance problems which existed in 20.8 line and
|
|
increases the speed of Foo based products tenfold. It also
|
|
allows wireless clients to be connected to the Foobar
|
|
servers.
|
|
</par>
|
|
<par> The President of Foobar Corporation announced that they
|
|
were proud to release 20.9 version of Foo products and
|
|
they will upgrade existing customers <footnote>where
|
|
service agreements exist</footnote>
|
|
promptly. TheAppCompany Inc. immediately announced that it
|
|
will release the new version of its products to utilize
|
|
the 20.9 architecture within the next three months.
|
|
</par>
|
|
<figure>
|
|
<title>Presidents of Foobar Corporation and TheAppCompany
|
|
Inc. Shake Hands</title> <image source="handshake.jpg"/>
|
|
</figure>
|
|
</content>
|
|
<date>1-20-2000</date>
|
|
<news_agent>Foobar Corporation</news_agent>
|
|
</news_item>
|
|
|
|
<news_item> <title>Foobar Corporation is suing Gorilla Corporation for
|
|
patent infringement </title>
|
|
<content>
|
|
<par> In surprising developments today, Foobar Corporation
|
|
announced that it is suing Gorilla Corporation for patent
|
|
infringement. The patents that were mentioned as part of the
|
|
lawsuit are considered to be the basis of Foobar
|
|
Corporation's <quote>Wireless Foo</quote> line of products.
|
|
</par>
|
|
<par>The tension between Foobar and Gorilla Corporations has
|
|
been increasing ever since the Gorilla Corporation acquired
|
|
more than 40 engineers who have left Foobar Corporation,
|
|
TheAppCompany Inc. and YouNameItWeIntegrateIt.com over the
|
|
past 3 months. The engineers who have left the Foobar
|
|
corporation and its partners were rumored to be working on
|
|
the next generation of server products and applications which
|
|
will directly compete with Foobar's Foo 20.9 servers. Most of
|
|
the engineers have relocated to Hawaii where the Gorilla
|
|
Corporation's server development is located.
|
|
</par>
|
|
</content>
|
|
<date>1-20-2000</date>
|
|
<news_agent>Reliable News Corporation</news_agent>
|
|
</news_item>
|
|
</news>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In addition, the following data, listing the partners
|
|
and competitors of companies, is found in the file
|
|
"company-data.xml".</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
<!DOCTYPE company SYSTEM "company.dtd">
|
|
<company>
|
|
<name>Foobar Corporation</name>
|
|
<ticker_symbol>FOO</ticker_symbol>
|
|
|
|
<description>Foobar Corporation is a maker of Foo(TM) and
|
|
Foobar(TM) products and a leading software company with a 300
|
|
Billion dollar revenue in 1999. It is located in Alaska.
|
|
</description>
|
|
|
|
<business_code>Software</business_code>
|
|
<partners>
|
|
<partner>YouNameItWeIntegrateIt.com</partner>
|
|
<partner>TheAppCompany Inc.</partner>
|
|
</partners>
|
|
<competitors>
|
|
<competitor>Gorilla Corporation</competitor>
|
|
</competitors>
|
|
</company>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="text-queries-results" name=
|
|
"text-queries-results"></a>1.6.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="text-queries-results-q1" name=
|
|
"text-queries-results-q1"></a>1.6.4.1 Q1</h5>
|
|
|
|
<p>Find the titles of all news items where the string
|
|
"Foobar Corporation" appears in the title.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
doc("string.xml")//news_item/title[contains(., "Foobar Corporation")]
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Results</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<title>Foobar Corporation releases its new line of Foo
|
|
products today</title>
|
|
<title>Foobar Corporation is suing Gorilla Corporation for patent
|
|
infringement </title>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="text-queries-results-q2" name=
|
|
"text-queries-results-q2"></a>1.6.4.2 Q2</h5>
|
|
|
|
<p>Find news items where the Foobar Corporation and one
|
|
or more of its partners are mentioned in the same
|
|
paragraph and/or title. List each news item by its
|
|
title and date.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:partners($company as xs:string) as element()*
|
|
{
|
|
let $c := doc("company-data.xml")//company[name = $company]
|
|
return $c//partner
|
|
};
|
|
|
|
let $foobar_partners := local:partners("Foobar Corporation")
|
|
|
|
for $item in doc("string.xml")//news_item
|
|
where
|
|
some $t in $item//title satisfies
|
|
(contains($t/text(), "Foobar Corporation")
|
|
and (some $partner in $foobar_partners satisfies
|
|
contains($t/text(), $partner/text())))
|
|
or (some $par in $item//par satisfies
|
|
(contains(string($par), "Foobar Corporation")
|
|
and (some $partner in $foobar_partners satisfies
|
|
contains(string($par), $partner/text()))))
|
|
return
|
|
<news_item>
|
|
{ $item/title }
|
|
{ $item/date }
|
|
</news_item>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<news_item>
|
|
<title> Gorilla Corporation acquires YouNameItWeIntegrateIt.com </title>
|
|
<date>1-20-2000</date>
|
|
</news_item>
|
|
<news_item>
|
|
<title>Foobar Corporation releases its new line of Foo products today</title>
|
|
<date>1-20-2000</date>
|
|
</news_item>
|
|
<news_item>
|
|
<title>Foobar Corporation is suing Gorilla Corporation for patent
|
|
infringement </title>
|
|
<date>1-20-2000</date>
|
|
</news_item>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="text-queries-results-q3" name=
|
|
"text-queries-results-q3"></a>1.6.4.3 Q3</h5>
|
|
|
|
<div class="note">
|
|
<p class="prefix"><b>Note:</b></p>
|
|
|
|
<p>Query Q3 has been withdrawn from the use cases
|
|
document.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="text-queries-results-q4" name=
|
|
"text-queries-results-q4"></a>1.6.4.4 Q4</h5>
|
|
|
|
<p>Find news items where a company and one of its
|
|
partners is mentioned in the same news item and the
|
|
news item is not authored by the company itself.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:partners($company as xs:string) as element()*
|
|
{
|
|
let $c := doc("company-data.xml")//company[name = $company]
|
|
return $c//partner
|
|
};
|
|
|
|
for $item in doc("string.xml")//news_item,
|
|
$c in doc("company-data.xml")//company
|
|
let $partners := local:partners($c/name)
|
|
where contains(string($item), $c/name)
|
|
and (some $p in $partners satisfies
|
|
contains(string($item), $p) and $item/news_agent != $c/name)
|
|
return
|
|
$item
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Results:</em> The expected results are
|
|
the news item elements with the following titles:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<p>Gorilla Corporation acquires
|
|
YouNameItWeIntegrateIt.com</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Foobar Corporation is suing Gorilla Corporation
|
|
for patent infringement</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="text-queries-results-q5" name=
|
|
"text-queries-results-q5"></a>1.6.4.5 Q5</h5>
|
|
|
|
<p>For each news item that is relevant to the Gorilla
|
|
Corporation, create an "item summary" element. The
|
|
content of the item summary is the content of the
|
|
title, date, and first paragraph of the news item,
|
|
separated by periods. A news item is relevant if the
|
|
name of the company is mentioned anywhere within the
|
|
content of the news item.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
for $item in doc("string.xml")//news_item
|
|
where contains(string($item/content), "Gorilla Corporation")
|
|
return
|
|
<item_summary>
|
|
{ concat($item/title,". ") }
|
|
{ concat($item/date,". ") }
|
|
{ string(($item//par)[1]) }
|
|
</item_summary>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result: (with whitespace reformatted
|
|
for readability)</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<item_summary>Gorilla Corporation acquires
|
|
YouNameItWeIntegrateIt.com. 1-20-2000. Today, Gorilla Corporation
|
|
announced that it will purchase YouNameItWeIntegrateIt.com. The shares
|
|
of YouNameItWeIntegrateIt.com dropped $3.00 as a result of this
|
|
announcement.</item_summary>
|
|
|
|
<item_summary>Foobar Corporation is suing Gorilla Corporation for
|
|
patent infringement. 1-20-2000. In surprising developments today,
|
|
Foobar Corporation announced that it is suing Gorilla Corporation for
|
|
patent infringement. The patents that were mentioned as part of the
|
|
lawsuit are considered to be the basis of Foobar Corporation's
|
|
Wireless Foo line of products.</item_summary>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="ns" name="ns"></a>1.7 Use Case "NS" - Queries
|
|
Using Namespaces</h3>
|
|
|
|
<p>This use case performs a variety of queries on
|
|
namespace-qualified names.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="ns-description" name=
|
|
"ns-description"></a>1.7.1 Description</h4>
|
|
|
|
<p>This use case is based on a scenario in which a
|
|
neutral mediator is acting with public auction servers on
|
|
behalf of clients. The reason for a client to use this
|
|
imaginary service may be anonymity, better insurance, or
|
|
the possibility to cover more than one market at a time.
|
|
The following aspects of namespaces are illustrated by
|
|
this use case:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<p>Syntactic disambiguation when combining XML data
|
|
from different sources</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Re-use of predefined modules, such as XLinks or
|
|
XML Schema</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Support for global classification schemas, such as
|
|
the Dublin Core</p>
|
|
</li>
|
|
</ul>
|
|
|
|
<p>The sample data consists of two records. The schema
|
|
used for this data uses W3C XML Schema's schema
|
|
composition to create a schema from predefined, namespace
|
|
separated modules, and uses XLink to express references.
|
|
Each record describes a running auction. It embeds data
|
|
specific to an auctioneer (e.g. the company's credit
|
|
rating system) and a taxonomy specific to a particular
|
|
good (jazz records) in a framework that contains data
|
|
common to all auctions (e.g. start and end time), using
|
|
namespaces to distinguish the three vocabularies.</p>
|
|
|
|
<p>Note that namespace prefixes must be resolved to their
|
|
Namespace URIs before matching namespace qualified names.
|
|
It is not sufficient to use the literal prefixes to
|
|
denote namespaces. Furthermore, there are several
|
|
possible ways to represent namespace declarations.
|
|
Therefore, processing must be done on the namespace
|
|
processed XML Information Set, not on the XML text
|
|
representation.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="ns-dtd" name="ns-dtd"></a>1.7.2 Document Type
|
|
Definition (DTD)</h4>
|
|
|
|
<p>DTDs are not fully compatible with namespaces as they
|
|
can not express the equality of nodes in the same
|
|
namespace, but different namespace proxies. In a later
|
|
version of this paper, an XML Schema should be added
|
|
here.</p>
|
|
|
|
<p>This data for this use case is in the file
|
|
"auction.xml".</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="ns-data" name="ns-data"></a>1.7.3 Sample
|
|
Data</h4>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
<ma:AuctionWatchList
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo"
|
|
>
|
|
|
|
<!-- ________________________________________________________________________________ -->
|
|
|
|
<ma:Auction anyzone:ID="0321K372910">
|
|
|
|
<ma:AuctionHomepage
|
|
xlink:type="simple"
|
|
xlink:href="http://www.example.com/item/0321K372910"
|
|
/>
|
|
|
|
<ma:Schedule>
|
|
<ma:Open xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
dt:type="timeInstant">2000-03-21:07:41:34-05:00</ma:Open>
|
|
<ma:Close xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
dt:type="timeInstant">2000-03-23:07:41:34-05:00</ma:Close>
|
|
</ma:Schedule>
|
|
|
|
<ma:Price>
|
|
<ma:Start ma:currency="USD">3.00</ma:Start>
|
|
<ma:Current ma:currency="USD">10.00</ma:Current>
|
|
<ma:Number_of_Bids>5</ma:Number_of_Bids>
|
|
</ma:Price>
|
|
|
|
<ma:Trading_Partners>
|
|
<ma:High_Bidder>
|
|
<eachbay:ID>RecordsRUs</eachbay:ID>
|
|
<eachbay:PositiveComments>231</eachbay:PositiveComments>
|
|
<eachbay:NeutralComments>2</eachbay:NeutralComments>
|
|
<eachbay:NegativeComments>5</eachbay:NegativeComments>
|
|
<ma:MemberInfoPage
|
|
xlink:type="simple"
|
|
xlink:href="http://auction.eachbay.com/members?get=RecordsRUs"
|
|
xlink:role="ma:MemberInfoPage"
|
|
/>
|
|
</ma:High_Bidder>
|
|
<ma:Seller>
|
|
<anyzone:ID>VintageRecordFreak</anyzone:ID>
|
|
<anyzone:Member_Since>October 1999</anyzone:Member_Since>
|
|
<anyzone:Rating>5</anyzone:Rating>
|
|
<ma:MemberInfoPage
|
|
xlink:type="simple"
|
|
xlink:href="http://auction.anyzone.com/members/VintageRecordFreak"
|
|
xlink:role="ma:MemberInfoPage"
|
|
/>
|
|
</ma:Seller>
|
|
</ma:Trading_Partners>
|
|
|
|
<ma:Details>
|
|
<record xmlns="http://www.example.org/music/records">
|
|
<artist>Miles Davis</artist>
|
|
<title>In a Silent Way</title>
|
|
<recorded>1969</recorded>
|
|
<label>Columbia Records</label>
|
|
|
|
<remark>With Miles Davis (trumpet), Herbie Hancock (Electric
|
|
Piano), Chick Corea (Electric Piano), Wayne Shorter
|
|
(Tenor Sax), Josef Zawinul (Electric Piano &amp;
|
|
Organ), John McLaughlin (Guitar), and Tony Williams
|
|
(Drums). The liner notes were written by Frank Glenn,
|
|
and the record is in fine condition.</remark>
|
|
|
|
</record>
|
|
</ma:Details>
|
|
|
|
</ma:Auction>
|
|
|
|
<!-- ________________________________________________________________________________ -->
|
|
|
|
|
|
<ma:Auction yabadoo:ID="13143816">
|
|
|
|
<ma:AuctionHomepage
|
|
xlink:type="simple"
|
|
xlink:href="http://auctions.yabadoo.com/auction/13143816"
|
|
/>
|
|
|
|
<ma:Schedule>
|
|
<ma:Open xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
dt:type="timeInstant">2000-03-19:17:03:00-04:00</ma:Open>
|
|
<ma:Close xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
dt:type="timeInstant">2000-03-29:17:03:00-04:00</ma:Close>
|
|
</ma:Schedule>
|
|
|
|
<ma:Price>
|
|
<ma:Start ma:currency="USD">3.00</ma:Start>
|
|
<ma:Current ma:currency="USD">3.00</ma:Current>
|
|
<ma:Number_of_Bids>0</ma:Number_of_Bids>
|
|
</ma:Price>
|
|
|
|
<ma:Trading_Partners>
|
|
<ma:High_Bidder>
|
|
<eachbay:ID>VintageRecordFreak</eachbay:ID>
|
|
<eachbay:PositiveComments>232</eachbay:PositiveComments>
|
|
<eachbay:NeutralComments>0</eachbay:NeutralComments>
|
|
<eachbay:NegativeComments>0</eachbay:NegativeComments>
|
|
<ma:MemberInfoPage
|
|
xlink:type="simple"
|
|
xlink:href="http://auction.eachbay.com/showRating/user=VintageRecordFreak"
|
|
xlink:role="ma:MemberInfoPage"
|
|
/>
|
|
</ma:High_Bidder>
|
|
<ma:Seller xmlns:seller="http://www.example.com/auctioneers#eachbay">
|
|
<seller:ID>StarsOn45</seller:ID>
|
|
<seller:PositiveComments>80</seller:PositiveComments>
|
|
<seller:NeutralComments>1</seller:NeutralComments>
|
|
<seller:NegativeComments>2</seller:NegativeComments>
|
|
<ma:MemberInfoPage
|
|
xlink:type="simple"
|
|
xlink:href="http://auction.eachbay.com/showRating/user=StarsOn45"
|
|
xlink:role="ma:MemberInfoPage"
|
|
/>
|
|
</ma:Seller>
|
|
</ma:Trading_Partners>
|
|
|
|
<ma:Details>
|
|
<record xmlns="http://www.example.org/music/records">
|
|
<artist>Wynton Marsalis</artist>
|
|
<title>Think of One ...</title>
|
|
<recorded>1983</recorded>
|
|
<label>Columbia Records</label>
|
|
<remark xml:lang="en">Columbia Records 12" 33-1/3 rpm LP,
|
|
#FC-38641, Stereo. The record is still clean and shiny
|
|
and looks unplayed (looks like NM condition). The
|
|
cover has very light surface and edge wear.</remark>
|
|
<remark xml:lang="de">Columbia Records 12" 33-1/3 rpm LP,
|
|
#FC-38641, Stereo. Die Platte ist noch immer sauber
|
|
und glänzend und sieht ungespielt aus
|
|
(NM Zustand). Das Cover hat leichte Abnutzungen an
|
|
Oberfläche und Ecken.</remark>
|
|
</record>
|
|
</ma:Details>
|
|
|
|
</ma:Auction>
|
|
|
|
</ma:AuctionWatchList>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="ns-queries-results" name=
|
|
"ns-queries-results"></a>1.7.4 Queries and Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q1" name=
|
|
"ns-queries-results-q1"></a>1.7.4.1 Q1</h5>
|
|
|
|
<p>List all unique namespaces used in the sample
|
|
data.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q1>
|
|
{
|
|
for $n in distinct-values(
|
|
for $i in (doc("auction.xml")//* | doc("auction.xml")//@*)
|
|
return namespace-uri($i)
|
|
)
|
|
return <ns>{$n}</ns>
|
|
}
|
|
</Q1>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q1>
|
|
<ns>http://www.example.com/AuctionWatch</ns>
|
|
<ns>http://www.example.com/auctioneers#anyzone</ns>
|
|
<ns>http://www.w3.org/1999/xlink</ns>
|
|
<ns>http://www.w3.org/2001/XMLSchema</ns>
|
|
<ns>http://www.example.com/auctioneers#eachbay</ns>
|
|
<ns>http://www.example.org/music/records</ns>
|
|
<ns>http://www.example.com/auctioneers#yabadoo</ns>
|
|
<ns>http://www.w3.org/XML/1998/namespace</ns>
|
|
</Q1>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q2" name=
|
|
"ns-queries-results-q2"></a>1.7.4.2 Q2</h5>
|
|
|
|
<p>Select the title of each record that is for
|
|
sale.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace music = "http://www.example.org/music/records";
|
|
|
|
<Q2>
|
|
{
|
|
doc("auction.xml")//music:title
|
|
}
|
|
</Q2>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q2>
|
|
<title xmlns="http://www.example.org/music/records"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">In a Silent Way</title>
|
|
<title xmlns="http://www.example.org/music/records"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">Think of One ...</title>
|
|
</Q2>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q3" name=
|
|
"ns-queries-results-q3"></a>1.7.4.3 Q3</h5>
|
|
|
|
<p>Select all elements that have an attribute whose
|
|
name is in the XML Schema namespace.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace dt = "http://www.w3.org/2001/XMLSchema";
|
|
|
|
<Q3>
|
|
{
|
|
doc("auction.xml")//*[@dt:*]
|
|
}
|
|
</Q3>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q3>
|
|
<ma:Open
|
|
dt:type="timeInstant"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">2000-03-21:07:41:34-05:00</ma:Open>
|
|
<ma:Close
|
|
dt:type="timeInstant"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">2000-03-23:07:41:34-05:00</ma:Close>
|
|
<ma:Open
|
|
dt:type="timeInstant"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">2000-03-19:17:03:00-04:00</ma:Open>
|
|
<ma:Close
|
|
dt:type="timeInstant"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">2000-03-29:17:03:00-04:00</ma:Close>
|
|
</Q3>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q4" name=
|
|
"ns-queries-results-q4"></a>1.7.4.4 Q4</h5>
|
|
|
|
<p>List the target URI's of all XLinks in the
|
|
document.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace xlink = "http://www.w3.org/1999/xlink";
|
|
|
|
<Q4 xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
{
|
|
for $hr in doc("auction.xml")//@xlink:href
|
|
return <ns>{ $hr }</ns>
|
|
}
|
|
</Q4>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q4 xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<ns xlink:href="http://www.example.com/item/0321K372910"/>
|
|
<ns xlink:href="http://auction.eachbay.com/members?get=RecordsRUs"/>
|
|
<ns xlink:href="http://auction.anyzone.com/members/VintageRecordFreak"/>
|
|
<ns xlink:href="http://auctions.yabadoo.com/auction/13143816"/>
|
|
<ns xlink:href="http://auction.eachbay.com/showRating/user=VintageRecordFreak"/>
|
|
<ns xlink:href="http://auction.eachbay.com/showRating/user=StarsOn45"/>
|
|
</Q4>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q5" name=
|
|
"ns-queries-results-q5"></a>1.7.4.5 Q5</h5>
|
|
|
|
<p>Select all records that have a remark in German.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace music = "http://www.example.org/music/records";
|
|
|
|
<Q5 xmlns:music="http://www.example.org/music/records">
|
|
{
|
|
doc("auction.xml")//music:record[music:remark/@xml:lang = "de"]
|
|
}
|
|
</Q5>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q5 xmlns:music="http://www.example.org/music/records">
|
|
<record xmlns="http://www.example.org/music/records"
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">
|
|
<artist>Wynton Marsalis</artist>
|
|
<title>Think of One ...</title>
|
|
<recorded>1983</recorded>
|
|
<label>Columbia Records</label>
|
|
<remark xml:lang="en">Columbia Records 12" 33-1/3 rpm LP,
|
|
#FC-38641, Stereo. The record is still clean and shiny
|
|
and looks unplayed (looks like NM condition). The
|
|
cover has very light surface and edge wear.</remark>
|
|
<remark xml:lang="de">Columbia Records 12" 33-1/3 rpm LP,
|
|
#FC-38641, Stereo. Die Platte ist noch immer sauber
|
|
und glänzend und sieht ungespielt aus
|
|
(NM Zustand). Das Cover hat leichte Abnutzungen an
|
|
Oberfläche und Ecken.</remark>
|
|
</record>
|
|
</Q5>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q6" name=
|
|
"ns-queries-results-q6"></a>1.7.4.6 Q6</h5>
|
|
|
|
<p>Select the closing time elements of all AnyZone
|
|
auctions currently monitored.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace ma = "http://www.example.com/AuctionWatch";
|
|
declare namespace anyzone = "http://www.example.com/auctioneers#anyzone";
|
|
|
|
<Q6 xmlns:ma="http://www.example.com/AuctionWatch">
|
|
{
|
|
doc("auction.xml")//ma:Auction[@anyzone:ID]/ma:Schedule/ma:Close
|
|
}
|
|
</Q6>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q6 xmlns:ma="http://www.example.com/AuctionWatch">
|
|
<ma:Close
|
|
xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:dt="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo"
|
|
dt:type="timeInstant">2000-03-23:07:41:34-05:00</ma:Close>
|
|
</Q6>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q7" name=
|
|
"ns-queries-results-q7"></a>1.7.4.7 Q7</h5>
|
|
|
|
<p>Select the homepage of all auctions where both
|
|
seller and high bidder are registered at the same
|
|
auctioneer.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace ma = "http://www.example.com/AuctionWatch";
|
|
|
|
<Q7 xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
{
|
|
for $a in doc("auction.xml")//ma:Auction
|
|
let $seller_id := $a/ma:Trading_Partners/ma:Seller/*:ID,
|
|
$buyer_id := $a/ma:Trading_Partners/ma:High_Bidder/*:ID
|
|
where namespace-uri($seller_id) = namespace-uri($buyer_id)
|
|
return
|
|
$a/ma:AuctionHomepage
|
|
}
|
|
</Q7>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q7 xmlns:xlink="http://www.w3.org/1999/xlink" >
|
|
<ma:AuctionHomepage xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xlink:type="simple"
|
|
xlink:href="http://auctions.yabadoo.com/auction/13143816" />
|
|
</Q7>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="ns-queries-results-q8" name=
|
|
"ns-queries-results-q8"></a>1.7.4.8 Q8</h5>
|
|
|
|
<p>Select all traders (either seller or high bidder)
|
|
without negative comments</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace ma = "http://www.example.com/AuctionWatch";
|
|
|
|
<Q8 xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
{
|
|
for $s in doc("auction.xml")//ma:Trading_Partners/(ma:Seller | ma:High_Bidder)
|
|
where $s/*:NegativeComments = 0
|
|
return $s
|
|
}
|
|
</Q8>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<Q8 xmlns:eachbay="http://www.example.com/auctioneers#eachbay"
|
|
xmlns:ma="http://www.example.com/AuctionWatch"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<ma:High_Bidder xmlns:anyzone="http://www.example.com/auctioneers#anyzone"
|
|
xmlns:yabadoo="http://www.example.com/auctioneers#yabadoo">
|
|
<eachbay:ID>VintageRecordFreak</eachbay:ID>
|
|
<eachbay:PositiveComments>232</eachbay:PositiveComments>
|
|
<eachbay:NeutralComments>0</eachbay:NeutralComments>
|
|
<eachbay:NegativeComments>0</eachbay:NegativeComments>
|
|
<ma:MemberInfoPage
|
|
xlink:href="http://auction.eachbay.com/showRating/user=VintageRecordFreak"
|
|
xlink:role="ma:MemberInfoPage"
|
|
xlink:type="simple"/>
|
|
</ma:High_Bidder>
|
|
</Q8>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="parts" name="parts"></a>1.8 Use Case "PARTS" -
|
|
Recursive Parts Explosion</h3>
|
|
|
|
<p>This use case illustrates how a recursive query might be
|
|
used to construct a hierarchic document of arbitrary depth
|
|
from flat structures stored in a database.</p>
|
|
|
|
<div class="div3">
|
|
<h4><a id="parts-description" name=
|
|
"parts-description"></a>1.8.1 Description</h4>
|
|
|
|
<p>This use case is based on a "parts explosion" database
|
|
that contains information about how parts are used in
|
|
other parts.</p>
|
|
|
|
<p>The input to the use case is a "flat" document in
|
|
which each different part is represented by a
|
|
<part> element with partid and name attributes.
|
|
Each part may or may not be part of a larger part; if so,
|
|
the partid of the larger part is contained in a partof
|
|
attribute. This input document might be derived from a
|
|
relational database in which each part is represented by
|
|
a row of a table with partid as primary key and partof as
|
|
a foreign key referencing partid.</p>
|
|
|
|
<p>The challenge of this use case is to write a query
|
|
that converts the "flat" representation of the parts
|
|
explosion, based on foreign keys, into a hierarchic
|
|
representation in which part containment is represented
|
|
by the structure of the document.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="parts-dtd" name="parts-dtd"></a>1.8.2 Document
|
|
Type Definitions (DTD)</h4>
|
|
|
|
<p>The input data set uses the following DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!DOCTYPE partlist [
|
|
<!ELEMENT partlist (part*)>
|
|
<!ELEMENT part EMPTY>
|
|
<!ATTLIST part
|
|
partid CDATA #REQUIRED
|
|
partof CDATA #IMPLIED
|
|
name CDATA #REQUIRED>
|
|
]>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Although the <code>partid</code> and
|
|
<code>partof</code> attributes could have been of type ID
|
|
and IDREF, respectively, in this schema they are treated
|
|
as character data, possibly materialized in a
|
|
straightforward way from a relational database. Each
|
|
<code>partof</code> attribute matches exactly one
|
|
<code>partid</code>. Parts having no <code>partof</code>
|
|
attribute are not contained in any other part.</p>
|
|
|
|
<p>The output data conforms to the following DTD:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<!DOCTYPE parttree [
|
|
<!ELEMENT parttree (part*)>
|
|
<!ELEMENT part (part*)>
|
|
<!ATTLIST part
|
|
partid CDATA #REQUIRED
|
|
name CDATA #REQUIRED>
|
|
]>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="parts-data" name="parts-data"></a>1.8.3 Sample
|
|
Data</h4>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
<partlist>
|
|
<part partid="0" name="car"/>
|
|
<part partid="1" partof="0" name="engine"/>
|
|
<part partid="2" partof="0" name="door"/>
|
|
<part partid="3" partof="1" name="piston"/>
|
|
<part partid="4" partof="2" name="window"/>
|
|
<part partid="5" partof="2" name="lock"/>
|
|
<part partid="10" name="skateboard"/>
|
|
<part partid="11" partof="10" name="board"/>
|
|
<part partid="12" partof="10" name="wheel"/>
|
|
<part partid="20" name="canoe"/>
|
|
</partlist>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="parts-queries-results" name=
|
|
"parts-queries-results"></a>1.8.4 Queries and
|
|
Results</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="parts-queries-results-q1" name=
|
|
"parts-queries-results-q1"></a>1.8.4.1 Q1</h5>
|
|
|
|
<p>Convert the sample document from "partlist" format
|
|
to "parttree" format (see DTD section for definitions).
|
|
In the result document, part containment is represented
|
|
by containment of one <part> element inside
|
|
another. Each part that is not part of any other part
|
|
should appear as a separate top-level element in the
|
|
output document.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare function local:one_level($p as element()) as element()
|
|
{
|
|
<part partid="{ $p/@partid }"
|
|
name="{ $p/@name }" >
|
|
{
|
|
for $s in doc("partlist.xml")//part
|
|
where $s/@partof = $p/@partid
|
|
return local:one_level($s)
|
|
}
|
|
</part>
|
|
};
|
|
|
|
<parttree>
|
|
{
|
|
for $p in doc("partlist.xml")//part[empty(@partof)]
|
|
return local:one_level($p)
|
|
}
|
|
</parttree>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="result">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<parttree>
|
|
<part partid="0" name="car">
|
|
<part partid="1" name="engine">
|
|
<part partid="3" name="piston"/>
|
|
</part>
|
|
<part partid="2" name="door">
|
|
<part partid="4" name="window"/>
|
|
<part partid="5" name="lock"/>
|
|
</part>
|
|
</part>
|
|
<part partid="10" name="skateboard">
|
|
<part partid="11" name="board"/>
|
|
<part partid="12" name="wheel"/>
|
|
</part>
|
|
<part partid="20" name="canoe"/>
|
|
</parttree>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="strong" name="strong"></a>1.9 Use Case "STRONG"
|
|
- queries that exploit strongly typed data</h3>
|
|
|
|
<div class="div3">
|
|
<h4><a id="strong-description" name=
|
|
"strong-description"></a>1.9.1 Description</h4>
|
|
|
|
<p>Strongly typed and weakly typed data are both
|
|
important kinds of XML data. Most of the queries in this
|
|
document focus on weakly typed data that is governed by a
|
|
DTD and does not contain XML Schema simple datatypes or
|
|
named complex types. This use case explores XQuery's
|
|
support for types, using data that is governed by a
|
|
strongly typed XML Schema <a href=
|
|
"#xmlschema-0">[XMLSchema0]</a>.</p>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="strong-schema" name="strong-schema"></a>1.9.2
|
|
Schema</h4>
|
|
|
|
<p>The schema for this example is the International
|
|
Purchase Order schema taken from the XML Schema Primer,
|
|
which imports a schema for addresses. The main schema is
|
|
found in a schema document named "ipo.xsd":</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
|
|
<?xml version="1.0"?>
|
|
<schema targetNamespace="http://www.example.com/IPO"
|
|
xmlns="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:ipo="http://www.example.com/IPO">
|
|
|
|
<annotation>
|
|
<documentation xml:lang="en">
|
|
International Purchase order schema for Example.com
|
|
Copyright 2000 Example.com. All rights reserved.
|
|
</documentation>
|
|
</annotation>
|
|
|
|
<!-- include address constructs -->
|
|
<include
|
|
schemaLocation="address.xsd"/>
|
|
|
|
<element name="purchaseOrder" type="ipo:PurchaseOrderType"/>
|
|
|
|
<element name="comment" type="string"/>
|
|
<element name="shipComment" type="string" substitutionGroup="ipo:comment"/>
|
|
<element name="customerComment" type="string" substitutionGroup="ipo:comment"/>
|
|
|
|
<complexType name="PurchaseOrderType">
|
|
<sequence>
|
|
<element name="shipTo" type="ipo:Address"/>
|
|
<element name="billTo" type="ipo:Address"/>
|
|
<element ref="ipo:comment" minOccurs="0"/>
|
|
<element name="items" type="ipo:Items"/>
|
|
</sequence>
|
|
<attribute name="orderDate" type="date"/>
|
|
</complexType>
|
|
|
|
<complexType name="Items">
|
|
<sequence>
|
|
<element name="item" minOccurs="0" maxOccurs="unbounded">
|
|
<complexType>
|
|
<sequence>
|
|
<element name="productName" type="string"/>
|
|
<element name="quantity">
|
|
<simpleType>
|
|
<restriction base="positiveInteger">
|
|
<maxExclusive value="100"/>
|
|
</restriction>
|
|
</simpleType>
|
|
</element>
|
|
<element name="USPrice" type="decimal"/>
|
|
<element ref="ipo:comment" minOccurs="0" maxOccurs="unbounded"/>
|
|
<element name="shipDate" type="date" minOccurs="0" maxOccurs="unbounded"/>
|
|
</sequence>
|
|
<attribute name="partNum" type="ipo:SKU" use="required"/>
|
|
</complexType>
|
|
</element>
|
|
</sequence>
|
|
</complexType>
|
|
|
|
<simpleType name="SKU">
|
|
<restriction base="string">
|
|
<pattern value="\d{3}-[A-Z]{2}"/>
|
|
</restriction>
|
|
</simpleType>
|
|
|
|
</schema>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The address constructs are found in a schema document
|
|
named "address.xsd":</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<schema targetNamespace="http://www.example.com/IPO"
|
|
xmlns="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:ipo="http://www.example.com/IPO">
|
|
|
|
<annotation>
|
|
<documentation xml:lang="en">
|
|
Addresses for International Purchase order schema
|
|
Copyright 2000 Example.com. All rights reserved.
|
|
</documentation>
|
|
</annotation>
|
|
|
|
<complexType name="Address">
|
|
<sequence>
|
|
<element name="name" type="string"/>
|
|
<element name="street" type="string"/>
|
|
<element name="city" type="string"/>
|
|
</sequence>
|
|
</complexType>
|
|
|
|
<complexType name="USAddress">
|
|
<complexContent>
|
|
<extension base="ipo:Address">
|
|
<sequence>
|
|
<element name="state" type="ipo:USState"/>
|
|
<element name="zip" type="positiveInteger"/>
|
|
</sequence>
|
|
</extension>
|
|
</complexContent>
|
|
</complexType>
|
|
|
|
<complexType name="UKAddress">
|
|
<complexContent>
|
|
<extension base="ipo:Address">
|
|
<sequence>
|
|
<element name="postcode" type="ipo:UKPostcode"/>
|
|
</sequence>
|
|
<attribute name="exportCode" type="positiveInteger" fixed="1"/>
|
|
</extension>
|
|
</complexContent>
|
|
</complexType>
|
|
|
|
<!-- other Address derivations for more countries -->
|
|
|
|
<simpleType name="USState">
|
|
<restriction base="string">
|
|
<enumeration value="AK"/>
|
|
<enumeration value="AL"/>
|
|
<enumeration value="AR"/>
|
|
<!-- and so on ... -->
|
|
<enumeration value="PA"/>
|
|
</restriction>
|
|
</simpleType>
|
|
|
|
<!-- simple type definition for UKPostcode -->
|
|
|
|
<simpleType name="UKPostcode">
|
|
<restriction base="string">
|
|
<pattern value="[A-Z]{1,2}[0-9R][0-9A-Z]? [0-9][A-Z]{2}"/>
|
|
</restriction>
|
|
</simpleType>
|
|
</schema>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="strong-data" name="strong-data"></a>1.9.3
|
|
Sample Data</h4>
|
|
|
|
<p>The sample data used for the query is found in a file
|
|
named "ipo.xml":</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0"?>
|
|
<ipo:purchaseOrder
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xmlns:ipo="http://www.example.com/IPO"
|
|
orderDate="1999-12-01">
|
|
|
|
<shipTo exportCode="1" xsi:type="ipo:UKAddress">
|
|
<name>Helen Zoe</name>
|
|
<street>47 Eden Street</street>
|
|
<city>Cambridge</city>
|
|
<postcode>CB1 1JR</postcode>
|
|
</shipTo>
|
|
|
|
<billTo xsi:type="ipo:USAddress">
|
|
<name>Robert Smith</name>
|
|
<street>8 Oak Avenue</street>
|
|
<city>Old Town</city>
|
|
<state>PA</state>
|
|
<zip>95819</zip>
|
|
</billTo>
|
|
|
|
<items>
|
|
<item partNum="833-AA">
|
|
<productName>Lapis necklace</productName>
|
|
<quantity>1</quantity>
|
|
<USPrice>99.95</USPrice>
|
|
<ipo:shipComment>
|
|
Use gold wrap if possible
|
|
</ipo:shipComment>
|
|
<ipo:customerComment>
|
|
Want this for the holidays!
|
|
</ipo:customerComment>
|
|
<shipDate>1999-12-05</shipDate>
|
|
</item>
|
|
</items>
|
|
|
|
</ipo:purchaseOrder>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div3">
|
|
<h4><a id="strong-queries-results" name=
|
|
"strong-queries-results"></a>1.9.4 Queries</h4>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q1" name=
|
|
"strong-queries-results-q1"></a>1.9.4.1 Q1</h5>
|
|
|
|
<p>Count the invoices shipped to the United
|
|
Kingdom.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo = "http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
count(
|
|
doc("ipo.xml")//shipTo[. instance of element(*, ipo:UKAddress)]
|
|
)
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
1
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In this dataset, the data for an address does not
|
|
contain the name of the country, and the name of the
|
|
shipTo element is the same regardless of the country to
|
|
which items are shipped. Only the types allow us to
|
|
identify UK addresses - in the schema, there is one
|
|
address type for UK addresses and another for US
|
|
addresses, both derived from a common base class. In
|
|
the above query, we use the UKAddress type to identify
|
|
invoices shipped to the UK.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q2" name=
|
|
"strong-queries-results-q2"></a>1.9.4.2 Q2</h5>
|
|
|
|
<p>Write a function that tests an American address to
|
|
check if it has the right zip code.</p>
|
|
|
|
<p>In our solution, we will assume zip code data is
|
|
stored in a file named "zips.xml", which looks like
|
|
this.</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<zips xmlns="http://www.example.com/zips">
|
|
<row>
|
|
<city>Old Town</city>
|
|
<state>PA</state>
|
|
<zip>95819</zip>
|
|
</row>
|
|
<row>
|
|
<city>Durham</city>
|
|
<state>NC</state>
|
|
<zip>27701</zip>
|
|
</row>
|
|
<row>
|
|
<city>Durham</city>
|
|
<state>NC</state>
|
|
<zip>27703</zip>
|
|
</row>
|
|
</zips>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>The corresponding schema document is named
|
|
"zips.xsd":</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
elementFormDefault="qualified"
|
|
targetNamespace="http://www.example.com/zips"
|
|
xmlns:zips="http://www.example.com/zips">
|
|
|
|
<xs:element name="zips">
|
|
<xs:complexType>
|
|
<xs:sequence>
|
|
<xs:element maxOccurs="unbounded" ref="zips:row"/>
|
|
</xs:sequence>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
<xs:element name="row">
|
|
<xs:complexType>
|
|
<xs:sequence>
|
|
<xs:element ref="zips:city"/>
|
|
<xs:element ref="zips:state"/>
|
|
<xs:element ref="zips:zip"/>
|
|
</xs:sequence>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
<xs:element name="city" type="xs:string"/>
|
|
<xs:element name="state" type="xs:string"/>
|
|
<xs:element name="zip" type="xs:integer"/>
|
|
</xs:schema>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
module namespace z="http://www.example.com/xq/zips";
|
|
import schema namespace ipo = "http://www.example.com/IPO" at "ipo.xsd";
|
|
import schema namespace zips = "http://www.example.com/zips" at "zips.xsd";
|
|
|
|
declare function z:zip-ok($a as element(*, ipo:USAddress))
|
|
as xs:boolean
|
|
{
|
|
some $i in doc("zips.xml")/zips:zips/element(zips:row)
|
|
satisfies $i/zips:city = $a/city
|
|
and $i/zips:state = $a/state
|
|
and $i/zips:zip = $a/zip
|
|
};
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="note">
|
|
<p class="prefix"><b>Note:</b></p>
|
|
|
|
<p>This is not a complete query, it is a function
|
|
that is meant to be called in a query. We will use
|
|
this function in Q4.</p>
|
|
</div>
|
|
|
|
<p>An attempt to call this function with an element of
|
|
the wrong address type raises an error. For instance,
|
|
you can not call z:zip-ok() with an element of type
|
|
UKAddress.</p>
|
|
|
|
<p>Note that the parameter for this function specifies
|
|
the type rather than the element name, since it is
|
|
written to be used with any element that has the proper
|
|
address type - for instance, in our sample schema,
|
|
'billTo' and 'shipTo' are two different elements which
|
|
may both have the USAddress type.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q3" name=
|
|
"strong-queries-results-q3"></a>1.9.4.3 Q3</h5>
|
|
|
|
<p>Write a function that tests a UK address to see if
|
|
it has the right postal code.</p>
|
|
|
|
<p>For England, we store the information needed to test
|
|
postal codes in a file named "postals.xml", which looks
|
|
like this:</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<postals xmlns="http://www.example.com/postals">
|
|
<row>
|
|
<city>Cambridge</city>
|
|
<prefix>CB</prefix>
|
|
</row>
|
|
<row>
|
|
<city>Oxford</city>
|
|
<prefix>OX</prefix>
|
|
</row>
|
|
</postals>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Here is the schema for the above file.</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
|
|
elementFormDefault="qualified"
|
|
targetNamespace="http://www.example.com/postals"
|
|
xmlns:postals="http://www.example.com/postals">
|
|
|
|
<xs:element name="postals">
|
|
<xs:complexType>
|
|
<xs:sequence>
|
|
<xs:element maxOccurs="unbounded" ref="postals:row"/>
|
|
</xs:sequence>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
<xs:element name="row">
|
|
<xs:complexType>
|
|
<xs:sequence>
|
|
<xs:element ref="postals:city"/>
|
|
<xs:element ref="postals:prefix"/>
|
|
</xs:sequence>
|
|
</xs:complexType>
|
|
</xs:element>
|
|
<xs:element name="city" type="xs:string"/>
|
|
<xs:element name="prefix" type="xs:string"/>
|
|
</xs:schema>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
module namespace p="http://www.example.com/xq/postals";
|
|
import schema namespace ipo = "http://www.example.com/IPO" at "ipo.xsd";
|
|
import schema namespace pst = "http://www.example.com/postals" at "postals.xsd";
|
|
|
|
declare function p:postal-ok($a as element(*, ipo:UKAddress))
|
|
as xs:boolean
|
|
{
|
|
some $i in doc("postals.xml")/pst:postals/element(pst:row)
|
|
satisfies $i/pst:city = $a/city
|
|
and starts-with($a/postcode, $i/pst:prefix)
|
|
};
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="note">
|
|
<p class="prefix"><b>Note:</b></p>
|
|
|
|
<p>This is not a complete query, it is a function
|
|
that is meant to be called in a query. We will use
|
|
this function in Q4.</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q4" name=
|
|
"strong-queries-results-q4"></a>1.9.4.4 Q4</h5>
|
|
|
|
<p>Determine whether the postal code or zip code for a
|
|
purchase order is right.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
import schema namespace pst="http://www.example.com/postals" at "postals.xsd";
|
|
import schema namespace zips="http://www.example.com/zips" at "zips.xsd";
|
|
|
|
import module namespace zok="http://www.example.com/xq/zips";
|
|
import module namespace pok="http://www.example.com/xq/postals";
|
|
|
|
declare function local:address-ok($a as element(*, ipo:Address))
|
|
as xs:boolean
|
|
{
|
|
typeswitch ($a)
|
|
case $zip as element(*, ipo:USAddress)
|
|
return zok:zip-ok($zip)
|
|
case $postal as element(*, ipo:UKAddress )
|
|
return pok:postal-ok($postal)
|
|
default return false()
|
|
};
|
|
|
|
let $shipTo := doc("ipo.xml")/element(ipo:purchaseOrder)/shipTo
|
|
let $billTo := doc("ipo.xml")/element(ipo:purchaseOrder)/billTo
|
|
return local:address-ok($shipTo) and local:address-ok($billTo)
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
true
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>This query calls the functions defined in Q2 and
|
|
Q3.</p>
|
|
|
|
<p>Note that the function local:address-ok() accepts
|
|
any element whose type is ipo:Address, which is the
|
|
base type for both ipo:UKAddress and ipo:USAddress.
|
|
Note also that this function uses a typeswitch to
|
|
select the appropriate function to test American or
|
|
British addresses. This can be considered a primitive
|
|
form of polymorphism.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q5" name=
|
|
"strong-queries-results-q5"></a>1.9.4.5 Q5</h5>
|
|
|
|
<p>Determine whether the shipping address matches the
|
|
billing address.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function local:names-match( $s as element(shipTo, ipo:Address),
|
|
$b as element(billTo, ipo:Address))
|
|
as xs:boolean
|
|
{
|
|
$s/name = $b/name
|
|
};
|
|
|
|
let $p := doc("ipo.xml")/element(ipo:purchaseOrder)
|
|
return local:names-match( $p/shipTo, $p/billTo )
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
false
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In this function, note that the function specifies
|
|
both the element names and the type names for its
|
|
parameters.</p>
|
|
|
|
<p>Note also that the schema says both of these
|
|
elements are local elements, defined only within a
|
|
purchase order. The element test matches an element
|
|
with a given name even if that element is locally
|
|
declared.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q6" name=
|
|
"strong-queries-results-q6"></a>1.9.4.6 Q6</h5>
|
|
|
|
<p>Determine whether the invoice has a USAddress and
|
|
gives all prices as USPrices.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
let $p := doc("ipo.xml")//element(ipo:purchaseOrder)
|
|
let $billTo := $p/billTo
|
|
let $shipTo := $p/shipTo
|
|
return
|
|
if ($billTo instance of element(*, ipo:USAddress))
|
|
then every $i in $p/items/item
|
|
satisfies (exists($i/USPrice))
|
|
else false()
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Result:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
true
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Addresses are part of a type hierarchy, and the
|
|
element name, ipo:shipTo, does not tell us whether an
|
|
address is a US price or not, so we have to test the
|
|
type.</p>
|
|
|
|
<p>This example is rather contrived, since the schema
|
|
specifies that all prices are USPrice elements.
|
|
Nevertheless, it illustrates the ability to easily
|
|
combine information derived from type information with
|
|
information derived from structure.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q7" name=
|
|
"strong-queries-results-q7"></a>1.9.4.7 Q7</h5>
|
|
|
|
<p>Write a function that returns the text of a comment.
|
|
Call this function for each shipping comment found in
|
|
an item shipped to Helen Zoe on the date
|
|
1999-12-01.</p>
|
|
|
|
<p>Our source schema models comments with the following
|
|
substitution groups:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<element name="comment" type="string"/>
|
|
. . .
|
|
<element name="shipComment" type="string"
|
|
substitutionGroup="ipo:comment"/>
|
|
<element name="customerComment" type="string"
|
|
substitutionGroup="ipo:comment"/>
|
|
</pre>
|
|
</div>
|
|
|
|
<p>The following sample data contains instances of
|
|
these substitution groups:</p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<items>
|
|
<item partNum="833-AA">
|
|
<productName>Lapis necklace</productName>
|
|
<quantity>1</quantity>
|
|
<USPrice>99.95</USPrice>
|
|
<ipo:shipComment>
|
|
Use gold wrap if possible
|
|
</ipo:shipComment>
|
|
<ipo:customerComment>
|
|
Want this for the holidays!
|
|
</ipo:customerComment>
|
|
<shipDate>1999-12-05</shipDate>
|
|
</item>
|
|
</items>
|
|
</pre>
|
|
</div>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function local:comment-text($c as schema-element(ipo:comment))
|
|
as xs:string
|
|
{
|
|
xs:string( $c )
|
|
};
|
|
|
|
for $p in doc("ipo.xml")//element(ipo:purchaseOrder),
|
|
$t in local:comment-text( $p//ipo:shipComment )
|
|
where $p/shipTo/name="Helen Zoe"
|
|
and $p/@orderDate = xs:date("1999-12-01")
|
|
return $t
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In this query, the function specifies ipo:comment as
|
|
the name of the element, but any element in the
|
|
substitution group of ipo:comment may also be passed to
|
|
this function. That means that we can call the same
|
|
function for ipo:shipComment elements or
|
|
ipo:customerComment elements - for instance, the
|
|
following query also succeeds:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function local:comment-text($c as schema-element(ipo:comment))
|
|
as xs:string
|
|
{
|
|
xs:string( $c )
|
|
};
|
|
|
|
for $p in doc("ipo.xml")/schema-element(ipo:purchaseOrder)
|
|
where $p/shipTo/name="Helen Zoe"
|
|
and $p/@orderDate = xs:date("1999-12-01")
|
|
return local:comment-text( $p//ipo:customerComment )
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q8" name=
|
|
"strong-queries-results-q8"></a>1.9.4.8 Q8</h5>
|
|
|
|
<p>Find all comments found in an item shipped to Helen
|
|
Zoe on the date 1999-12-01, including all elements in
|
|
the substitution group for ipo:comment.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
for $p in doc("ipo.xml")//element(ipo:purchaseOrder)
|
|
where $p/shipTo/name="Helen Zoe"
|
|
and $p/@orderDate = xs:date("1999-12-01")
|
|
return $p//schema-element(ipo:comment)
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Note that <code>schema-element(ipo:comment)</code>
|
|
matches any valid element in the substitution group of
|
|
<code>ipo:comment</code>.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q9" name=
|
|
"strong-queries-results-q9"></a>1.9.4.9 Q9</h5>
|
|
|
|
<p>Write a function that returns all comments found on
|
|
an element, whether an item element or some other
|
|
element that may have a comment.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function local:comments-for-element( $e as element() )
|
|
as element(ipo:comment)*
|
|
{
|
|
$e/schema-element(ipo:comment)
|
|
};
|
|
|
|
for $p in doc("ipo.xml")//element(ipo:purchaseOrder)
|
|
where $p/shipTo/name="Helen Zoe"
|
|
and $p/@orderDate = xs:date("1999-12-01")
|
|
return
|
|
<comments name="{$p/shipTo/name}" date="{$p/@orderDate}">
|
|
{
|
|
local:comments-for-element( $p )
|
|
}
|
|
{
|
|
for $i in $p//item
|
|
return local:comments-for-element( $i )
|
|
}
|
|
</comments>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>In this schema, comments can occur on either a
|
|
purchase order or on an item. In a more complete
|
|
schema, they could presumably occur in other areas as
|
|
well. This function returns all comments found on an
|
|
element, regardless of the name of the element,
|
|
illustrating the need to write functions that can
|
|
accept any element as a parameter.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q10" name=
|
|
"strong-queries-results-q10"></a>1.9.4.10 Q10</h5>
|
|
|
|
<p>Write a function that determines whether the person
|
|
listed in a billTo element is known to be a deadbeat,
|
|
using a US database.</p>
|
|
|
|
<div class="note">
|
|
<p class="prefix"><b>Note:</b></p>
|
|
|
|
<p>In American slang, a "deadbeat" is a person who
|
|
fails to meet a financial obligation.</p>
|
|
</div>
|
|
|
|
<p>This query assumes that "deadbeats.xml" lists the
|
|
names deadbeats in the following format:</p>
|
|
|
|
<div class="data">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<?xml version="1.0"?>
|
|
<deadbeats>
|
|
<row>
|
|
<name>Dick Dastardly</name>
|
|
<creditrating>0</creditrating>
|
|
</row>
|
|
<row>
|
|
<name>Peter Doubt</name>
|
|
<creditrating>1</creditrating>
|
|
</row>
|
|
<row>
|
|
<name>Robert Smith</name>
|
|
<creditrating>0</creditrating>
|
|
</row>
|
|
</deadbeats>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function local:deadbeat( $b as element(billTo, ipo:USAddress) )
|
|
as xs:boolean
|
|
{
|
|
$b/name = doc("deadbeats.xml")/deadbeats/row/name
|
|
};
|
|
|
|
for $p in doc("ipo.xml")//element(ipo:purchaseOrder)
|
|
where local:deadbeat( $p/element(billTo) )
|
|
return <warning>{ string($p/billTo/name) } is a known deadbeat!</warning>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p><em>Expected Output:</em></p>
|
|
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<warning>Robert Smith is a known deadbeat!</warning>
|
|
|
|
</pre>
|
|
</div>
|
|
|
|
<p>Note that this function specifies both the element
|
|
name and the type. The element name is specified
|
|
because we do not want to embarrass recipients of gifts
|
|
by calling this function for the shipping address by
|
|
mistake. The type is specified because we would need to
|
|
use a different database to identify deadbeats in other
|
|
countries.</p>
|
|
|
|
<p>Also note that the XML file in this example has no
|
|
schema. We assume that the processor omits validation
|
|
or does lax validation.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q11" name=
|
|
"strong-queries-results-q11"></a>1.9.4.11 Q11</h5>
|
|
|
|
<p>Write a function that computes the total price for a
|
|
sequence of item elements.</p>
|
|
|
|
<p><em>Solution in XQuery:</em></p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
module namespace c="http://www.example.com/calc";
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
|
|
declare function c:total-price( $i as element(item)* )
|
|
as xs:decimal
|
|
{
|
|
let $subtotals := for $s in $i return $s/quantity * $s/USPrice
|
|
return sum( $subtotals )
|
|
};
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>Here is a query that calls the function we just
|
|
defined to get the total for an invoice (before
|
|
calculating taxes and shipping charges):</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
import schema namespace ipo="http://www.example.com/IPO" at "ipo.xsd";
|
|
import module namespace calc = "http://www.example.com/calc";
|
|
|
|
for $p in doc("ipo.xml")//element(ipo:purchaseOrder)
|
|
where $p/shipTo/name="Helen Zoe"
|
|
and $p/@orderDate = xs:date("1999-12-01")
|
|
return calc:total-price($p//item)
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>This query illustrates the need to be able to pass a
|
|
sequence as a parameter to a function.</p>
|
|
|
|
<p>If the input document contains more than one
|
|
purchase order for the given date and person, a total
|
|
will be computed for all purchase orders.</p>
|
|
</div>
|
|
|
|
<div class="div4">
|
|
<h5><a id="strong-queries-results-q12" name=
|
|
"strong-queries-results-q12"></a>1.9.4.12 Q12</h5>
|
|
|
|
<p>In <a href="#xmlschema-0">[XMLSchema0]</a>, a
|
|
Quarterly Report is created, summarizing the types of
|
|
products that have been billed on a per region basis.
|
|
It creates the following sample report:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<purchaseReport
|
|
xmlns="http://www.example.com/Report"
|
|
period="P3M" periodEnding="1999-12-31">
|
|
|
|
<regions>
|
|
<zip code="95819">
|
|
<part number="872-AA" quantity="1"/>
|
|
<part number="926-AA" quantity="1"/>
|
|
<part number="833-AA" quantity="1"/>
|
|
<part number="455-BX" quantity="1"/>
|
|
</zip>
|
|
<zip code="63143">
|
|
<part number="455-BX" quantity="4"/>
|
|
</zip>
|
|
</regions>
|
|
|
|
<parts>
|
|
<part number="872-AA">Lawnmower</part>
|
|
<part number="926-AA">Baby Monitor</part>
|
|
<part number="833-AA">Lapis Necklace</part>
|
|
<part number="455-BX">Sturdy Shelves</part>
|
|
</parts>
|
|
|
|
</purchaseReport>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>This is the schema given for the above report:</p>
|
|
|
|
<div class="schema">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
<schema targetNamespace="http://www.example.com/Report"
|
|
xmlns="http://www.w3.org/2001/XMLSchema"
|
|
xmlns:r="http://www.example.com/Report"
|
|
xmlns:xipo="http://www.example.com/IPO"
|
|
elementFormDefault="qualified">
|
|
|
|
<!-- for SKU -->
|
|
<import namespace="http://www.example.com/IPO"/>
|
|
|
|
<annotation>
|
|
<documentation xml:lang="en">
|
|
Report schema for Example.com
|
|
Copyright 2000 Example.com. All rights reserved.
|
|
</documentation>
|
|
</annotation>
|
|
|
|
<element name="purchaseReport">
|
|
<complexType>
|
|
<sequence>
|
|
<element name="regions" type="r:RegionsType">
|
|
<keyref name="dummy2" refer="r:pNumKey">
|
|
<selector xpath="r:zip/r:part"/>
|
|
<field xpath="@number"/>
|
|
</keyref>
|
|
</element>
|
|
|
|
<element name="parts" type="r:PartsType"/>
|
|
</sequence>
|
|
<attribute name="period" type="duration"/>
|
|
<attribute name="periodEnding" type="date"/>
|
|
</complexType>
|
|
|
|
<unique name="dummy1">
|
|
<selector xpath="r:regions/r:zip"/>
|
|
<field xpath="@code"/>
|
|
</unique>
|
|
|
|
<key name="pNumKey">
|
|
<selector xpath="r:parts/r:part"/>
|
|
<field xpath="@number"/>
|
|
</key>
|
|
</element>
|
|
|
|
<complexType name="RegionsType">
|
|
<sequence>
|
|
<element name="zip" maxOccurs="unbounded">
|
|
<complexType>
|
|
<sequence>
|
|
<element name="part" maxOccurs="unbounded">
|
|
<complexType>
|
|
<complexContent>
|
|
<restriction base="anyType">
|
|
<attribute name="number" type="xipo:SKU"/>
|
|
<attribute name="quantity" type="positiveInteger"/>
|
|
</restriction>
|
|
</complexContent>
|
|
</complexType>
|
|
</element>
|
|
</sequence>
|
|
<attribute name="code" type="positiveInteger"/>
|
|
</complexType>
|
|
</element>
|
|
</sequence>
|
|
</complexType>
|
|
|
|
<complexType name="PartsType">
|
|
<sequence>
|
|
<element name="part" maxOccurs="unbounded">
|
|
<complexType>
|
|
<simpleContent>
|
|
<extension base="string">
|
|
<attribute name="number" type="xipo:SKU"/>
|
|
</extension>
|
|
</simpleContent>
|
|
</complexType>
|
|
</element>
|
|
</sequence>
|
|
</complexType>
|
|
|
|
</schema>
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
|
|
<p>This report, which lists products sold by zip code,
|
|
is based on the same international purchase report used
|
|
in previous queries.</p>
|
|
|
|
<p>Here is a query that generates the desired report
|
|
from a collection that contains US purchase orders:</p>
|
|
|
|
<div class="xquery">
|
|
<div class="exampleInner">
|
|
<pre>
|
|
declare namespace rpt="http://www.example.com/Report";
|
|
|
|
let $orders := doc('ipo.xml')/schema-element(ipo:purchaseOrder)
|
|
[@orderDate ge xs:date("1999-09-01")
|
|
and @orderDate le xs:date("1999-12-31")]
|
|
let $items := $orders/items/item
|
|
let $zips := distinct-values($orders/billTo/zip)
|
|
let $parts := distinct-values($items/@partNum)
|
|
return
|
|
<rpt:purchaseReport>
|
|
<rpt:regions>
|
|
{
|
|
for $zip in $zips
|
|
order by $zip
|
|
return
|
|
<rpt:zip code="{$zip}">
|
|
{
|
|
for $part in $parts
|
|
let $hits := $orders[ billTo/zip = $zip and items/item/@partNum = $part]
|
|
let $quantity := sum($hits//item[@partNum=$part]/quantity)
|
|
where count($hits) > 0
|
|
order by $part
|
|
return
|
|
<rpt:part number="{$part}" quantity="{$quantity}"/>
|
|
}
|
|
</rpt:zip>
|
|
}
|
|
</rpt:regions>
|
|
<rpt:parts>
|
|
{
|
|
for $part in $parts
|
|
return
|
|
<rpt:part number="{$part}">
|
|
{
|
|
string($items[@partNum = $part]/productName)
|
|
}
|
|
</rpt:part>
|
|
}
|
|
</rpt:parts>
|
|
</rpt:purchaseReport>
|
|
|
|
</pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="back">
|
|
<div class="div1">
|
|
<h2><a id="acknowledgements" name="acknowledgements"></a>A
|
|
Acknowledgements</h2>
|
|
|
|
<p>The editors thank the members of the XML Query Working
|
|
Group, which produced the material in this document.</p>
|
|
|
|
<p>The use cases in this paper were contributed by the
|
|
following individuals:</p>
|
|
|
|
<table border="1">
|
|
<tbody>
|
|
<tr>
|
|
<td>Use Case "R"</td>
|
|
|
|
<td>Don Chamberlin</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "XMP"</td>
|
|
|
|
<td>Mary Fernandez, Jerome Simeon, Phil Wadler</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "TREE"</td>
|
|
|
|
<td>Jonathan Robie</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "PARTS"</td>
|
|
|
|
<td>Michael Rys</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "NS"</td>
|
|
|
|
<td>Ingo Macherius</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "STRING"</td>
|
|
|
|
<td>Umit Yalcinalp</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "SEQ"</td>
|
|
|
|
<td>Jonathan Robie</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "SGML"</td>
|
|
|
|
<td>Paula Angerstein</td>
|
|
</tr>
|
|
|
|
<tr>
|
|
<td>Use Case "STRONG"</td>
|
|
|
|
<td>Jonathan Robie and Phil Wadler. Schemas and data
|
|
taken from <a href=
|
|
"#xmlschema-0">[XMLSchema0]</a>.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
<p>Use case "XMP" has been previously published in <a href=
|
|
"#Fernandez99">[Fernandez]</a>. Use cases "Tree" and "Seq"
|
|
have been previously published in <a href=
|
|
"#Robie99">[Robie99]</a>.</p>
|
|
|
|
<p>The editors also wish to thank the members of the other
|
|
W3C Working Groups who have commented on earlier drafts, and
|
|
Michael Dyck and for his critical reading and helpful
|
|
suggestions. Michael Wenger found several bugs, and also
|
|
found more elegant solutions to some of the use cases, which
|
|
are now included in this document.</p>
|
|
</div>
|
|
|
|
<div class="div1">
|
|
<h2><a id="ChangeLog" name="ChangeLog"></a>B Change Log
|
|
(Non-Normative)</h2>
|
|
|
|
<div class="div2">
|
|
<h3><a id="id-2006-05-08" name="id-2006-05-08"></a>B.1 8
|
|
May 2006</h3>
|
|
|
|
<ul>
|
|
<li>
|
|
<p>Updated status section.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Added note on static typing.</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="id-2005-08-31" name="id-2005-08-31"></a>B.2 31
|
|
Aug 2005</h3>
|
|
|
|
<ul>
|
|
<li>
|
|
<p>Comments should now be directed to Bugzilla.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Massimo and Dana have each changed their
|
|
affiliation.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>IPR statement has been changed to reflect that this
|
|
will progress to a Note rather than a
|
|
Recommendation.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Provided link to changes to Use Case Strong errors
|
|
in Mozilla.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Minor editorial changes.</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="id-2005-07-11" name="id-2005-07-11"></a>B.3 11
|
|
July 2005</h3>
|
|
|
|
<p>Aligned with current XQuery Working Draft.</p>
|
|
|
|
<p>Fixed the following bugs.</p>
|
|
|
|
<ol class="enumar">
|
|
<li>
|
|
<p>rdb-queries-results-q9 now uses month-from-date()
|
|
and year-from-date(). The "get-" prefix, now obsolete,
|
|
has been removed. Fixes <a href=
|
|
"http://www.w3.org/Member/bugzilla/show_bug.cgi?id=119">
|
|
Bug 119</a>.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Removed whitespace from the price element in the
|
|
source document for Use Case "XMP" - it was
|
|
<price> 65.95</price>, and is now
|
|
<price> 65.95</price>. Fixes <a href=
|
|
"http://www.w3.org/Member/bugzilla/show_bug.cgi?id=121">
|
|
Bug 121</a>.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Removed trailing whitespace from the <remark/>
|
|
elements used in "auction.xml". Fixes bug <a href=
|
|
"http://www.w3.org/Member/bugzilla/show_bug.cgi?id=124">
|
|
Bug 124</a>.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Need to discuss <a href=
|
|
"http://www.w3.org/Member/bugzilla/show_bug.cgi?id=148">
|
|
Bug 148</a>. Did not see the problems with Q1 and Q2 in
|
|
the document. Have some questions about the best
|
|
treatment of Q4 and Q5.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Fixed many errors in Use Case "Strong" as proposed
|
|
<a href=
|
|
"http://www.w3.org/Bugs/Public/show_bug.cgi?id=1202">here</a>.</p>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="id-2005-04-04" name="id-2005-04-04"></a>B.4 04
|
|
April 2005</h3>
|
|
|
|
<p>Alignment with 04 April 2005 Working Draft of XQuery.
|
|
This actually did not change the results of any of the
|
|
queries, so it was just a matter of tweaking the front
|
|
matter.</p>
|
|
</div>
|
|
|
|
<div class="div2">
|
|
<h3><a id="id-2005-01-30" name="id-2005-01-30"></a>B.5 30
|
|
Jan 2005</h3>
|
|
|
|
<p>Many changes have been made since the last release,
|
|
particularly:</p>
|
|
|
|
<ul>
|
|
<li>
|
|
<p>Moved to the 29 October XQuery Working Drafts.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Corrected numerous NS queries to reflect current
|
|
handling of namespaces.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Changed use of locally declared elements and
|
|
attributes in SequenceType to match current XQuery
|
|
language.</p>
|
|
</li>
|
|
|
|
<li>
|
|
<p>Fixed reported bugs, ran most queries using two
|
|
implementations.</p>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="div1">
|
|
<h2><a id="references" name="references"></a>C References
|
|
(Non-Normative)</h2>
|
|
|
|
<p>The following references are some of the works considered
|
|
by the WG in deriving its use cases.</p>
|
|
|
|
<dl>
|
|
<dt class="label"><span><a id="Cotton98" name=
|
|
"Cotton98"></a>Cotton98</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TandS/QL/QL98/pp/queryreq.html"><cite>
|
|
Candidate Requirements for XML Query</cite></a>, Paul
|
|
Cotton and Ashok Malhotra, 1998. In Query Languages 98
|
|
(QL'98).
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="DOM" name=
|
|
"DOM"></a>DOM</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/1999/CR-DOM-Level-2-19991210/"><cite>
|
|
Document Object Model (DOM), Level 2
|
|
Specification</cite></a>. W3C Candidate Recommendation.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xpath-functions" name=
|
|
"xpath-functions"></a>FandO</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/xpath-functions/"><cite>XQuery
|
|
1.0 and XPath 2.0 Functions and Operators</cite></a>,
|
|
Ashok Malhotra, Jim Melton, and Norman Walsh, Editors.
|
|
World Wide Web Consortium, 23 Jan 2007. This version is
|
|
http://www.w3.org/TR/2007/REC-xpath-functions-20070123/.
|
|
The <a href=
|
|
"http://www.w3.org/TR/xpath-functions/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xpath-functions/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="Fernandez99" name=
|
|
"Fernandez99"></a>Fernandez</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/1999/09/ql/docs/xquery.html"><cite>XML
|
|
Query Languages: Experiences and Exemplars</cite></a>,
|
|
Mary Fernandez, Jerome Simeon, Philip Wadler, 1999.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xml-infoset" name=
|
|
"xml-infoset"></a>Infoset</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xml-infoset"><cite>XML
|
|
Information Set (Second Edition)</cite></a>, John Cowan
|
|
and Richard Tobin, Editors. World Wide Web Consortium,
|
|
04 Feb 2004. This version is
|
|
http://www.w3.org/TR/2004/REC-xml-infoset-20040204. The
|
|
<a href="http://www.w3.org/TR/xml-infoset">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xml-infoset.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="Maier98" name=
|
|
"Maier98"></a>Maier98</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TandS/QL/QL98/pp/maier.html"><cite>Database
|
|
Desiderata for an XML Query Language</cite></a>, David
|
|
Maier, 1998. In Query Languages 98 (QL'98).
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="REC-xml-names" name=
|
|
"REC-xml-names"></a>Namespaces</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/REC-xml-names"><cite>Namespaces
|
|
in XML</cite></a>, Andrew Layman, Dave Hollander, and
|
|
Tim Bray, Editors. World Wide Web Consortium,
|
|
14 Jan 1999. This version is
|
|
http://www.w3.org/TR/1999/REC-xml-names-19990114. The
|
|
<a href="http://www.w3.org/TR/REC-xml-names">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/REC-xml-names.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="Robie99" name=
|
|
"Robie99"></a>Robie99</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/XML/Group/1999/10/xquery-tree.html"><cite>
|
|
The Tree Structure of XML Queries</cite></a>, Jonathan
|
|
Robie.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="REC-xml" name=
|
|
"REC-xml"></a>XML</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xml"><cite>Extensible
|
|
Markup Language (XML) 1.0 (Fourth Edition)</cite></a>,
|
|
Eve Maler, Jean Paoli, François Yergeau, <em>et.
|
|
al.</em>, Editors. World Wide Web Consortium,
|
|
16 Aug 2006. This version is
|
|
http://www.w3.org/TR/2006/REC-xml-20060816. The
|
|
<a href="http://www.w3.org/TR/xml">latest version</a>
|
|
is available at http://www.w3.org/TR/xml.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xmlschema-0" name=
|
|
"xmlschema-0"></a>XMLSchema0</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xmlschema-0/"><cite>XML
|
|
Schema Part 0: Primer Second Edition</cite></a>, David
|
|
C. Fallside and Priscilla Walmsley, Editors. World Wide
|
|
Web Consortium, 28 Oct 2004. This version is
|
|
http://www.w3.org/TR/2004/REC-xmlschema-0-20041028/.
|
|
The <a href="http://www.w3.org/TR/xmlschema-0/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xmlschema-0/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xmlschema-1" name=
|
|
"xmlschema-1"></a>XMLSchema1</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xmlschema-1/"><cite>XML
|
|
Schema Part 1: Structures Second Edition</cite></a>,
|
|
Henry S. Thompson, David Beech, Noah Mendelsohn, and
|
|
Murray Maloney, Editors. World Wide Web Consortium,
|
|
28 Oct 2004. This version is
|
|
http://www.w3.org/TR/2004/REC-xmlschema-1-20041028/.
|
|
The <a href="http://www.w3.org/TR/xmlschema-1/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xmlschema-1/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xmlschema-2" name=
|
|
"xmlschema-2"></a>XMLSchema2</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xmlschema-2/"><cite>XML
|
|
Schema Part 2: Datatypes Second Edition</cite></a>,
|
|
Paul V. Biron and Ashok Malhotra, Editors. World Wide
|
|
Web Consortium, 28 Oct 2004. This version is
|
|
http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/.
|
|
The <a href="http://www.w3.org/TR/xmlschema-2/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xmlschema-2/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xpath20" name=
|
|
"xpath20"></a>XPath</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xpath20/"><cite>XML Path
|
|
Language (XPath) 2.0</cite></a>, Don Chamberlin ,
|
|
Anders Berglund, Scott Boag, <em>et. al.</em>, Editors.
|
|
World Wide Web Consortium, 23 Jan 2007. This version is
|
|
http://www.w3.org/TR/2007/REC-xpath20-20070123/. The
|
|
<a href="http://www.w3.org/TR/xpath20/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xpath20/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xquery" name=
|
|
"xquery"></a>XQuery</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xquery/"><cite>XQuery
|
|
1.0: An XML Query Language</cite></a>, Don Chamberlin ,
|
|
Anders Berglund, Scott Boag, <em>et. al.</em>, Editors.
|
|
World Wide Web Consortium, 23 Jan 2007. This version is
|
|
http://www.w3.org/TR/2007/REC-xquery-20070123/. The
|
|
<a href="http://www.w3.org/TR/xquery/">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xquery/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xquery-requirements" name=
|
|
"xquery-requirements"></a>XQuery Requirements</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/xquery-requirements/"><cite>XML
|
|
Query (XQuery) Requirements</cite></a>, Don Chamberlin,
|
|
Peter Fankhauser, Massimo Marchiori, and Jonathan
|
|
Robie, Editors. World Wide Web Consortium,
|
|
3 Jun 2005. This version is
|
|
http://www.w3.org/TR/2005/WD-xquery-requirements-20050603/.
|
|
The <a href=
|
|
"http://www.w3.org/TR/xquery-requirements">latest
|
|
version</a> is available at
|
|
http://www.w3.org/TR/xquery-requirements/.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="xslt" name=
|
|
"xslt"></a>XSLT</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href="http://www.w3.org/TR/xslt"><cite>XSL
|
|
Transformations (XSLT) Version 1.0</cite></a>, James
|
|
Clark, Editor. World Wide Web Consortium,
|
|
16 Nov 1999. This version is
|
|
http://www.w3.org/TR/1999/REC-xslt-19991116. The
|
|
<a href="http://www.w3.org/TR/xslt">latest version</a>
|
|
is available at http://www.w3.org/TR/xslt.
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="UseCaseQueries" name=
|
|
"UseCaseQueries"></a>Use Case Sample Queries</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/2007/NOTE-xquery-use-cases-20070323/xquery-use-case-queries.txt">
|
|
<cite>Queries from this document</cite></a>, presented
|
|
in a single file
|
|
</div>
|
|
</dd>
|
|
|
|
<dt class="label"><span><a id="XQueryQueries" name=
|
|
"XQueryQueries"></a>XQuery Sample Queries</span></dt>
|
|
|
|
<dd>
|
|
<div>
|
|
<a href=
|
|
"http://www.w3.org/TR/2007/NOTE-xquery-use-cases-20070323/xquery-wd-queries.txt">
|
|
<cite>Queries from the XQuery document</cite></a>,
|
|
presented in a single file.
|
|
</div>
|
|
</dd>
|
|
</dl>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|