XQuery: Adding Elements and Attributes

Welcome to The Coding College, where we simplify coding concepts! In this guide, we’ll explore how to use XQuery to add new elements and attributes to XML documents. This capability is useful for transforming XML data, enriching it with additional information, or preparing it for other applications.

Why Add Elements and Attributes?

Adding elements and attributes in XQuery allows you to:

  • Extend existing XML data with new details.
  • Create custom outputs tailored for specific applications.
  • Dynamically generate new XML structures based on existing data.

Adding Elements

In XQuery, you can construct new XML elements by simply including them in the return clause.

Example 1: Adding a New Element

Let’s say you have the following XML:

Input XML (books.xml):

<library>
  <book>
    <title>Learning XML</title>
    <price>29.99</price>
  </book>
</library>

XQuery Code:

for $book in doc("books.xml")/library/book
return
  <book-with-discount>
    { $book/title }
    { $book/price }
    <discounted-price>{ $book/price * 0.9 }</discounted-price>
  </book-with-discount>

Output XML:

<book-with-discount>
  <title>Learning XML</title>
  <price>29.99</price>
  <discounted-price>26.991</discounted-price>
</book-with-discount>

Explanation:

  • The new <book-with-discount> element wraps around the original data.
  • A <discounted-price> element is added with a calculated value.

Adding Attributes

Attributes can be added using the attribute keyword or by including them directly in the XML construction.

Example 2: Adding an Attribute

Input XML (books.xml):

<library>
  <book>
    <title>Learning XML</title>
    <price>29.99</price>
  </book>
</library>

XQuery Code:

for $book in doc("books.xml")/library/book
return
  <book discounted="true">
    { $book/title }
    { $book/price }
  </book>

Output XML:

<book discounted="true">
  <title>Learning XML</title>
  <price>29.99</price>
</book>

Explanation:

  • The attribute discounted="true" is added to each <book> element.

Example 3: Dynamically Adding Attributes

You can also add attributes dynamically based on conditions.

XQuery Code:

for $book in doc("books.xml")/library/book
let $discount := if ($book/price > 20) then "true" else "false"
return
  <book discounted="{ $discount }">
    { $book/title }
    { $book/price }
  </book>

Output XML:

<book discounted="true">
  <title>Learning XML</title>
  <price>29.99</price>
</book>

Explanation:

  • The discounted attribute is dynamically assigned based on the <price> value.

Adding Both Elements and Attributes

You can combine new elements and attributes in a single query.

Example 4: Adding Both

XQuery Code:

for $book in doc("books.xml")/library/book
return
  <book discounted="true">
    { $book/title }
    { $book/price }
    <discounted-price>{ $book/price * 0.9 }</discounted-price>
  </book>

Output XML:

<book discounted="true">
  <title>Learning XML</title>
  <price>29.99</price>
  <discounted-price>26.991</discounted-price>
</book>

Explanation:

  • A new element <discounted-price> is added.
  • The discounted attribute is also added to the <book> element.

Use Case: Adding Elements and Attributes Dynamically

For more complex transformations, you might want to use dynamic logic to add elements or attributes.

Input XML (library.xml):

<library>
  <book>
    <title>Learning XML</title>
    <price>29.99</price>
    <category>Programming</category>
  </book>
  <book>
    <title>Cooking Basics</title>
    <price>15.50</price>
    <category>Cooking</category>
  </book>
</library>

XQuery Code:

for $book in doc("library.xml")/library/book
return
  <book discounted="{ if ($book/price > 20) then 'true' else 'false' }">
    { $book/title }
    { $book/price }
    <discounted-price>{ if ($book/price > 20) then $book/price * 0.9 else $book/price }</discounted-price>
    <category>{ $book/category }</category>
  </book>

Output XML:

<book discounted="true">
  <title>Learning XML</title>
  <price>29.99</price>
  <discounted-price>26.991</discounted-price>
  <category>Programming</category>
</book>
<book discounted="false">
  <title>Cooking Basics</title>
  <price>15.50</price>
  <discounted-price>15.50</discounted-price>
  <category>Cooking</category>
</book>

Explanation:

  • Attributes and elements are added conditionally based on the <price>.
  • The output retains the original data while enriching it with additional details.

Tools for Practicing

To test and execute XQuery, consider using:

  • BaseX: A lightweight XML database with a user-friendly interface.
  • eXist-db: An XML database that supports complex queries.
  • Saxon: A popular XQuery processor with excellent support for advanced features.

Conclusion

Adding elements and attributes in XQuery allows you to enhance XML data dynamically. Whether you’re enriching data, applying business rules, or preparing XML for downstream processes, mastering these techniques is invaluable.

For more tutorials, examples, and resources, visit The Coding College!

Leave a Comment