XQuery
XQuery
XQuery is a functional query language used to retrieve information stored in XML format. It is same as for XML what SQL
is for databases. It was designed to query XML data.
XQuery is built on XPath expressions. It is a W3C recommendation which is supported by all major databases.
"XQuery is a standardized language for combining documents, databases, Web pages and almost anything else. It is very
widely implemented. It is powerful and easy to learn. XQuery is replacing proprietary middleware languages and Web
Application development languages. XQuery is replacing complex Java or C++ programs with a few lines of code. XQuery
is simpler to work with and easier to maintain than many other alternatives."
XQuery was designed by W3C and first appeared in 2007. It became the W3C recommendation on January 23, 2007. XQuery
3.0 is a W3C recommendation from April 8, 2014.
What does it do
XQuery is a functional language which is responsible for finding and extracting elements and attributes from XML documents.
XQuery Features
There are many features of XQuery query language. A list of top features are given below:
o XQuery is a functional language. It is used to retrieve and query XML based data.
o XQuery is expression-oriented programming language with a simple type system.
o XQuery is analogous to SQL. For example: As SQL is query language for databases, same as XQuery is query
language for XML.
o XQuery is XPath based and uses XPath expressions to navigate through XML documents.
o XQuery is a W3C standard and universally supported by all major databases.
Advantages of XQuery
o XQuery can be used to retrieve both hierarchal and tabular data.
o XQuery can also be used to query tree and graphical structures.
o XQUery can used to build web pages.
o XQuery can be used to query web pages.
o XQuery is best for XML-based databases and object-based databases. Object databases are much more flexible and
powerful than purely tabular databases.
o XQuery can be used to transform XML documents into XHTML documents.
This chapter elaborates how to set up XQuery library in a local development environment.
We are using an open source standalone XQuery processor Saxon Home Edition (Saxon-HE) which is widely used. This
processor supports XSLT 2.0, XQuery 3.0, and XPath 3.0 and is highly optimized for performance. Saxon XQuery
processor can be used without having any XML database. We'll use a simple XML document as our database in our
examples.
In order to use Saxon XQuery processor, you should have saxon9he.jar, saxon9-test.jar, saxon9-unpack, saxon9-xqj.jar in
your application's classpath. These jar files are available in the download file SaxonHE9-6-0-1J.zip Download SaxonHE9-
6-0-1J.zip.
Example
We'll use the Java-based Saxon XQuery processor to test books.xqy, a file containing XQuery expression against our
sample XML document, i.e., books.xml.
In this example, we'll see how to write and process a query to get the title elements of the books whose price is greater than
30.
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book category="JAVA">
<title lang="en">Learn Java in 24 Hours</title>
<author>Robert</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="DOTNET">
<title lang="en">Learn .Net in 24 hours</title>
<author>Peter</author>
<year>2011</year>
<price>40.50</price>
</book>
<book category="XML">
<title lang="en">Learn XQuery in 24 hours</title>
<author>Robert</author>
<author>Peter</author>
<year>2013</year>
<price>50.00</price>
</book>
<book category="XML">
<title lang="en">Learn XPath in 24 hours</title>
<author>Jay Ban</author>
<year>2010</year>
<price>16.50</price>
</book>
</books>
books.xqy
for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title
XQueryTester.java
package com.tutorialspoint.xquery;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import javax.xml.xquery.XQPreparedExpression;
import javax.xml.xquery.XQResultSequence;
import com.saxonica.xqj.SaxonXQDataSource;
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (XQException e) {
e.printStackTrace();
}
}
while (result.next()) {
System.out.println(result.getItemAsString(null));
}
}
}
Steps to Execute XQuery against XML
Step 1 − Copy XQueryTester.java to any location, say, E: > java
Step 2 − Copy books.xml to the same location, E: > java
Step 3 − Copy books.xqy to the same location, E: > java
Step 4 − Compile XQueryTester.java using console. Make sure you have JDK 1.5 or later installed on your machine
and classpaths are configured. For details on how to use JAVA, see our JAVA Tutorial
E:\java\javac XQueryTester.java
Step 5 − Execute XQueryTester
E:\java\java XQueryTester
Output
Example
Following is a sample XML document containing the records of a bookstore of various books.
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book category="JAVA">
<title lang="en">Learn Java in 24 Hours</title>
<author>Robert</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="DOTNET">
<title lang="en">Learn .Net in 24 hours</title>
<author>Peter</author>
<year>2011</year>
<price>70.50</price>
</book>
<book category="XML">
<title lang="en">Learn XQuery in 24 hours</title>
<author>Robert</author>
<author>Peter</author>
<year>2013</year>
<price>50.00</price>
</book>
<book category="XML">
<title lang="en">Learn XPath in 24 hours</title>
<author>Jay Ban</author>
<year>2010</year>
<price>16.50</price>
</book>
</books>
Following is a sample Xquery document containing the query expression to be executed on the above XML document. The
purpose is to get the title elements of those XML nodes where the price is greater than 30.
books.xqy
for $x in doc("books.xml")/books/book
where $x/price>30
return $x/title
Result
<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>
Verify Result
To verify the result, replace the contents of books.xqy (given in the Environment Setup chapter) with the above XQuery
expression and execute the XQueryTester java program.
XQuery Expressions
Use of functions
doc("books.xml")
doc() is one of the XQuery functions that is used to locate the XML source. Here we've passed "books.xml". Considering
the relative path, books.xml should lie in the same path where books.xqy is present.
XQuery treats xml data as objects. In the above example, $x represents the selected node, while the for loop iterates over the
collection of nodes.
As $x represents the selected node, "/" is used to get the value of the required element; "where" clause is used to put a
condition on the search results.
As $x represents the selected node, "/" is used to get the value of the required element, price, title; "return" clause is used to
return the elements from the search results.
XQuery - FLWOR
FLWOR is an acronym that stands for "For, Let, Where, Order by, Return". The following list shows what they account for
in a FLWOR expression −
Following is a sample XML document that contains information on a collection of books. We will use a FLWOR
expression to retrieve the titles of those books with a price greater than 30.
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book category="JAVA">
<title lang="en">Learn Java in 24 Hours</title>
<author>Robert</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="DOTNET">
<title lang="en">Learn .Net in 24 hours</title>
<author>Peter</author>
<year>2011</year>
<price>70.50</price>
</book>
<book category="XML">
<title lang="en">Learn XQuery in 24 hours</title>
<author>Robert</author>
<author>Peter</author>
<year>2013</year>
<price>50.00</price>
</book>
<book category="XML">
<title lang="en">Learn XPath in 24 hours</title>
<author>Jay Ban</author>
<year>2010</year>
<price>16.50</price>
</book>
</books>
The following Xquery document contains the query expression to be executed on the above XML document.
books.xqy
let $books := (doc("books.xml")/books/book)
return <results>
{
for $x in $books
where $x/price>30
order by $x/price
return $x/title
}
</results>
Result
<title lang="en">Learn XQuery in 24 hours</title>
<title lang="en">Learn .Net in 24 hours</title>
Verify Result
To verify the result, replace the contents of books.xqy (given in theEnvironment Setup chapter) with the above XQuery
expression and execute the XQueryTester java program.
XQuery can also be easily used to transform an XML document into an HTML page. Take a look at the following example
to understand how XQuery does it.
Example
We will use the same books.xml file. The following example uses XQuery extract data from books.xml and create an
HTML table containing the titles of all the books along with their respective prices.
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book category="JAVA">
<title lang="en">Learn Java in 24 Hours</title>
<author>Robert</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="DOTNET">
<title lang="en">Learn .Net in 24 hours</title>
<author>Peter</author>
<year>2011</year>
<price>70.50</price>
</book>
<book category="XML">
<title lang="en">Learn XQuery in 24 hours</title>
<author>Robert</author>
<author>Peter</author>
<year>2013</year>
<price>50.00</price>
</book>
<book category="XML">
<title lang="en">Learn XPath in 24 hours</title>
<author>Jay Ban</author>
<year>2010</year>
<price>16.50</price>
</book>
</books>
Given below is the Xquery expression that is to be executed on the above XML document.
books.xqy
let $books := (doc("books.xml")/books/book)
return <table><tr><th>Title</th><th>Price</th></tr>
{
for $x in $books
order by $x/price
return <tr><td>{data($x/title)}</td><td>{data($x/price)}</td></tr>
}
</table>
</results>
Result
<table>
<tr>
<th>Title</th>
<th>Price</th>
</tr>
<tr>
<td>Learn XPath in 24 hours</td>
<td>16.50</td>
</tr>
<tr>
<td>Learn Java in 24 Hours</td>
<td>30.00</td>
</tr>
<tr>
<td>Learn XQuery in 24 hours</td>
<td>50.00</td>
</tr>
<tr>
<td>Learn .Net in 24 hours</td>
<td>70.50</td>
</tr>
</table>
Verify Result
To verify the result, replace the contents of books.xqy (given in the Environment Setup chapter) with the above XQuery
expression and execute the XQueryTester java program.
XQuery Expressions
XQuery - XPath
XQuery is XPath compliant. It uses XPath expressions to restrict the search results on XML collections. For more details on
how to use XPath, see our XPath Tutorial.
Recall the following XPath expression which we have used earlier to get the list of books.
doc("books.xml")/books/book
XPath Examples
books.xml
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book category="JAVA">
<title lang="en">Learn Java in 24 Hours</title>
<author>Robert</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="DOTNET">
<title lang="en">Learn .Net in 24 hours</title>
<author>Peter</author>
<year>2011</year>
<price>40.50</price>
</book>
<book category="XML">
<title lang="en">Learn XQuery in 24 hours</title>
<author>Robert</author>
<author>Peter</author>
<year>2013</year>
<price>50.00</price>
</book>
<book category="XML">
<title lang="en">Learn XPath in 24 hours</title>
<author>Jay Ban</author>
<year>2010</year>
<price>16.50</price>
</book>
</books>
We have given here three versions of an XQuery statement that fulfil the same objective of displaying the book titles having
a price value greater than 30.
XQuery – Version 1
(: read the entire xml document :)
let $books := doc("books.xml")
for $x in $books/books/book
where $x/price > 30
return $x/title
Output
<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>
XQuery – Version 2
(: read all books :)
let $books := doc("books.xml")/books/book
for $x in $books
where $x/price > 30
return $x/title
Output
<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>
XQuery – Version 3
(: read books with price > 30 :)
let $books := doc("books.xml")/books/book[price > 30]
for $x in $books
return $x/title
Output
<title lang="en">Learn .Net in 24 hours</title>
<title lang="en">Learn XQuery in 24 hours</title>
Verify the Result
To verify the result, replace the contents of books.xqy (given in the Environment Setup chapter) with the above XQuery
expression and execute the XQueryTester java program.