Learn XQuery in 10 Minutes: An XQuery Tutorial
By: Dr. Michael Kay
UPDATE - This article has been updated since its original publication. You can find the updated version here.
This XQuery tutorial is for all those people who really want to know what XQuery is, but don't have the time to find out. We all know the problem: so many exciting new technologies, so little time to research them. To be honest, I hope that you'll spend more than ten minutes on this XQuery tutorial — but if you really have to leave that soon, I hope you'll learn something useful anyway.
What is XQuery For?
XQuery was devised primarily as a query language for data stored in XML form. So its main role is to get information out of XML databases — this includes relational databases that store XML data, or that present an XML view of the data they hold.
Some people are also using XQuery for manipulating free-standing XML documents, for example, for transforming messages passing between applications. In that role XQuery competes directly with XSLT, and which language you choose is largely a matter of personal preference.
In fact, some people like XQuery so much that they are even using it for rendering XML into HTML for presentation. That's not really the job XQuery was designed for, and I wouldn't recommend people to do that, but once you get to know a tool, you tend to find new ways of using it.
Playing with XQuery
The best way to learn about anything is to try it out. Two ways you can try out the XQuery examples in this article are:
(Between you and me, if you've only got ten minutes, you're not going to have time to install any new software, so just keep reading ...)
Your First XQuery
If you want to know how to do Hello World! in XQuery, here it is:
and this is the result:
This is how it works in Stylus Studio®:
Game for something more interesting? Try:
and be amazed by the answer:
Finally, just to check that things are working properly, enter:
and you'll see how much time you have left to read the rest of this article:
For that one, of course, mileage may vary. The precision of the time value (fractions of a second) depends on the XQuery processor you are using, and the timezone (5 hours before GMT in this case) depends on how your system is configured.
None of these is a very useful query on its own, of course, and what they demonstrate isn't exactly rocket science.
But within a query language, you need to be able to do little calculations, and XQuery has this covered. Further, XQuery is designed so that expressions
are fully nestable —
any expression can be used within any other expression, provided it delivers a value of the right type —
and this means that expressions that are primarily intended for selecting data within a
Accessing XML Documents with XQuery
Though it's capable of handling mundane tasks like those described in the previous section, XQuery is designed to access XML data. So let's look at some simple queries that require an XML document as their input.
The source document we'll use is called
There's also a copy of this example file on the Web.
XQuery allows you to access the file directly from either of these locations, using a suitable URL
as an argument to its
The same function can be used to get the copy from the Web:
(This will only work if you are online, of course; and if you're behind a corporate firewall you may have to do some tweaking of your Java configuration to make it work.)
Those URLs are a bit unwieldy, but there are shortcuts you can use:
The file contains a number of sections. One of them is an
This produces the result:
That was our first "real" query. If you're familiar with XPath, you might recognize that all the queries so far
have been valid XPath expressions. We've used a couple of functions —
This means we can also write more complex XPath expressions like this one:
which gives the output:
Different systems might display this output in different ways. Technically, the result of this query is a sequence of two element nodes in a tree representation of the source XML document, and there are many ways a system might choose to display such a sequence on the screen. Stylus Studio® gives you the choice of a text view and a tree view: you use the buttons next to the Preview window to switch from one to the other. Here's what the text view looks like:
This example used another function —
XPath is capable of doing some pretty powerful selections, and before we move on to XQuery proper, let's look at a more complex example. Let's suppose we want to find the titles of all the videos featuring an actor whose first name is Lisa. Each video in the file is represented by a video element like this one:
We can write the required query like this:
Again, this is pure XPath (and therefore a valid XQuery). You can read it from left-to-right as:
The result is:
Many people find that at this level of complexity, XPath syntax gets rather mind-boggling. In fact, this example is just about stretching XPath to its limits. For this kind of query, and for anything more complicated, XQuery syntax comes into its own. But it's worth remembering that there are many simple things you can do with XPath alone, and that every valid XPath expression is also valid in XQuery. Note that Stylus Studio® also provides a built-in XPath analyzer for visually editing and testing complex XPath expressions, and it supports both version 1.0 and 2.0.
XQuery FLWOR Expressions
If you've used SQL, then you will have recognized the last example as a join between two tables, the videos table and the actors table. It's not quite the same in XML, because the data is hierarchic rather than tabular, but XQuery allows you to write join queries in a similar way to the familiar SQL approach. Its equivalent of SQL's SELECT expression is called the FLWOR expression, named after its five clauses: for, let, where, order by, return. Here's the last example, rewritten this time as a FLWOR expression:
And of course, we get the same result.
Let's take apart this FLWOR expression:
If you've been following very closely, you might have noticed one little XPath trick that we've retained in this query.
Most videos will feature more than one actor (though this particular database doesn't attempt to catalog the bit-part players).
This time I've used a different equality operator,
What about the O in FLWOR? That's there so you can get the results in sorted order. Suppose you want the videos in order of their release date. Here's the revised query:
And if you're wondering why it isn't a LFWOR expression: the
Generating XML Output with XQuery
So far all the queries we've written have selected nodes in the source document. I've shown the results as if the system copies the nodes to create some kind of result document, and if you run Saxon from the command line that's exactly what happens; but that's simply a default mode of execution. In a real application you want control over the form of the output document, which might well be the input to another application — perhaps the input to an XSLT transformation or even another query.
XQuery allows the structure of the result document to be defined using an XML-like notation. Here's an example that fleshes out our previous query with some XML markup:
I've also changed the query so that the actor's first name is now a parameter. This makes the query reusable.
The way parameters are supplied varies from one XQuery processor to another. In Stylus Studio®,
select XQuery > Scenario Properties; click the Parameter Values tab,
and you'll see a space to enter the parameter value. Enter "Lisa", in quotes
(Stylus Studio® expects an expression, so if you leave out the quotes, this value would be taken as a reference to an element named
If instead you're running Saxon from the command line, you can enter:
This is how the output looks now:
(Not a very well-designed query, since the two videos feature different actresses both named Lisa; but if your ten minutes aren't up yet, perhaps you can improve it yourself.)
Show Me the Database!
I started by saying that the main purpose of XQuery is to extract data from XML databases, but all my examples have used a single XML document as input.
People sometimes squeeze a large data set (for example, a corporate phone directory) into a single XML document, and process it as a file without the benefit of any database system. It's not something I'd particularly recommend, but if the data volumes don't go above a few megabytes and the transaction rate is modest, then it's perfectly feasible. So the examples in this introduction aren't totally unrealistic.
If you've got a real database, however, the form of the queries won't need to change all that much from these
examples. Instead of using the
There's a lot more to databases than doing queries, of course. Each product has its own ways of setting up the database, defining schemas, loading documents, and performing maintenance operations such as backup and recovery. XQuery currently handles only one small part of the job. In the future it's also likely to have an update capability, but in the meantime each vendor is defining his own.
One particularly nice feature of XQuery is that it has the potential to combine data from multiple databases (and freestanding XML documents). If that's something you're interested in, take a look at DataDirect XQuery, which supports access to Oracle, DB2, SQL Server and Sybase.
Congratulations on finishing XQuery in 10 Minutes. As you might have suspected, there's more to XQuery than we had time to present in this brief XQuery primer. But this XQuery tutorial is just the first in a series of upcoming technical XQuery articles that we plan to make available through the Stylus Studio® newsletter, the Stylus Scoop. So if you're interested in learning more, sign up for the Stylus Scoop. We'll feature new XQuery articles each month, for example, this new FLWOR tutorial, as well as information on other topics of interest to the XML-curious, too!
Can't wait that long? Then check out the XQuery tutorial written by Jonathan Robie of DataDirect Technologies, the first chapter of the book XQuery from the Experts, which provides an in-depth understanding of the design behind the XQuery language. The book also contains a chapter by the author of this article, Michael Kay, about the relationship of XQuery to XSLT. It's a great way to get your feet wet with this powerful new XML technology.
If you want to get your hands dirty right away, Stylus Studio® provides a ton of XQuery tools, including an XQuery editor, an XQuery Debugger with integrated support for the Saxon XQuery Processor, an XQuery Mapper for visually developing XQuery projects, and an XQuery Profiler for benchmarking and optimizing XQuery expressions. Best of all, Stylus Studio® provides several online video demonstrations to get you aquainted with these and other tools, and you can try out Stylus Studio® for free.
Finally, if you're more academically inclined, you can find the XQuery specification itself at http://www.w3.org/TR/XQuery. As standards documents go, it's actually quite readable,
and it has lots of examples. The specification is part of a raft of documents on XQuery, which are all listed in its References section,
but the one you're likely to find especially useful is the Functions and Operators specification at
http://www.w3.org/TR/xpath-functions. This document lists all the functions in the XQuery library, but a word of warning —
only those prefixed
PURCHASE STYLUS STUDIO ONLINE TODAY!!
Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!
Try Stylus Powerful XQuery IDE
Download a free trial of our award-winning IDE for XQuery today!
What's New for X15?
New XQuery & Web Services Tools, Support for MySQL, PostgreSQL, HL7 EDI, Microsoft .NET Code Generation and much more!