XQuery Adding Elements and Attributes

XML Sample Document

We will continue to use this "books.xml" document in the following examples (the same XML file used in the previous chapters).

View the "books.xml" file in your browser.

Add elements and attributes to the result

As seen in the previous section, we can reference elements and attributes from the input file in the result:

for $x in doc("books.xml")/bookstore/book/title
order by $x
return $x

The above XQuery expression references the title element and the lang attribute in the result, like this:

<title lang="en">Everyday Italian</title>
<title lang="en">Harry Potter</title>
<title lang="en">Learning XML</title>
<title lang="en">XQuery Kick Start</title>

The way the above XQuery expression returns the title element is the same as how it is described in the input document.

Now we want to add our own elements and attributes to the result!

Add HTML elements and text

Now, we want to add HTML elements to the result. We will put the results in an HTML list:

<html>
<body>
<h1>Bookstore</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li>{data($x/title)}. Category: {data($x/@category)}</li>
}
</ul>
</body>
</html>

The above XQuery expression will generate the following result:

<html>
<body>
<h1>Bookstore</h1>
<ul>
<li>Everyday Italian. Category: COOKING</li>
<li>Harry Potter. Category: CHILDREN</li>
<li>Learning XML. Category: WEB</li>
<li>XQuery Kick Start. Category: WEB</li>
</ul>
</body>
</html>

Add Attributes to HTML Elements

Next, we will use the category attribute as the class attribute of the HTML list:

<html>
<body>
<h1>Bookstore</h1>
<ul>
{
for $x in doc("books.xml")/bookstore/book
order by $x/title
return <li class="{data($x/@category)}">{data($x/title)}</li>
}
</ul>
</body>
</html>

The above XQuery expression can generate the following results:

<html>
<body>
<h1>Bookstore</h1>
<ul>
<li class="COOKING">Everyday Italian</li>
<li class="CHILDREN">Harry Potter</li>
<li class="WEB">Learning XML</li>
<li class="WEB">XQuery Kick Start</li>
</ul>
</body>
</html>