Changes

Jump to navigation Jump to search
1,059 bytes added ,  09:45, 30 November 2017
no edit summary
This article is part of the [[XQuery|XQuery Portal]].It summarizes provides a summary of the most important features of the upcoming [http://www.w3.org/TR/xquery-30/ XQuery 3.0]and [http://www.w3.org/TR/xpath-30/ XPath 3.0] Recommendationsthat have already been implemented in BaseXRecommendation.
==Enhanced FLWOR Expressions==
{{Mark|Introduced with Version 7.7:}} Most clauses of FLWOR expressions can now be specified in an arbitrary order: additional {{Code|let}} and {{Code|for}} clauses can be put after a {{Code|where}} clause, and multiple {{Code|where}}, {{Code|order by}} and {{Code|group by}} statements can be used. This means that many nested loops can now be rewritten to a single FLWOR expression.
'''Example:'''
for $country in db:open('factbook')//country
where $country/@population > 100000000
let $name := $country/name[1]
for $city in $country//city[population > 1000000]
group by $namereturn &lt;country name:='{ $name }'&gt;{ $citycountry/name }&lt;/country&gt;</pre> A new {{Code|count}} clause enhances the FLWOR expression with a variable that enumerates the iterated tuples. <pre class="brush:xquery">for $n in (1 to 10)[. mod 2 = 1]count $cidreturn &lt;number count<country id="'{ $c id }" number' name="'{ $n name }"/&gt;</pre'The {{Code|allowing empty}} provides functionality similar to outer joins in SQL: <pre class="brush:xquery">for $n allowing empty in ()return 'empty? ' || empty($n)<city/pre> Window clauses extend FLWOR clauses by generating sub-sequences of the iterated tuples. More information can be found in the [http://www.w3.org/TR/2013/CR-xquery-30-20130108/#id-windows specification]. An example: <pre class="brush:xquery">for tumbling window $w in (2, 4, 6, 8, 10, 12, 14) start at $s when fn:true() only end at $e when $e - $s eq 2return &lt;window&gt;{ $w name }&lt;/window&gt;</precountry==Simple Map Operator== The [http://www.w3.org/TR/xquery-30/#id-map-operator simple map] operator {{Code|!}} provides a compact notation for applying the results of a first to a second expression: the resulting items of the first expression are bound to the context item one by one, and the second expression is evaluated for each item. The map operator may be used as replacement for FLWOR expressions: '''Example:''' <pre class="brush:xquery">(: Simple map notation :)(1 to 10) ! element node { . },(: FLWOR notation :)for $i in 1 to 10return element node { $i }
</pre>
A map operator is defined to be part of a path expression, which may now be mixed of path and map operators. In contrast to the map operator, the results of the map operator will not be made duplicate-free and returned in document order. ==Group Bygroup by==
FLWOR expressions have been extended to include the [http://www.w3.org/TR/xquery-30/#id-group-by group by] clause, which is well-established among relational database systemsin SQL. <code>group by</code> can be used to apply value-based partitioning to query results:
'''ExampleXQuery:'''
<pre class="brush:xquery">
for $ppl in doc('xmark')//people/person
order by $income
return element { $income } { count($ppl) }
 
</pre>
<challenge>4731</challenge>
<na>12677</na>
<preferedpreferred>314</preferedpreferred>
<standard>7778</standard>
</pre>
In contrast to the relational GROUP BY statement, the XQuery counterpartconcatenates the values of all non-grouping variables that belong to a specific group.In the context of our example, all nodes in <code>//people/person</code> that belong to the <code>preferred</code> partition are concatenated in <code class="brush:xquery">$ppl</code> after grouping has finished.You can see this effect by changing the return statement to:
<pre class="brush:xquery">
return element { $income } { $ppl }
</pre>
 
'''Result:'''
<pre class="brush:xml">
</pre>
Moreover, a value can be assigned to the grouping variable. This is shown in the following example: '''XQuery:''' <pre class="brush:xquery">let $data :=Try <xml> <person country='USA' name='John'/> <person country='USA' name='Jack'/> <person country='Germany' name='Johann'/> </xml>for $person in $data/persongroup by $country := $person/@country/string()return element persons { attribute country { $country }, $person/@name ! element name { data() }}</pre> '''Result:'''<pre class="brush:xml"><persons country="USA"> <name>John</name> <name>Jack</name></persons><persons country="Germany"> <name>Johann</name></persons></pre> ==count== The {{Code|count}} clause enhances the FLWOR expression with a variable that enumerates the iterated tuples. <pre class="brush:xquery">for $n in (1 to 10)[. mod 2 = 1]count $creturn &lt;number count="{ $c }" number="{ $n }"/&gt;</Catchpre> ==allowing empty==
The [http://www.w3.org/TR/xquery-30/#id-try-catch try/catch] construct can be used {{Code|allowing empty}} provides functionality similar to handle errors at runtimeouter joins in SQL:
'''Example:'''
<pre class="brush:xquery">
try { 1 + '2'} catch err:XPTY0004 { 'Typing error: ' || for $err:description} catch * {n allowing empty in () return 'Error [empty? ' || empty($err:code || ']: ' || $err:description}n)
</pre>
'''Result:''' <code>Typing error: '+' operator: number expected, xs:string found.</code>
==Switchwindow==
The [http://www.w3.org/TR/xqueryWindow clauses provide a rich set of variable declarations to process sub-30/#id-switch switch] statement is available in many other programming languages. It chooses one sequences of several expressions to evaluate based on its input valueiterated tuples.An example:
'''Example:'''
<pre class="brush:xquery">
for tumbling window $fruit w in ("Apple"2, "Pear"4, "Peach"6, 8, 10, 12, 14)return switch start at $s when fn:true($fruit) case "Apple" return "red" only end at $e when $e - $s eq 2 case "Pear" return "green" case "Peach" return "pink" default return "unknown"&lt;window&gt;{ $w }&lt;/window&gt;</pre> '''ResultMore information on window clauses, and all other enhancements, can be found in the [http:''' <code>red green pink</code>/www.w3.org/TR/xquery-30/#id-windows specification].
==Function Items==
One of the most distinguishing features added in ''XQuery 3.0'' are ''function items'', also known as ''lambdas'' or ''lambda functions''. They make it possible to abstract over functions and thus write more modular code.
'''Result:''' <code>42</code>
</li>
<li>Getting the function item of an existing (built-in oder or user-defined) XQuery function. The arity (number of arguments) has to be specified as there can be more than one function with the same name:
<pre class="brush:xquery">let $f := math:pow#2
return $f(5, 2)</pre>
Function items can also be passed as arguments to and returned as results from functions. These so-called [[Higher-Order Functions]] like <code>fn:map</code> and <code>fn:fold-left</code> are discussed in more depth on their own Wiki page.
=Simple Map Operator= The [http://www.w3.org/TR/xquery-30/#id-map-operator simple map] operator {{Code|!}} provides a compact notation for applying the results of a first to a second expression: the resulting items of the first expression are bound to the context item one by one, and the second expression is evaluated for each item. The map operator may be used as replacement for FLWOR expressions: '''Example:''' <pre class="brush:xquery">(: Simple map notation :)(1 to 10) ! element node { . },(: FLWOR notation :)for $i in 1 to 10return element node { $i }</pre> In contrast to path expressions, the results of the map operator will not be made duplicate-free and returned in document order. =Try/Catch= The [http://www.w3.org/TR/xquery-30/#id-try-catch try/catch] construct can be used to handle errors at runtime: '''Example:''' <pre class="brush:xquery">try { 1 + '2'} catch err:XPTY0004 { 'Typing error: ' || $err:description} catch * { 'Error [' || $err:code || ']: ' || $err:description}</pre>'''Result:''' <code>Typing error: '+' operator: number expected, xs:string found.</code> Within the scope of the catch clause, a number of variables are implicitly declared, giving information about the error that occurred: * {{Code|$err:code}} error code* {{Code|$err:description}}: error message* {{Code|$err:value}}: value associated with the error (optional)* {{Code|$err:module}}: URI of the module where the error occurred* {{Code|$err:line-number}}: line number where the error occurred* {{Code|$err:column-number}}: column number where the error occurred* {{Code|$err:additional}}: error stack trace =Switch= The [http://www.w3.org/TR/xquery-30/#id-switch switch] statement is available in many other programming languages. It chooses one of several expressions to evaluate based on its input value. '''Example:''' <pre class="brush:xquery">for $fruit in ("Apple", "Pear", "Peach")return switch ($fruit) case "Apple" return "red" case "Pear" return "green" case "Peach" return "pink" default return "unknown"</pre> '''Result:''' <code>red green pink</code> The expression to evaluate can correspond to multiple input values. '''Example:'''<pre class="brush:xquery">for $fruit in ("Apple", "Cherry")return switch ($fruit) case "Apple" case "Cherry" return "red" case "Pear" return "green" case "Peach" return "pink" default return "unknown"</pre>'''Result:''' <code>red red</code> =Expanded QNames==
A ''QName'' can now be directly prefixed with the letter "Q" and a namespace URI in the [http://www.jclark.com/xml/xmlns.htm Clark Notation].
'''Examples:'''
* <code>Q{java:java.io.FileOutputStream}new("output.txt")</code> creates a new Java file output stream
The syntax differed in older versions of the XQuery 3.0 specification, in which the prefixed namespace URI was quoted:=Namespace Constructors=
* <code><nowiki>"http://www.w3.org/2005/xpath-functions/math":pi()</nowiki></code>* <code>"java:java.io.FileOutputStream":new("output")</code> ==Namespace Constructors== New namespaces can now be created via so-called 'Computed Namespace Constructors'.
<pre class="brush:xquery">
</pre>
==String Concatenations==
Two vertical bars <code>||</code> (also names named ''pipe characters'') can be used to concatenate strings. This operator is a shortcut for the {{Code|fn:concat()}} function.
<pre class="brush:xquery">
</pre>
==External Variables==
Default values can now be attached to external variable declarations. This way, an expression can also be evaluated if its external variables have not been bound to a new value.
<pre class="brush:xquery">
</pre>
==Serialization==
[[Serialization|Serialization ]]parameters can now be defined within XQuery expressions. Parameters are placed in the query prolog and need to be specified as option declarations, using the <code>output</code> prefix.
'''Example:'''
In BaseX, the {{Code|output}} prefix is statically bound and can thus be omitted. Note that all namespaces need to be specified when using external APIs, such as [http://xqj.net/basex/ XQJ].
==Context Item==
The context item can now be specified in the prolog of an XQuery expressionsexpression:
'''Example:'''
'''Result:''' <code>5 5</code>
==Annotations==
XQuery 3.0 introduces annotations to declare properties associated with functions and variables. For instance, a function may be declared %public, %private, or %updating.
</pre>
==Functions==
BaseX supports all The following functions that have been added in Version 3.0 of the [http://www.w3.org/TR/xpath-functions-30/ XQuery 3.0 Functions and Operators] Working Draft. The new functions are listed belowSpecification:
* <code>math:pi()</code>, <code>math:sin()</code>, and many others (see [[Math Module]])* <code>fn:analyze-string()</code>* <code>fn:available-environment-variables()</code>* , <code>fn:element-with-id()</code>* , <code>fn:environment-variable()</code>* , <code>fn:filter()</code>* , <code>fn:fold-left()</code>* , <code>fn:fold-right()</code>* , <code>fn:for-each</code>, <code>fn:for-each-pair</code>, <code>fn:format-date()</code>* , <code>fn:format-dateTime()</code>* , <code>fn:format-integer()</code>* , <code>fn:format-number()</code>* , <code>fn:format-time()</code>* , <code>fn:function-arity()</code>* , <code>fn:function-lookup()</code>* , <code>fn:function-name()</code>* , <code>fn:generate-id()</code>* , <code>fn:has-children()</code>* , <code>fn:head()</code>* , <code>fn:innermost()</code>* <code>fn:map()</code>* <code>fn:map-pairs()</code>* , <code>fn:outermost()</code>* , <code>fn:parse-xml()</code>* , <code>fn:parse-xml-fragment()</code>* , <code>fn:path()</code>* , <code>fn:serialize()</code>* , <code>fn:tail()</code>* , <code>fn:unparsed-text()</code>* , <code>fn:unparsed-text-available()</code>* , <code>fn:unparsed-text-lines()</code>* , <code>fn:uri-collection()</code>
New signatures have been added for the following functions:
* <code>fn:document-uri()</code> with 0 arguments* , <code>fn:string-join()</code> with 1 argument* , <code>fn:node-name()</code> with 0 arguments* , <code>fn:round()</code> with 2 arguments* , <code>fn:data()</code> with 0 arguments
=Changelog=
 
;Version 8.4
 
* Added: %non-deterministic
 
;Version 8.0
 
* Added: %basex:inline, %basex:lazy
 
;Version 7.7
 
* Added: [[#Enhanced FLWOR Expressions|Enhanced FLWOR Expressions]]
;Version 7.3
* Added: [[#Simple map operatorMap Operator|Simple Map Operator]]
;Version 7.2
* Added: [[#Annotations|Annotations]]* Updated: EQName syntax[[#Expanded QNames|Expanded QNames]]
;Version 7.1
* Added: [[#Expanded QNames|Expanded QNames]], Computed [[#Namespace Constructors|Namespace ConstructorConstructors]]
;Version 7.0
* Added: [[#String ConcatenatorConcatenations|String Concatenations]]
[[Category:XQuery]]
Bureaucrats, editor, reviewer, Administrators
13,550

edits

Navigation menu