Adding Elements and Attributes in XQuery

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 refer to elements and attributes from the input file in the results:

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

The above XQuery expression will reference the title elements and lang attributes in the result as follows:

<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 elements is the same as how they are described in the input document.

Now we are going 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 results:

<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>