Search code examples
xmlxpathxquerybasexflwor

How to wrap each return result with an XML node using Xquery?


Perhaps its possible to add an additional for loop around each return, and so wrap the result with a node?

Modifying a w3 schools sample query:

nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ basex bookstore.category.name.xq 
<xml>
  <category>cooking</category>
  <title>Everyday Italian</title>
  <category>children</category>
  <title>Harry Potter</title>
  <category>web</category>
  <title>Learning XML</title>
  <category>web</category>
  <title>XQuery Kick Start</title>
</xml>nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ 
nicholas@mordor:~/flwor$ cat bookstore.category.name.xq 

xquery version "3.1";


<xml>
{
for $x in db:open("bookstore")/bookstore/book
order by $x/title
return (<category>{data($x/@category)}</category>,<title>{data($x/title)}</title>)
}
</xml>
nicholas@mordor:~/flwor$ 

how can I wrap each result with a book element?

The xml sample data:

<bookstore>
  <book category="cooking">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <price>30.00</price>
  </book>
  <book category="children">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
  <book category="web">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <price>49.99</price>
  </book>
  <book category="web">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <price>39.95</price>
  </book>
</bookstore>

from the w3schools site.


Solution

  • Something like this should do it:

    <xml>
    {
    for $x in db:open("bookstore")/bookstore/book
    let $category := data($x/@category)
    return (
    for $book in $x  
      let $title := data($book/title)
      return(
    <book>
    <category>{$category}</category><title>{$title}</title>)
    </book>)
    )
    }
    </xml>
    

    Output:

    <xml>
      <book>
        <category>cooking</category>
        <title>Everyday Italian</title>)
    </book>
      <book>
        <category>children</category>
        <title>Harry Potter</title>)
    </book>
      <book>
        <category>web</category>
        <title>XQuery Kick Start</title>)
    </book>
      <book>
        <category>web</category>
        <title>Learning XML</title>)
    </book>
    </xml>