XQuery 3.0

From BaseX Documentation
Revision as of 12:26, 13 January 2011 by Michael (talk | contribs) (→‎Group By: added example)
Jump to navigation Jump to search

This article summarizes the most important features of the upcoming Version 3.0 of the XQuery language that have already been implemented in BaseX.

Group By

FLWOR expressions have been extended by the group by clause, which is well-established among relational database systems. Group by clauses can be used to apply value based paritioning to query results:


for $ppl in doc('xmark')//people/person  
let $ic := $ppl/profile/@income
let $income :=  if($ic<30000) then
                else if($ic >= 30000 and $ic<100000) then 
                else if($ic >= 100000) then 
group by $income
order by $income
return element {$income} {count($ppl)}

Is a rewrite of Query #20 contained in the Benchmark Suite to use group by. The query partitions the customers based on their income.



In contrast to the relational GROUP BY the XQuery counterpart concatenates the values of all non-grouping variables that belong to a specific group. In the context of our example, all nodes in //people/person that belong to the "preferred" partition are concatenated in $ppl after grouping has finished. You can see this effect by changing the return statement to:

return element {$income} {count($ppl)}


  <person id="person0">
    <name>Kasidit Treweek</name>
  <person id="personX">


The try/catch construct can be used to handle errors at runtime:


 try {
   1 + '2'
 } catch *($code, $desc) {
   concat('Error [', $code, ']: ', $desc)

Result: Error [XPTY0004]: '+' operator: number expected, string found.


The switch statement is available in many other programming languages. It chooses one of several expressions to evaluate based on its input value.


for $fruit in ("Apple", "Pear", "Peach")
return switch ($fruit)
  case "Apple" return "red"
  case "Pear"  return "green"
  case "Peach" return "pink"
  default      return "unknown"

Result: red green pink


Serialization parameters can now be defined within XQuery expressions. All available parameters are supported, which are specified in the W3C Serialization Document. Parameters are placed in the query prolog and need to be specified as option declarations, using the output prefix.


declare option output:omit-xml-declaration "no";
declare option output:method "xhtml";

Result: <?xml version="1.0" encoding="UTF-8"?><html></html>


This paragraph lists all new functions of the XQuery 3.0 Specification that are already supported in BaseX.

The following functions have been added:

  • math:pi(), math:sin(), and many others (see Math Functions)
  • fn:head()
  • fn:tail()
  • fn:generate-id()
  • fn:analyze-string()
  • fn:environment-variable()
  • fn:available-environment-variables()
  • fn:unparsed-text-available()
  • fn:unparsed-text-lines()
  • fn:unparsed-text()
  • fn:element-with-id()
  • fn:parse-xml()
  • fn:uri-collection()
  • fn:serialize()

New signatures have beeen added for the following functions:

  • fn:document-uri() with 0 arguments
  • fn:string-join() with 1 argument
  • fn:node-name() with 0 arguments
  • fn:round() with 2 arguments
  • fn:data() with 0 arguments

The following functions are partially supported:

  • fn:format-integer()
  • fn:format-number()
  • fn:format-dateTime()
  • fn:format-date()
  • fn:format-time()