← Back to team overview

zorba-coders team mailing list archive

[Merge] lp:~zorba-coders/zorba/zorba-documentation-merge-proposal into lp:zorba

 

Sorin Marian Nasoi has proposed merging lp:~zorba-coders/zorba/zorba-documentation-merge-proposal into lp:zorba.

Commit message:
- removed all HTML pages from the list of files installed in the 'doc' component
- updated the install target for the C examples from 'doc' to 'c_example'
- delete previous version of the XQDoc documentation
- automatically generate language API's examples
- fixed documentation pages and examples for the Zorba API's
- fixed Doxygen documentation pages
- added support for \htmlonly and \htmlinclude
- fixed the left menu for the Doxygen documentation

Requested reviews:
  Sorin Marian Nasoi (sorin.marian.nasoi)

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036
-- 
The attached diff has been truncated due to its size.
https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'doc/CMakeLists.txt'
--- doc/CMakeLists.txt	2013-07-30 23:42:44 +0000
+++ doc/CMakeLists.txt	2013-09-17 13:34:04 +0000
@@ -57,6 +57,17 @@
 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/c/html)
 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/code/html)
 
+# copy all needed images into 'images' folder
+FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/images)
+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/xquery_jsoniq_venn.png
+                ${CMAKE_CURRENT_BINARY_DIR}/images/xquery_jsoniq_venn.png COPYONLY)
+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/store_concepts.png
+                ${CMAKE_CURRENT_BINARY_DIR}/images/store_concepts.png COPYONLY)
+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/data_lifecycle.png
+                ${CMAKE_CURRENT_BINARY_DIR}/images/data_lifecycle.png COPYONLY)
+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/data-in-out.png
+                ${CMAKE_CURRENT_BINARY_DIR}/images/data-in-out.png COPYONLY)
+
 IF (SWIG_FOUND)
   FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/python/html)
   FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/java/html)

=== modified file 'doc/c/doxy.config.in'
--- doc/c/doxy.config.in	2013-07-31 00:34:49 +0000
+++ doc/c/doxy.config.in	2013-09-17 13:34:04 +0000
@@ -202,7 +202,7 @@
 # For instance, some of the names that are used will be different. The list
 # of all members will be omitted, etc.
 
-OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_FOR_C  = NO
 
 # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
 # sources only. Doxygen will then generate output that is more tailored for
@@ -631,11 +631,7 @@
 # directories like "/usr/src/myproject". Separate the files or directories
 # with spaces.
 
-INPUT                  = @CMAKE_SOURCE_DIR@/include/zorba/zorbac.h \
-                         @CMAKE_SOURCE_DIR@/include/zorba/error.h \
-                         @CMAKE_SOURCE_DIR@/include/zorba/static_context_consts.h \
-                         @CMAKE_SOURCE_DIR@/include/zorba/options.h \
-                         @CMAKE_CURRENT_SOURCE_DIR@/manual
+INPUT                  = @CMAKE_CURRENT_SOURCE_DIR@/manual
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
@@ -653,8 +649,9 @@
 # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
 # *.f90 *.f *.for *.vhd *.vhdl
 
-FILE_PATTERNS          = *.h \
-                         *.dox
+FILE_PATTERNS          =  *.c \
+                          *.h \
+                          *.dox
 
 # The RECURSIVE tag can be used to turn specify whether or not subdirectories
 # should be searched for input files as well. Possible values are YES and NO.
@@ -703,7 +700,8 @@
 # and *.h) to filter out the source-files in the directories. If left
 # blank all files are included.
 
-EXAMPLE_PATTERNS       = *.c
+EXAMPLE_PATTERNS       = *.c \
+                         *.h
 
 # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
 # searched for input files to be used with the \include or \dontinclude
@@ -1179,7 +1177,7 @@
 # typically be disabled. For large projects the javascript based search engine
 # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
 
-SEARCHENGINE           = NO
+SEARCHENGINE           = YES
 
 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
 # implemented using a PHP enabled web server instead of at the web client

=== modified file 'doc/c/manual/indexpage.dox'
--- doc/c/manual/indexpage.dox	2013-08-23 11:15:04 +0000
+++ doc/c/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -23,7 +23,23 @@
         written in C.
   </ul>
 
-  To start with, this documentation provides a <a class="el" href="examples.html">set of examples</a> that demonstrate 
-  some features.
- */
+  To start with, this documentation provides a set of examples that demonstrate some features:
+  <ul>
+    <li><a class="el" href="ccontext_8c-example.html">ccontext.c</a>
+    <li><a class="el" href="cerror_8c-example.html">cerror.c</a>
+    <li><a class="el" href="cexternal_functions_8c-example.html">cexternal_functions.c</a>
+    <li><a class="el" href="cparsing_8c-example.html">cparsing.c</a>
+    <li><a class="el" href="csequences_8c-example.html">csequences.c</a>
+    <li><a class="el" href="cserialization_8c-example.html">cserialization.c</a>
+    <li><a class="el" href="csimple_8c-example.html">csimple.c</a>
+  </ul>
+
+  \example ccontext.c
+  \example cerror.c
+  \example cexternal_functions.c
+  \example cparsing.c
+  \example csequences.c
+  \example cserialization.c
+  \example csimple.c
+*/
 

=== modified file 'doc/csharp/manual/indexpage.dox'
--- doc/csharp/manual/indexpage.dox	2012-07-20 21:21:21 +0000
+++ doc/csharp/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,15 +1,16 @@
 /*! \mainpage C# API Documentation
 
-  Zorba ships with a C# language binding that provides several features in order to prepare and execute queries
-  with Zorba.
-  
-  \section note Note for garbage collected languages
-  Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
-  the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
-  is destroyed.
-
-  \section note Note for non-C++ language bindings
-  Zorba's current API documentation is generated from the C++ source. The C# language API is derived directly from this. The information contained in this documentation is accurate for C#, although it will look somewhat odd.
-
- */
-
+  %Zorba ships with a C# language binding that provides several features
+  in order to prepare and execute queries with %Zorba.
+
+  \section note1 Note for garbage collected languages
+  %Zorba requires that objects must be deleted in a certain order, which Garbage
+  Collectors are not aware of. For that reason, the Iterators created with
+  XQuery.iterator() must be explicitly destroyed with iterator.destroy() before
+  the %XQuery object is destroyed.
+
+  \section note2 Note for non-C++ language bindings
+  %Zorba's current API documentation is generated from the C++ source.
+  The C# language API is derived directly from this. The information contained
+  in this documentation is accurate for C#, although it will look somewhat odd.
+*/

=== modified file 'doc/cxx/manual/indexpage.dox'
--- doc/cxx/manual/indexpage.dox	2013-02-07 17:24:36 +0000
+++ doc/cxx/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -10,6 +10,62 @@
       <li>Writing external XQuery functions in C++.
     </ul>
 
-    To start with, this documentation provides a <a class="el" href="examples.html">set of examples</a> that demonstrate all of the above
-    features.
+  \section Examples
+  To start with, this documentation provides a set of examples that demonstrate some features:
+  <ul>
+    <li><a href="simple_8cpp-example.html">simple.cpp</a>
+    <li><a href="sax2_8cpp-example.html">sax2.cpp</a>
+    <li><a href="errors_8cpp-example.html">errors.cpp</a>
+    <li><a href="context_8cpp-example.html">context.cpp</a>
+    <li><a href="serialization_8cpp-example.html">serialization.cpp</a>
+    <li><a href="chaining_8cpp-example.html">chaining.cpp</a>
+    <li><a href="external_functions_8cpp-example.html">external_functions.cpp</a>
+    <li><a href="datamanager_8cpp-example.html">datamanager.cpp</a>
+    <li><a href="uri_resolvers_8cpp-example.html">uri_resolvers.cpp</a>
+    <li><a href="execution_plans_8cpp-example.html">execution_plans.cpp</a>
+    <li><a href="item_handler_8cpp-example.html">item_handler.cpp</a>
+    <li><a href="callback_8cpp-example.html">callback.cpp</a>
+    <li><a href="binary_8cpp-example.html">binary.cpp</a>
+    <li><a href="module_import_check_8cpp-example.html">module_import_check.cpp</a>
+    <li><a href="jsoniq_8cpp-example.html">jsoniq.cpp</a>
+  </ul>
+
+  \example simple.cpp
+  This is a simple example that demonstrate how to create, compile, and execute
+  queries.
+
+  \example sax2.cpp
+  An example showing XML serialization that is performed using SAX2.
+
+  \example errors.cpp
+  This file demonstrates how error management and handling is done in Zorba.
+
+  \example context.cpp
+  This file demonstrates how the ItemFactory can be used to create new Items and
+  bind the Items to external variables in the dynamic context of a query.
+
+  \example serialization.cpp
+  This file shows examples of how to serialize query results, for example as XML.
+
+  \example chaining.cpp
+  Example to show query chaining at work. In this example, we will execute
+  query 1 and chain the results of that query as in input to 
+  another query (query 2) by means of an external variable.
+
+  \example external_functions.cpp
+  This file shows some simple examples of external functions.
+
+  \example datamanager.cpp
+  This file contains some examples that demonstrate how the XmlDataManager
+  can be used to load files, create collection, etc.
+
+  \example uri_resolvers.cpp
+  \example execution_plans.cpp
+  \example item_handler.cpp
+  This is a example that demonstrates how one can use item handlers.
+
+  \example callback.cpp
+  \example binary.cpp
+  \example module_import_check.cpp
+  \example jsoniq.cpp
  */

=== modified file 'doc/java/doxy.config.in'
--- doc/java/doxy.config.in	2013-07-31 00:34:49 +0000
+++ doc/java/doxy.config.in	2013-09-17 13:34:04 +0000
@@ -694,7 +694,7 @@
 # directories that contain example code fragments that are included (see
 # the \include command).
 
-EXAMPLE_PATH           = @CMAKE_CURRENT_BINARY_DIR@/examples
+EXAMPLE_PATH           = @CMAKE_CURRENT_SOURCE_DIR@/examples
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp

=== modified file 'doc/java/manual/indexpage.dox'
--- doc/java/manual/indexpage.dox	2013-02-07 17:24:36 +0000
+++ doc/java/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,13 +1,26 @@
 /*! \mainpage Java API Documentation
 
-  Zorba provides two Java language bindings: (1) a language binding generated using SWIG that is similar to the bindings for Ruby or Python and (2) a binding that implements the <a href="http://jcp.org/en/jsr/detail?id=225";>XQuery API for Java (XQJ)</a>.
-
-  Although, the XQJ binding is currently implemented entirely on top of the SWIG binding, we encourage people to only use the XQJ binding. The SWIG generated binding might be deprecated in the future.
-  
+  %Zorba provides two Java language bindings:
+  <ul>
+    <li>a language binding generated using SWIG that is similar to the bindings for Ruby or Python
+    <li>a binding that implements the <a href="http://jcp.org/en/jsr/detail?id=225";>XQuery API for Java (XQJ)</a>
+  </ul>
+
+  Although, the XQJ binding is currently implemented entirely on top of the SWIG
+  binding, we encourage people to only use the XQJ binding. The SWIG generated
+  binding might be deprecated in the future.
+
   \section note Note for non-C++ language bindings
-  Zorba's current API documentation is generated from the C++ source. The Java language API is derived directly from this. The information contained in this documentation is accurate for Java, although it will look somewhat odd.
+  %Zorba's current API documentation is generated from the C++ source. The Java
+  language API is derived directly from this. The information contained in this
+  documentation is accurate for Java, although it will look somewhat odd.
+
+  To start with, this is a simple example that demonstrate how to use the SWIG
+  generated binding to create, compile, and execute queries:
+  <ul>
+    <li><a class="el" href="Test_Zorba_8java-example.html">Test_Zorba.java</a>
+  </ul>
 
   \example Test_Zorba.java
-   This is a simple example that demonstrate how to use the SWIG generated binding to create, compile, and execute queries.
  */
 

=== modified file 'doc/php/manual/indexpage.dox'
--- doc/php/manual/indexpage.dox	2013-02-07 17:24:36 +0000
+++ doc/php/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,16 +1,26 @@
 /*! \mainpage PHP API Documentation
 
-  Zorba ships with a PHP language binding that provides some basic features in order to prepare and execute queries
-  with Zorba.
-  
-  The <a href="http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery";>following tutorial</a> provides an overview on how to leverage Zorba into PHP applications. 
-  We also provide the following <a class="en" href="examples.html">set of examples</a> that show how the Zorba PHP API can be used.
+  %Zorba ships with a PHP language binding that provides some basic features in
+  order to prepare and execute queries with %Zorba.
+
+  The <a href="http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery";>following tutorial</a>
+  provides an overview on how to leverage %Zorba into PHP applications.
+  We also provide the following set of examples that show how the %Zorba PHP API
+  can be used:
+  <ul>
+    <li><a class="el" href="test_8php-example.html">test.php</a>
+    <li><a class="el" href="simple_8php-example.html">simple.php</a>
+  </ul>
 
   \section note Note for non-C++ language bindings
-  Zorba's current API documentation is generated from the C++ source. The PHP language API is derived directly from this. The information contained in this documentation is accurate for PHP, although it will look somewhat odd.
+  %Zorba's current API documentation is generated from the C++ source. The PHP
+  language API is derived directly from this. The information contained in this
+  documentation is accurate for PHP, although it will look somewhat odd.
 
   \example test.php
-   This is a simple example that demonstrate how to use the Zorba XQuery Engine to
-   create, compile, and execute queries.
+  This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
+  to create, compile, and execute queries.
+
+  \example simple.php
  */
 

=== modified file 'doc/python/manual/indexpage.dox'
--- doc/python/manual/indexpage.dox	2013-02-07 17:24:36 +0000
+++ doc/python/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,20 +1,27 @@
 /*! \mainpage Python API Documentation
 
-  Zorba ships with a Python language binding that provides some basic features in order to prepare and execute queries
-  with Zorba.
-
-  We also provide a <a class="en" href="examples.html">set of examples</a> that show how this language binding can be used.
-
-  \section note Note for garbage collected languages
-  Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
-  the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
-  is destroyed.
-
-  \section note Note for non-C++ language bindings
-  Zorba's current API documentation is generated from the C++ source. The Python language API is derived directly from this. The information contained in this documentation is accurate for Python, although it will look somewhat odd.
+  %Zorba ships with a Python language binding that provides some basic features
+  in order to prepare and execute queries with %Zorba.
+
+  We also provide a set of examples that show how this language binding can
+  be used:
+  <ul>
+    <li><a class="el" href="python_test_8py-example.html">python_test.py</a>
+  </ul>
+
+  \section note1 Note for garbage collected languages
+  %Zorba requires that objects must be deleted in a certain order, which Garbage
+  Collectors are not aware of. For that reason, the Iterators created with
+  XQuery.iterator() must be explicitly destroyed with iterator.destroy() before
+  the %XQuery object is destroyed.
+
+  \section note2 Note for non-C++ language bindings
+  %Zorba's current API documentation is generated from the C++ source. The Python
+  language API is derived directly from this. The information contained in this
+  documentation is accurate for Python, although it will look somewhat odd.
 
   \example python_test.py
-   This is a simple example that demonstrate how to use the Zorba XQuery Engine to
-   create, compile, and execute queries.
+  This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
+  to create, compile, and execute queries.
  */
 

=== modified file 'doc/ruby/manual/indexpage.dox'
--- doc/ruby/manual/indexpage.dox	2013-02-07 17:24:36 +0000
+++ doc/ruby/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,20 +1,26 @@
 /*! \mainpage Ruby API Documentation
 
-  Zorba ships with a Ruby language binding that provides some basic features in order to prepare and execute queries
-  with Zorba.
-
-  We also provide a <a class="en" href="examples.html">set of examples</a> that show how this language binding can be used.
-
-  \section note Note for garbage collected languages
-  Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason, 
-  the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
-  is destroyed.
-
-  \section note Note for non-C++ language bindings
-  Zorba's current API documentation is generated from the C++ source. The Ruby language API is derived directly from this. The information contained in this documentation is accurate for Ruby, although it will look somewhat odd.
+  %Zorba ships with a Ruby language binding that provides some basic features in
+  order to prepare and execute queries with %Zorba.
+
+  We also provide some examples that show how this language binding can be used:
+  <ul>
+    <li><a class="el" href="ruby_test_8rb-example.html">ruby_test.rb</a>
+  </ul>
+
+  \section note1 Note for garbage collected languages
+  %Zorba requires that objects must be deleted in a certain order, which Garbage
+  Collectors are not aware of. For that reason,the Iterators created with
+  XQuery.iterator() must be explicitly destroyed with iterator.destroy()
+  before the %XQuery object is destroyed.
+
+  \section note2 Note for non-C++ language bindings
+  %Zorba's current API documentation is generated from the C++ source. The Ruby
+  language API is derived directly from this. The information contained in this
+  documentation is accurate for Ruby, although it will look somewhat odd.
 
   \example ruby_test.rb
-   This is a simple example that demonstrate how to use the Zorba XQuery Engine to
-   create, compile, and execute queries.
+   This is a simple example that demonstrate how to use the %Zorba %XQuery
+   Engine to create, compile, and execute queries.
  */
 

=== modified file 'doc/xqj/manual/indexpage.dox'
--- doc/xqj/manual/indexpage.dox	2012-03-26 23:06:10 +0000
+++ doc/xqj/manual/indexpage.dox	2013-09-17 13:34:04 +0000
@@ -1,18 +1,21 @@
 /*! \mainpage XQJ API Documentation
 
-  Zorba ships with a XQJ binding that provides basic features in order to prepare and execute queries
-  with Zorba.
-
-  For the moment, we provide a <a class="en" href="examples.html">TCK set</a> that show how this language binding can be used.
-  
+  %Zorba ships with a XQJ binding that provides basic features in order to
+  prepare and execute queries with %Zorba.
+
+  For the moment, we provide a TCK set that show how this language binding can be used:
+  <ul>
+    <li><a class="el" href="Test_Zorba_8java-example.html">Test_Zorba.java</a>
+  </ul>
+
   \section note Note for garbage collected languages
-  Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason, 
-  the Iterators created with XQuery.iterator() must be explicitly deleted with iterator.delete() before the XQuery 
-  object is deleted.
-  
+  %Zorba requires that objects must be deleted in a certain order, which Garbage
+  Collectors are not aware of. For that reason, the Iterators created with
+  XQuery.iterator() must be explicitly deleted with iterator.delete() before
+  the %XQuery object is deleted.
 
   \example Test_Zorba.java
-   This is a simple example that demonstrate how to use the Zorba XQuery Engine to
-   create, compile, and execute queries.
+  This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
+  to create, compile, and execute queries.
  */
 

=== added file 'doc/zorba/JSONforXQuery.dox'
--- doc/zorba/JSONforXQuery.dox	1970-01-01 00:00:00 +0000
+++ doc/zorba/JSONforXQuery.dox	2013-09-17 13:34:04 +0000
@@ -0,0 +1,4 @@
+/** \page JSON_for_XQuery JSONiq for XQuery users tutorial
+
+\htmlinclude JSONforXQuery.html
+*/

=== modified file 'doc/zorba/JSONforXQuery.html'
--- doc/zorba/JSONforXQuery.html	2013-02-07 17:24:36 +0000
+++ doc/zorba/JSONforXQuery.html	2013-09-17 13:34:04 +0000
@@ -1,1 +1,1 @@
-<html><head><title>JSON for XQuery</title><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=lhDjYqiy3mZ0x6ROQEUoUw');ol{margin:0;padding:0}.c9{padding-left:0pt;text-align:justify;margin-left:36pt}.c7{list-style-type:disc;margin:0;padding:0}.c19{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c20{color:inherit;text-decoration:inherit}.c11{text-indent:-13pt;margin-left:77pt}.c2{font-size:36pt;font-weight:bold}.c21{color:#1155cc;text-decoration:underline}.c16{font-weight:bold}.c3{color:#38761d}.c15{text-indent:120pt}.c22{color:#4a86e8}.c17{text-align:center}.c13{margin-left:49.5pt}.c6{text-align:right}.c10{text-indent:156pt}.c0{font-family:"Consolas"}.c12{text-indent:144pt}.c14{text-align:justify}.c8{text-indent:139.5pt}.c5{margin-left:144pt}.c18{font-style:italic}.c4{height:11pt}.c1{direction:ltr}.title{padding-top:24pt;line-height:1.15;text-align:center;color:#4a86e8;font-size:36pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}.subtitle{padding-top:18pt;line-height:1.15;text-align:left;color:#666666;font-style:italic;font-size:24pt;font-family:"Georgia";padding-bottom:4pt}li{color:#000000;font-size:11pt;font-family:"Arial"}p{color:#000000;font-size:11pt;margin:0;font-family:"Arial"}h1{padding-top:24pt;line-height:1.15;text-align:left;color:#4a86e8;font-size:24pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;line-height:1.15;text-align:left;color:#ff9900;font-size:18pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;line-height:1.15;text-align:left;color:#000000;font-size:14pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;line-height:1.15;text-align:left;color:#000000;font-size:12pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;line-height:1.15;text-align:left;color:#000000;font-size:11pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;line-height:1.15;text-align:left;color:#000000;font-size:10pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}</style></head><body class="c19"><p class="c17 c1"><span class="c2">JSONiq for XQuery users</span></p><p class="c4 c1 c15"><span></span></p><hr><p class="c1 c17"><span>This tutorial introduces the JSONiq language, which declaratively manipulates JSON data.</span></p><p class="c17 c1"><span>Why don&#39;t you go ahead can try the queries of this document on our online demo interface?</span></p><p class="c17 c1"><span>&nbsp;</span><span class="c21 c16"><a class="c20" href="http://www.zorba-xquery.com/html/jsoniq";>http://www.zorba-xquery.com/html/jsoniq</a></span></p><hr><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.f453h84m2u1a"></a><span>JSON</span></h1><p class="c14 c1"><span>As explained on </span><span class="c21"><a class="c20" href="http://www.json.org/";>http://www.json.org/</a></span><span>, JSON is a lightweight data-interchange format designed for humans as well as for computers. It supports as values:</span></p><ol class="c7" start="1"><li class="c9 c1"><span>objects (string-to-value map)</span></li><li class="c9 c1"><span>arrays (ordered sequence of values)</span></li><li class="c1 c9"><span>strings</span></li><li class="c9 c1"><span>numbers</span></li><li class="c9 c1"><span>booleans (true, false)</span></li><li class="c9 c1"><span>null</span></li></ol><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq extends XQuery to query and update JSON data, like XML data.</span></p><h1 class="c1"><a name="h.qtfakecy3fr7"></a><span>Elevator Pitch</span></h1><p class="c14 c1"><span>Here is an appetizer before we start the tutorial from scratch.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $stores :=</span></p><p class="c1"><span class="c0">[</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $sales := [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $join :=</span></p><p class="c1"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c1"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c1"><span class="c0">&nbsp; return {</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c1"><span class="c0">&nbsp; }</span></p><p class="c1"><span class="c0">return [$join]</span></p><p class="c5 c1"><span class="c3 c0">[ </span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c5 c1"><span class="c3 c0">&nbsp;]</span></p><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.yugk1mszt0re"></a><span>And here you go</span></h1><h2 class="c1"><a name="h.39rm37noeh9g"></a><span>JSONiq types</span></h2><p class="c1"><span>JSONiq maps JSON types to the XQuery data model. Numbers are xs:integer, xs:decimal or xs:double, strings are xs:string, true and false are xs:boolean and null is the unique value of a new atomic type jn:null.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>By default, in JSONiq, for convenience, true, false and null are recognized as literals instead of the classical XQuery path expression semantics (i.e., they would otherwise navigate to XML elements named &quot;true&quot;, &quot;false&quot; or &quot;null&quot;). However, this can be deactivated to use the path expression semantics.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq also introduces new items: objects and arrays. Objects are sets of key/value pairs. Arrays have members which are values. Values are objects, arrays, XML nodes, functions or atomic items. Note that, in particular, Arrays can nest, unlike sequences.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>The new item types for objects and arrays are object() and array(). json-item() is a supertype of both. structured-item() is a supertype for json-item() and node().</span></p><h2 class="c1"><a name="h.j0wg8654ivtw"></a><span>JSON Constructors</span></h2><p class="c1"><span>JSONiq introduces JSON constructors, in a similar way to XML constructors.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>You can put any expression in a array. The items in the sequence produced by the expression will become members of the array:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">[ 1 to 10 ]</span></p><p class="c6 c1"><span class="c3 c0">[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>Or you can dynamically compute an object:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">{</span></p><p class="c1"><span class="c0">&nbsp; &quot;Greeting&quot; : let $d := &quot;Mister Spock&quot;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return concat(&quot;Hello, &quot;, $d),</span></p><p class="c1"><span class="c0">&nbsp; &quot;Farewell&quot; : string-join((&quot;Live&quot;, &quot;long&quot;, &quot;and&quot;, &quot;prosper&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot; &quot;)</span></p><p class="c1"><span class="c0">}</span></p><p class="c4 c1"><span class="c3 c0"></span></p><p class="c6 c1"><span class="c3 c0">{ &quot;Greeting&quot; : &quot;Hello, Mister Spock&quot;, &quot;Farewell&quot; : &quot;Live long and prosper&quot; }</span></p><p class="c4 c1"><span class="c3"></span></p><p class="c1"><span>You can also dynamically generate singleton objects:</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{ concat(&quot;Square of &quot;, 2) : 2 * 2 }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;Square of 2&quot; : 4 }</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>and then use the {| |} construct to wrap several of them in a bigger object:</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{|</span></p><p class="c1"><span class="c0">&nbsp; for $i in 1 to 10</span></p><p class="c1"><span class="c0">&nbsp; return { concat(&quot;Square of &quot;, $i) : $i * $i }</span></p><p class="c1"><span class="c0">|}</span></p><p class="c5 c1"><span class="c3 c0">{</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 1&quot; : 1,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 2&quot; : 4,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 3&quot; : 9,</span></p><p class="c1 c5"><span class="c3 c0">&quot;Square of 4&quot; : 16,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 5&quot; : 25,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 6&quot; : 36,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 7&quot; : 49,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 8&quot; : 64,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 9&quot; : 81,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 10&quot; : 100</span></p><p class="c5 c1"><span class="c3 c0">}</span></p><p class="c4 c1"><span></span></p><h2 class="c1"><a name="h.qe57mgdf5ql"></a><span>JSON as a subset of JSONiq</span></h2><p class="c14 c1"><span>As a rule of thumb, a well-formed JSON document is a JSONiq expression as well. This means that you can copy-and-paste a JSON document into a query. The following are JSONiq queries that are &quot;idempotent&quot; (they just output themselves):</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c1 c4"><span class="c3 c0"></span></p><p class="c1"><span class="c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c6 c1"><span class="c3 c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{</span></p><p class="c1"><span class="c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot;] },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; { &quot;unary&quot; : [&quot;not&quot;] }</span></p><p class="c1"><span class="c0">&nbsp; ],</span></p><p class="c1"><span class="c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; 0, 1</span></p><p class="c1"><span class="c0">&nbsp; ]</span></p><p class="c1"><span class="c0">}</span></p><p class="c12 c1"><span class="c0 c3">{</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot; ] },</span></p><p class="c1 c12"><span class="c3 c0">&nbsp; &nbsp; { &quot;unary&quot; : [ &quot;not&quot; ] }</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; ],</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &nbsp; 0, 1</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; ]</span></p><p class="c12 c1"><span class="c3 c0">}</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c14 c1"><span>This works with objects, arrays (even nested), strings, numbers, booleans, null. </span><span class="c18">The exceptions to this rule (but we are working on it!) are that:</span></p><p class="c14 c1"><span class="c18">(i) empty objects are not recognized</span></p><p class="c14 c1"><span class="c18">(ii) characters escaped with the \ in JSON strings are not recognized, XML character references are recognized instead.</span></p><p class="c4 c1"><span class="c0 c18"></span></p><p class="c14 c1"><span>It also works the other way round: if your query outputs an object or an array, you can directly use it as a JSON document.</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><h1 class="c1"><a name="h.dewn8sw3husv"></a><span>JSON Navigation</span></h1><p class="c14 c1"><span>Up to now, you learnt how to compose expressions so as to do some computations and to build objects and arrays. It also works the other way round: if you have some JSON data, you can access it and navigate.</span></p><p class="c10 c4 c1"><span></span></p><p class="c14 c1"><span>All you need to know is: JSONiq views</span></p><ol class="c7" start="1"><li class="c9 c1"><span>an array as an ordered list of values,</span></li><li class="c9 c1"><span>an object as a set of name/value pairs</span></li></ol><h2 class="c14 c1"><a name="h.zcnazhl6374z"></a><span>Objects</span></h2><p class="c14 c1"><span>You can use an object as if it were a function and pass the call an argument of type xs:string. It will return the value associated thereto:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;first name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return $person(&quot;first name&quot;)</span></p><p class="c6 c10 c1"><span class="c3 c0">&quot;Sarah&quot;</span></p><p class="c10 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>You can also ask for all keys in an object:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return { &quot;keys&quot; : [ jn:keys($person)] }</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c1 c11"><span class="c3 c0">{ &quot;keys&quot; : [ &quot;name&quot;, &quot;age&quot;, &quot;gender&quot;, &quot;friends&quot; ] }</span></p><h2 class="c1"><a name="h.30wafxvenhgy"></a><span>Arrays</span></h2><p class="c14 c1"><span>You can use an array as if it were a function and pass the call an argument of type xs:integer. It will return the entry at that position:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $friends := [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">return $friends(2)</span></p><p class="c6 c10 c1"><span class="c3 c0">Mary</span></p><p class="c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>It is also possible to get the size of an array:</span></p><p class="c4 c1 c10"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return { &quot;how many friends&quot; : jn:size($person(&quot;friends&quot;)) }</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c10 c1"><span class="c3 c0">{ &quot;how many friends&quot; : 3 }</span></p><p class="c10 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>For convenience, there is a function that returns all elements in an array, as a sequence:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return jn:members($person(&quot;friends&quot;))</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c6 c10 c1"><span class="c3 c0">Jim Mary Jennifer</span></p><h1 class="c1"><a name="h.eb0bxle2oykl"></a><span>Relational Algebra</span></h1><p class="c14 c1"><span>Remember SQL&#39;s SELECT FROM WHERE statements? JSONiq inherits selection, projection and join capability from XQuery FLWOR expressions. In order to traverse an array, jn:members() converts it into a sequence which can then be iterated over by a FLWOR expression.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $stores :=</span></p><p class="c1"><span class="c0">[</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $sales := [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $join :=</span></p><p class="c1"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c1"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c1"><span class="c0">&nbsp; return {</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c1"><span class="c0">&nbsp; }</span></p><p class="c1"><span class="c0">return [$join]</span></p><p class="c8 c1"><span class="c3 c0">[ </span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c1 c8"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c8 c1"><span class="c3 c0">&nbsp;]</span></p><h1 class="c1"><a name="h.oii6pvliilhi"></a><span>Access external data</span></h1><p class="c1"><span>Our implementation supports collections of (and indices on) JSON objects or arrays:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">dml:collection(&quot;my:data&quot;)</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;Your&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;Collection&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;of&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;JSON&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;objects&quot; }</span></p><p class="c4 c1 c6"><span class="c3 c0"></span></p><p class="c1"><span>It is also possible to get JSON content with an HTTP request, or by parsing it from a string. The EXPath http-client module (described in the Zorba documentation) &nbsp;allows you to make HTTP requests, and the jn:parse-json() function allows you to use the body as an object or an array.</span></p><p class="c4 c1"><span class="c3 c0"></span></p><h1 class="c1"><a name="h.fopcxnkoydgt"></a><span>JSON and XML</span></h1><p class="c14 c1"><span>You can use XML and JSON in the same program. An XML node can be a value in an object or array, however, arrays and object may not be children of an XML node - but you can extract atomic values or XML nodes inside objects and arrays to insert them in a new XML node.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $data := {</span></p><p class="c1"><span class="c0">&nbsp; &quot;color&quot; : &quot;blue&quot;,</span></p><p class="c1"><span class="c0">&nbsp; &quot;closed&quot; : true,</span></p><p class="c1"><span class="c0">&nbsp; &quot;points&quot; : [[10,10], [20,10], [20,20], [10,20]]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">let $stroke := attribute stroke { $data(&quot;color&quot;) }</span></p><p class="c1"><span class="c0">let $points := attribute points { jn:flatten($data(&quot;points&quot;)) }</span></p><p class="c1"><span class="c0">return</span></p><p class="c1"><span class="c0">&nbsp; if ($data(&quot;closed&quot;)) then</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &lt;svg&gt;&lt;polygon&gt;{ $stroke, $points }&lt;/polygon&gt;&lt;/svg&gt;</span></p><p class="c1"><span class="c0">&nbsp; else</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &lt;svg&gt;&lt;polyline&gt;{ $stroke, $points }&lt;/polyline&gt;&lt;/svg&gt;</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c13 c6 c1"><span class="c3 c0">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span></p><p class="c6 c1 c13"><span class="c3 c0">&lt;svg&gt;&lt;polygon stroke=&quot;blue&quot; points=&quot;10 10 20 10 20 20 10 20&quot;/&gt;&lt;/svg&gt;</span></p><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.bm3buqmzhtko"></a><span>I want more</span></h1><p class="c1 c14"><span>JSONiq supports JSON updates by extending the XQuery Update Facility specification, so you can declaratively update your JSON data. JSONiq provides new expressions that produce update primitives on JSON items. The list of updates that is eventually output by your program is then applied to your JSON data.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">copy $people := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;John&quot; : { &quot;status&quot; : &quot;single&quot; },</span></p><p class="c1"><span class="c0">&nbsp;&quot;Mary&quot; : { &quot;status&quot; : &quot;single&quot; } }</span></p><p class="c1"><span class="c0">modify (replace json value of $people(&quot;John&quot;)(&quot;status&quot;) with &quot;married&quot;,</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; replace json value of $people(&quot;Mary&quot;)(&quot;status&quot;) with &quot;married&quot;)</span></p><p class="c1"><span class="c0">return $people</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c1"><span class="c3 c0">{ &quot;John&quot; : { &quot;status&quot; : &quot;married&quot; }, &quot;Mary&quot; : { &quot;status&quot; : &quot;married&quot; } }</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq works with the XQuery 3.0 standard (switch, typeswitch and try-catch expressions, universal/existential quantifiers, path expressions, filtering expressions, functors, mappings, grouping, windowing will work). The Zorba implementation is also compatible with the proprietary Zorba scripting.</span></p><p class="c4 c1"><span></span></p><p class="c14 c1"><span>The complete JSONiq specification is available on </span><span class="c21"><a class="c20" href="http://jsoniq.org/";>http://jsoniq.org/</a></span></p><p class="c4 c1"><span></span></p></body></html>
\ No newline at end of file
+<html><head><title>JSON for XQuery</title><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=lhDjYqiy3mZ0x6ROQEUoUw');ol{margin:0;padding:0}.c9{padding-left:0pt;text-align:justify;margin-left:36pt}.c7{list-style-type:disc;margin:0;padding:0}.c19{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c20{color:inherit;text-decoration:inherit}.c11{text-indent:-13pt;margin-left:77pt}.c2{font-size:36pt;font-weight:bold}.c21{color:#1155cc;text-decoration:underline}.c16{font-weight:bold}.c3{color:#38761d}.c15{text-indent:120pt}.c22{color:#4a86e8}.c17{text-align:center}.c13{margin-left:49.5pt}.c6{text-align:right}.c10{text-indent:156pt}.c0{font-family:"Consolas"}.c12{text-indent:144pt}.c14{text-align:justify}.c8{text-indent:139.5pt}.c5{margin-left:144pt}.c18{font-style:italic}.c4{height:11pt}.c1{direction:ltr}.title{padding-top:24pt;line-height:1.15;text-align:center;color:#4a86e8;font-size:36pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}.subtitle{padding-top:18pt;line-height:1.15;text-align:left;color:#666666;font-style:italic;font-size:24pt;font-family:"Georgia";padding-bottom:4pt}li{color:#000000;font-size:11pt;font-family:"Arial"}p{color:#000000;font-size:11pt;margin:0;font-family:"Arial"}h1{padding-top:24pt;line-height:1.15;text-align:left;color:#4a86e8;font-size:24pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;line-height:1.15;text-align:left;color:#ff9900;font-size:18pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;line-height:1.15;text-align:left;color:#000000;font-size:14pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;line-height:1.15;text-align:left;color:#000000;font-size:12pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;line-height:1.15;text-align:left;color:#000000;font-size:11pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;line-height:1.15;text-align:left;color:#000000;font-size:10pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}</style></head><body class="c19"><p class="c17 c1"><span class="c2">JSONiq for XQuery users</span></p><p class="c4 c1 c15"><span></span></p><p class="c1 c17"><span>This tutorial introduces the JSONiq language, which declaratively manipulates JSON data.</span></p><p class="c17 c1"><span>Why don&#39;t you go ahead can try the queries of this document on our online demo interface?</span></p><p class="c17 c1"><span>&nbsp;</span><span class="c21 c16"><a class="c20" href="http://www.zorba-xquery.com/html/jsoniq";>http://www.zorba-xquery.com/html/jsoniq</a></span></p><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.f453h84m2u1a"></a><span>JSON</span></h1><p class="c14 c1"><span>As explained on </span><span class="c21"><a class="c20" href="http://www.json.org/";>http://www.json.org/</a></span><span>, JSON is a lightweight data-interchange format designed for humans as well as for computers. It supports as values:</span></p><ol class="c7" start="1"><li class="c9 c1"><span>objects (string-to-value map)</span></li><li class="c9 c1"><span>arrays (ordered sequence of values)</span></li><li class="c1 c9"><span>strings</span></li><li class="c9 c1"><span>numbers</span></li><li class="c9 c1"><span>booleans (true, false)</span></li><li class="c9 c1"><span>null</span></li></ol><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq extends XQuery to query and update JSON data, like XML data.</span></p><h1 class="c1"><a name="h.qtfakecy3fr7"></a><span>Elevator Pitch</span></h1><p class="c14 c1"><span>Here is an appetizer before we start the tutorial from scratch.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $stores :=</span></p><p class="c1"><span class="c0">[</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $sales := [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $join :=</span></p><p class="c1"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c1"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c1"><span class="c0">&nbsp; return {</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c1"><span class="c0">&nbsp; }</span></p><p class="c1"><span class="c0">return [$join]</span></p><p class="c5 c1"><span class="c3 c0">[ </span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c5 c1"><span class="c3 c0">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c5 c1"><span class="c3 c0">&nbsp;]</span></p><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.yugk1mszt0re"></a><span>And here you go</span></h1><h2 class="c1"><a name="h.39rm37noeh9g"></a><span>JSONiq types</span></h2><p class="c1"><span>JSONiq maps JSON types to the XQuery data model. Numbers are xs:integer, xs:decimal or xs:double, strings are xs:string, true and false are xs:boolean and null is the unique value of a new atomic type jn:null.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>By default, in JSONiq, for convenience, true, false and null are recognized as literals instead of the classical XQuery path expression semantics (i.e., they would otherwise navigate to XML elements named &quot;true&quot;, &quot;false&quot; or &quot;null&quot;). However, this can be deactivated to use the path expression semantics.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq also introduces new items: objects and arrays. Objects are sets of key/value pairs. Arrays have members which are values. Values are objects, arrays, XML nodes, functions or atomic items. Note that, in particular, Arrays can nest, unlike sequences.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>The new item types for objects and arrays are object() and array(). json-item() is a supertype of both. structured-item() is a supertype for json-item() and node().</span></p><h2 class="c1"><a name="h.j0wg8654ivtw"></a><span>JSON Constructors</span></h2><p class="c1"><span>JSONiq introduces JSON constructors, in a similar way to XML constructors.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>You can put any expression in a array. The items in the sequence produced by the expression will become members of the array:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">[ 1 to 10 ]</span></p><p class="c6 c1"><span class="c3 c0">[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>Or you can dynamically compute an object:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">{</span></p><p class="c1"><span class="c0">&nbsp; &quot;Greeting&quot; : let $d := &quot;Mister Spock&quot;</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return concat(&quot;Hello, &quot;, $d),</span></p><p class="c1"><span class="c0">&nbsp; &quot;Farewell&quot; : string-join((&quot;Live&quot;, &quot;long&quot;, &quot;and&quot;, &quot;prosper&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot; &quot;)</span></p><p class="c1"><span class="c0">}</span></p><p class="c4 c1"><span class="c3 c0"></span></p><p class="c6 c1"><span class="c3 c0">{ &quot;Greeting&quot; : &quot;Hello, Mister Spock&quot;, &quot;Farewell&quot; : &quot;Live long and prosper&quot; }</span></p><p class="c4 c1"><span class="c3"></span></p><p class="c1"><span>You can also dynamically generate singleton objects:</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{ concat(&quot;Square of &quot;, 2) : 2 * 2 }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;Square of 2&quot; : 4 }</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>and then use the {| |} construct to wrap several of them in a bigger object:</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{|</span></p><p class="c1"><span class="c0">&nbsp; for $i in 1 to 10</span></p><p class="c1"><span class="c0">&nbsp; return { concat(&quot;Square of &quot;, $i) : $i * $i }</span></p><p class="c1"><span class="c0">|}</span></p><p class="c5 c1"><span class="c3 c0">{</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 1&quot; : 1,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 2&quot; : 4,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 3&quot; : 9,</span></p><p class="c1 c5"><span class="c3 c0">&quot;Square of 4&quot; : 16,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 5&quot; : 25,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 6&quot; : 36,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 7&quot; : 49,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 8&quot; : 64,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 9&quot; : 81,</span></p><p class="c5 c1"><span class="c3 c0">&quot;Square of 10&quot; : 100</span></p><p class="c5 c1"><span class="c3 c0">}</span></p><p class="c4 c1"><span></span></p><h2 class="c1"><a name="h.qe57mgdf5ql"></a><span>JSON as a subset of JSONiq</span></h2><p class="c14 c1"><span>As a rule of thumb, a well-formed JSON document is a JSONiq expression as well. This means that you can copy-and-paste a JSON document into a query. The following are JSONiq queries that are &quot;idempotent&quot; (they just output themselves):</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c1 c4"><span class="c3 c0"></span></p><p class="c1"><span class="c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c6 c1"><span class="c3 c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c1"><span class="c0">{</span></p><p class="c1"><span class="c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot;] },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; { &quot;unary&quot; : [&quot;not&quot;] }</span></p><p class="c1"><span class="c0">&nbsp; ],</span></p><p class="c1"><span class="c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; 0, 1</span></p><p class="c1"><span class="c0">&nbsp; ]</span></p><p class="c1"><span class="c0">}</span></p><p class="c12 c1"><span class="c0 c3">{</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot; ] },</span></p><p class="c1 c12"><span class="c3 c0">&nbsp; &nbsp; { &quot;unary&quot; : [ &quot;not&quot; ] }</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; ],</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; &nbsp; 0, 1</span></p><p class="c12 c1"><span class="c3 c0">&nbsp; ]</span></p><p class="c12 c1"><span class="c3 c0">}</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><p class="c14 c1"><span>This works with objects, arrays (even nested), strings, numbers, booleans, null. </span><span class="c18">The exceptions to this rule (but we are working on it!) are that:</span></p><p class="c14 c1"><span class="c18">(i) empty objects are not recognized</span></p><p class="c14 c1"><span class="c18">(ii) characters escaped with the \ in JSON strings are not recognized, XML character references are recognized instead.</span></p><p class="c4 c1"><span class="c0 c18"></span></p><p class="c14 c1"><span>It also works the other way round: if your query outputs an object or an array, you can directly use it as a JSON document.</span></p><p class="c6 c4 c1"><span class="c3 c0"></span></p><h1 class="c1"><a name="h.dewn8sw3husv"></a><span>JSON Navigation</span></h1><p class="c14 c1"><span>Up to now, you learnt how to compose expressions so as to do some computations and to build objects and arrays. It also works the other way round: if you have some JSON data, you can access it and navigate.</span></p><p class="c10 c4 c1"><span></span></p><p class="c14 c1"><span>All you need to know is: JSONiq views</span></p><ol class="c7" start="1"><li class="c9 c1"><span>an array as an ordered list of values,</span></li><li class="c9 c1"><span>an object as a set of name/value pairs</span></li></ol><h2 class="c14 c1"><a name="h.zcnazhl6374z"></a><span>Objects</span></h2><p class="c14 c1"><span>You can use an object as if it were a function and pass the call an argument of type xs:string. It will return the value associated thereto:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;first name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return $person(&quot;first name&quot;)</span></p><p class="c6 c10 c1"><span class="c3 c0">&quot;Sarah&quot;</span></p><p class="c10 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>You can also ask for all keys in an object:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return { &quot;keys&quot; : [ jn:keys($person)] }</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c1 c11"><span class="c3 c0">{ &quot;keys&quot; : [ &quot;name&quot;, &quot;age&quot;, &quot;gender&quot;, &quot;friends&quot; ] }</span></p><h2 class="c1"><a name="h.30wafxvenhgy"></a><span>Arrays</span></h2><p class="c14 c1"><span>You can use an array as if it were a function and pass the call an argument of type xs:integer. It will return the entry at that position:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $friends := [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">return $friends(2)</span></p><p class="c6 c10 c1"><span class="c3 c0">Mary</span></p><p class="c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>It is also possible to get the size of an array:</span></p><p class="c4 c1 c10"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return { &quot;how many friends&quot; : jn:size($person(&quot;friends&quot;)) }</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c10 c1"><span class="c3 c0">{ &quot;how many friends&quot; : 3 }</span></p><p class="c10 c4 c1"><span class="c3 c0"></span></p><p class="c1"><span>For convenience, there is a function that returns all elements in an array, as a sequence:</span></p><p class="c10 c4 c1"><span></span></p><p class="c1"><span class="c0">let $person := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;age&quot; : 13,</span></p><p class="c1"><span class="c0">&nbsp;&quot;gender&quot; : &quot;female&quot;,</span></p><p class="c1"><span class="c0">&nbsp;&quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">return jn:members($person(&quot;friends&quot;))</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c6 c10 c1"><span class="c3 c0">Jim Mary Jennifer</span></p><h1 class="c1"><a name="h.eb0bxle2oykl"></a><span>Relational Algebra</span></h1><p class="c14 c1"><span>Remember SQL&#39;s SELECT FROM WHERE statements? JSONiq inherits selection, projection and join capability from XQuery FLWOR expressions. In order to traverse an array, jn:members() converts it into a sequence which can then be iterated over by a FLWOR expression.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $stores :=</span></p><p class="c1"><span class="c0">[</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c1"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $sales := [</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c1"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c1"><span class="c0">]</span></p><p class="c1"><span class="c0">let $join :=</span></p><p class="c1"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c1"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c1"><span class="c0">&nbsp; return {</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c1"><span class="c0">&nbsp; }</span></p><p class="c1"><span class="c0">return [$join]</span></p><p class="c8 c1"><span class="c3 c0">[ </span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c1 c8"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c8 c1"><span class="c3 c0">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c8 c1"><span class="c3 c0">&nbsp;]</span></p><h1 class="c1"><a name="h.oii6pvliilhi"></a><span>Access external data</span></h1><p class="c1"><span>Our implementation supports collections of (and indices on) JSON objects or arrays:</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">dml:collection(&quot;my:data&quot;)</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;Your&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;Collection&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;of&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;JSON&quot; }</span></p><p class="c6 c1"><span class="c3 c0">{ &quot;foo&quot; : &quot;objects&quot; }</span></p><p class="c4 c1 c6"><span class="c3 c0"></span></p><p class="c1"><span>It is also possible to get JSON content with an HTTP request, or by parsing it from a string. The EXPath http-client module (described in the Zorba documentation) &nbsp;allows you to make HTTP requests, and the jn:parse-json() function allows you to use the body as an object or an array.</span></p><p class="c4 c1"><span class="c3 c0"></span></p><h1 class="c1"><a name="h.fopcxnkoydgt"></a><span>JSON and XML</span></h1><p class="c14 c1"><span>You can use XML and JSON in the same program. An XML node can be a value in an object or array, however, arrays and object may not be children of an XML node - but you can extract atomic values or XML nodes inside objects and arrays to insert them in a new XML node.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">let $data := {</span></p><p class="c1"><span class="c0">&nbsp; &quot;color&quot; : &quot;blue&quot;,</span></p><p class="c1"><span class="c0">&nbsp; &quot;closed&quot; : true,</span></p><p class="c1"><span class="c0">&nbsp; &quot;points&quot; : [[10,10], [20,10], [20,20], [10,20]]</span></p><p class="c1"><span class="c0">}</span></p><p class="c1"><span class="c0">let $stroke := attribute stroke { $data(&quot;color&quot;) }</span></p><p class="c1"><span class="c0">let $points := attribute points { jn:flatten($data(&quot;points&quot;)) }</span></p><p class="c1"><span class="c0">return</span></p><p class="c1"><span class="c0">&nbsp; if ($data(&quot;closed&quot;)) then</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &lt;svg&gt;&lt;polygon&gt;{ $stroke, $points }&lt;/polygon&gt;&lt;/svg&gt;</span></p><p class="c1"><span class="c0">&nbsp; else</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &lt;svg&gt;&lt;polyline&gt;{ $stroke, $points }&lt;/polyline&gt;&lt;/svg&gt;</span></p><p class="c4 c1"><span class="c0"></span></p><p class="c13 c6 c1"><span class="c3 c0">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;</span></p><p class="c6 c1 c13"><span class="c3 c0">&lt;svg&gt;&lt;polygon stroke=&quot;blue&quot; points=&quot;10 10 20 10 20 20 10 20&quot;/&gt;&lt;/svg&gt;</span></p><p class="c4 c1"><span></span></p><h1 class="c1"><a name="h.bm3buqmzhtko"></a><span>I want more</span></h1><p class="c1 c14"><span>JSONiq supports JSON updates by extending the XQuery Update Facility specification, so you can declaratively update your JSON data. JSONiq provides new expressions that produce update primitives on JSON items. The list of updates that is eventually output by your program is then applied to your JSON data.</span></p><p class="c4 c1"><span></span></p><p class="c1"><span class="c0">copy $people := {</span></p><p class="c1"><span class="c0">&nbsp;&quot;John&quot; : { &quot;status&quot; : &quot;single&quot; },</span></p><p class="c1"><span class="c0">&nbsp;&quot;Mary&quot; : { &quot;status&quot; : &quot;single&quot; } }</span></p><p class="c1"><span class="c0">modify (replace json value of $people(&quot;John&quot;)(&quot;status&quot;) with &quot;married&quot;,</span></p><p class="c1"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; replace json value of $people(&quot;Mary&quot;)(&quot;status&quot;) with &quot;married&quot;)</span></p><p class="c1"><span class="c0">return $people</span></p><p class="c10 c4 c1"><span class="c0"></span></p><p class="c6 c1"><span class="c3 c0">{ &quot;John&quot; : { &quot;status&quot; : &quot;married&quot; }, &quot;Mary&quot; : { &quot;status&quot; : &quot;married&quot; } }</span></p><p class="c4 c1"><span></span></p><p class="c1"><span>JSONiq works with the XQuery 3.0 standard (switch, typeswitch and try-catch expressions, universal/existential quantifiers, path expressions, filtering expressions, functors, mappings, grouping, windowing will work). The Zorba implementation is also compatible with the proprietary Zorba scripting.</span></p><p class="c4 c1"><span></span></p><p class="c14 c1"><span>The complete JSONiq specification is available on </span><span class="c21"><a class="c20" href="http://jsoniq.org/";>http://jsoniq.org/</a></span></p><p class="c4 c1"><span></span></p></body></html>
\ No newline at end of file

=== added file 'doc/zorba/XQueryforJSON.dox'
--- doc/zorba/XQueryforJSON.dox	1970-01-01 00:00:00 +0000
+++ doc/zorba/XQueryforJSON.dox	2013-09-17 13:34:04 +0000
@@ -0,0 +1,4 @@
+/** \page XQuery_for_JSON JSONiq for JSON users tutorial
+
+\htmlinclude XQueryforJSON.html
+*/

=== modified file 'doc/zorba/XQueryforJSON.html'
--- doc/zorba/XQueryforJSON.html	2013-02-07 17:24:36 +0000
+++ doc/zorba/XQueryforJSON.html	2013-09-17 13:34:04 +0000
@@ -1,1 +1,1 @@
-<html><head><title>XQuery for JSON</title><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=lhDjYqiy3mZ0x6ROQEUoUw');ol{margin:0;padding:0}.c1{height:11pt;text-align:right;direction:ltr}.c3{color:#1155cc;text-decoration:underline;font-weight:bold}.c15{list-style-type:disc;margin:0;padding:0}.c16{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c7{color:#ff0000;font-style:italic}.c19{text-indent:-13.5pt;margin-left:76.5pt}.c2{direction:ltr;margin-left:144pt}.c13{color:inherit;text-decoration:inherit}.c14{padding-left:0pt;margin-left:36pt}.c20{color:#1155cc;text-decoration:underline}.c17{color:#4a86e8}.c6{text-align:center}.c0{font-family:"Consolas"}.c10{font-style:italic}.c4{direction:ltr}.c9{text-align:justify}.c11{text-align:right}.c5{color:#38761d}.c18{color:#ff9900}.c12{font-weight:bold}.c8{height:11pt}.title{padding-top:24pt;line-height:1.15;text-align:center;color:#4a86e8;font-size:36pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}.subtitle{padding-top:18pt;line-height:1.15;text-align:left;color:#666666;font-style:italic;font-size:24pt;font-family:"Georgia";padding-bottom:4pt}li{color:#000000;font-size:11pt;font-family:"Arial"}p{color:#000000;font-size:11pt;margin:0;font-family:"Arial"}h1{padding-top:24pt;line-height:1.15;text-align:left;color:#4a86e8;font-size:24pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;line-height:1.15;text-align:left;color:#ff9900;font-size:18pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;line-height:1.15;text-align:left;color:#000000;font-size:14pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;line-height:1.15;text-align:left;color:#000000;font-size:12pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;line-height:1.15;text-align:left;color:#000000;font-size:11pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;line-height:1.15;text-align:left;color:#000000;font-size:10pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}</style></head><body class="c16"><p class="c4 title"><a name="h.ngvhp3svo6iy"></a><span>JSONiq for JSON users</span></p><hr><p class="c6 c4"><span>This tutorial introduces the JSONiq language, which declaratively manipulates JSON data.</span></p><p class="c6 c4"><span>Why don&#39;t you go ahead can try the queries of this document on our online demo interface?</span></p><p class="c4 c6"><span>&nbsp;</span><span class="c3"><a class="c13" href="http://www.zorba-xquery.com/html/jsoniq";>http://www.zorba-xquery.com/html/jsoniq</a></span></p><hr><p class="c4 c8"><span></span></p><h1 class="c4"><a name="h.f453h84m2u1a"></a><span>JSON</span></h1><p class="c4 c9"><span>As explained on the official Web site </span><span class="c20"><a class="c13" href="http://www.json.org/";>http://www.json.org/</a></span><span>, JSON is a lightweight data-interchange format designed for humans as well as for computers. It supports as values:</span></p><ol class="c15" start="1"><li class="c14 c4 c9"><span>objects (string-to-value maps)</span></li><li class="c4 c9 c14"><span>arrays (ordered sequences of values)</span></li><li class="c14 c4 c9"><span>strings</span></li><li class="c14 c4 c9"><span>numbers</span></li><li class="c14 c4 c9"><span>booleans (true, false)</span></li><li class="c14 c4 c9"><span>null</span></li></ol><p class="c4 c8"><span></span></p><p class="c4"><span>JSONiq provides declarative querying and updating capabilities on JSON data.</span></p><h1 class="c4"><a name="h.qtfakecy3fr7"></a><span>Elevator Pitch</span></h1><p class="c4 c9"><span>JSONiq is based on XQuery, which is a W3C standard (like XML and HTML). XQuery is a very powerful declarative language that originally manipulates XML data, but it turns out that it is also a very good fit for manipulating JSON natively.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>JSONiq, since it extends XQuery, is a very powerful general-purpose declarative programming language. Our experience is that, for the same task, you will probably write about 80% less code compared to imperative languages like JavaScript, Python or Ruby. Additionally, you get the benefits of strong type checking without actually having to write type declarations.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>Here is an appetizer before we start the tutorial from scratch.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $stores :=</span></p><p class="c4"><span class="c0">[</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $sales := [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $join :=</span></p><p class="c4"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c4"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c4"><span class="c0">&nbsp; return {</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c4"><span class="c0">&nbsp; }</span></p><p class="c4"><span class="c0">return [$join]</span></p><p class="c2"><span class="c0 c5">[ </span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c2"><span class="c0 c5">&nbsp;]</span></p><p class="c4 c8"><span></span></p><h1 class="c4"><a name="h.yugk1mszt0re"></a><span>And here you go</span></h1><h2 class="c4"><a name="h.4uvhbej4btrt"></a><span>Actually</span><span>, you already knew some JSONiq</span></h2><p class="c4 c9"><span>The first thing you need to know is that, as a rule of thumb, a well-formed JSON document is a JSONiq expression as well.</span></p><p class="c4 c8"><span></span></p><p class="c4 c9"><span>This means that, most of the time, you can copy-and-paste a JSON document into a query. The following are JSONiq queries that are &quot;idempotent&quot; (they just output themselves):</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span class="c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c11"><span class="c0 c5">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{</span></p><p class="c4"><span class="c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot;] },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; { &quot;unary&quot; : [&quot;not&quot;] }</span></p><p class="c4"><span class="c0">&nbsp; ],</span></p><p class="c4"><span class="c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; 0, 1</span></p><p class="c4"><span class="c0">&nbsp; ]</span></p><p class="c4"><span class="c0">}</span></p><p class="c2"><span class="c0 c5">{</span></p><p class="c2"><span class="c0 c5">&nbsp; &quot;operations&quot; : [</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot; ] },</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; { &quot;unary&quot; : [ &quot;not&quot; ] }</span></p><p class="c2"><span class="c0 c5">&nbsp; ],</span></p><p class="c2"><span class="c0 c5">&nbsp; &quot;bits&quot; : [</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; 0, 1</span></p><p class="c2"><span class="c0 c5">&nbsp; ]</span></p><p class="c2"><span class="c0 c5">}</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">[ { &quot;Question&quot; : &quot;Ultimate&quot; }, [&quot;Life&quot;, &quot;the universe&quot;, &quot;and everything&quot;] ]</span></p><p class="c1"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">[ { &quot;Question&quot; : &quot;Ultimate&quot; }, [ &quot;Life&quot;, &quot;the universe&quot;, &quot;and everything&quot; ] ]</span></p><p class="c1"><span class="c0"></span></p><p class="c4"><span>This works with objects, arrays (even nested), strings, numbers, booleans, null. </span><span class="c10">The exceptions to this rule (but we are working on it!) are that:</span></p><p class="c4 c9"><span class="c10">(i) empty objects are not recognized and must be written {| |}.</span></p><p class="c4 c9"><span class="c10">(ii) characters escaped with the \ in JSON strings are not recognized (XQuery uses another means of escaping characters).</span></p><p class="c4 c8"><span class="c0 c7"></span></p><p class="c4 c9"><span>It also works the other way round: if your query outputs an object or an array, you can use it as a JSON document.</span></p><p class="c4 c8"><span></span></p><p class="c4 c9"><span>JSONiq is a declarative language. This means that you only need to say </span><span class="c10">what</span><span>&nbsp;you want - the compiler will take care of the </span><span class="c10">how</span><span>. In the above queries, you are basically saying: I want to output this JSON content, and here it is.</span></p><h1 class="c4"><a name="h.1gal1zhyffu4"></a><span>JSONiq basics</span></h1><h2 class="c4"><a name="h.ncbxtez2z3rn"></a><span>The real JSONiq Hello, World!</span></h2><p class="c4"><span>Wondering what a hello world program looks like in JSONiq? Here it is:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">&quot;Hello, World!&quot;</span></p><p class="c4 c11"><span class="c0 c5">Hello, World!</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span>Not surprisingly, it outputs the string &quot;Hello, World!&quot;.</span></p><h2 class="c4"><a name="h.ifcjheuaxoqc"></a><span>Numbers and arithmetic operations</span></h2><p class="c4 c9"><span>Okay, so, now, you might be thinking: &quot;What is the use of this language if it just outputs what I put in?&quot; Of course, JSONiq can more than that. And still in a declarative way. Here is how it works with numbers:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">2 + 2</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>will output:</span></p><p class="c4 c11"><span class="c0 c5">4</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>whereas</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">(38 + 2) div 2 + 11 * 2</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>will output</span></p><p class="c4 c11"><span class="c0 c5">42</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4 c9"><span>(mind the division operator which is the &quot;div&quot; keyword. The slash operator has different semantics).</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Like JSON, JSONiq works with decimals and doubles:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">6.022e23 * 42</span></p><p class="c4 c11"><span class="c0 c5">2.52924E25</span></p><h2 class="c4"><a name="h.jmbc6c1fqqwx"></a><span>Logical operations</span></h2><p class="c4 c9"><span>JSONiq supports boolean operations.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4"><span class="c0">true and false</span></p><p class="c4 c11"><span class="c0 c5">false</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">(true or false) and (false or true)</span></p><p class="c4 c11"><span class="c0 c5">true</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>The unary not is a function (yes, JSONiq has functions):</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">not(true)</span></p><p class="c4 c11"><span class="c0 c5">false</span></p><h2 class="c4"><a name="h.iq1ixg5ywx0r"></a><span>Strings</span></h2><p class="c4"><span>JSONiq is capable of manipulating strings as well, using functions:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">concat(&quot;Hello &quot;, &quot;Captain &quot;, &quot;Kirk&quot;)</span></p><p class="c4 c11"><span class="c0 c5">Hello Captain Kirk</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">substring(&quot;Mister Spock&quot;, 8, 5)</span></p><p class="c4 c11"><span class="c0 c5">Spock</span></p><p class="c1"><span class="c5"></span></p><p class="c4 c9"><span>JSONiq comes up with a rich string function library out of the box, inherited from its base language. These functions are listed </span><span class="c20"><a class="c13" href="http://www.w3.org/TR/xpath-functions-30/#string-functions";>here</a></span><span>&nbsp;(actually, you will find many more for numbers, etc.)</span></p><h2 class="c4"><a name="h.rv6w8p4wenfa"></a><span>Sequences</span></h2><p class="c4"><span>Until now, we have only been working with single values (an object, an array, a number, a string, a boolean). JSONiq supports sequences of values. You can build a sequence using commas:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)</span></p><p class="c4 c11"><span class="c5">1 2 3 4 5 6 7 8 9 10</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span class="c0">1, </span><span class="c0">true</span><span class="c0">, 4.2e1, &quot;Life&quot;</span></p><p class="c4 c11"><span class="c0 c5">1 true 42 Life</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>The &quot;to&quot; operator is very convenient, too:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">(1 to 100)</span></p><p class="c4 c11"><span class="c5">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20</span></p><p class="c4 c11"><span class="c5">21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40</span></p><p class="c4 c11"><span class="c5">41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60</span></p><p class="c4 c11"><span class="c5">61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80</span></p><p class="c4 c11"><span class="c5">81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Some functions even work on sequences:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">sum(1 to 100)</span></p><p class="c4 c11"><span class="c0 c5">5050</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">string-join((&quot;These&quot;, &quot;are&quot;, &quot;some&quot;, &quot;words&quot;), &quot;-&quot;)</span></p><p class="c4 c11"><span class="c0 c5">These-are-some-words</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">count(10 to 20)</span></p><p class="c4 c11"><span class="c0 c5">11</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span class="c0">avg(1 to 100)</span></p><p class="c4 c11"><span class="c0 c5">50.5</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span>Unlike arrays, sequences are flat. The sequence (3) is identical to the integer 3, and (1, (2, 3)) is identical to (1, 2, 3).</span></p><h1 class="c4"><a name="h.7x2r8sj1zjwe"></a><span>A bit more in depth</span></h1><h2 class="c4"><a name="h.b6c9zq9um8cu"></a><span>Variables</span></h2><p class="c4"><span>You can bind a sequence of values to a (dollar-prefixed) variable, like so:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $x := &quot;Bearing 3 1 4 Mark 5. &quot;</span></p><p class="c4"><span class="c0">return concat($x, &quot;Engage!&quot;)</span></p><p class="c4 c11"><span class="c0 c5">Bearing 3 1 4 Mark 5. Engage!</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c1"><span class="c0"></span></p><p class="c4"><span class="c0">let $x := (&quot;Kirk&quot;, &quot;Picard&quot;, &quot;Sisko&quot;)</span></p><p class="c4"><span class="c0">return string-join($x, &quot; and &quot;)</span></p><p class="c4 c11"><span class="c0 c5">Kirk and Picard and Sisko</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span>You can bind as many variables as you want:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $x := 1</span></p><p class="c4"><span class="c0">let $y := $x * 2</span></p><p class="c4"><span class="c0">let $z := $y + $x</span></p><p class="c4"><span class="c0">return ($x, $y, $z)</span></p><p class="c4 c11"><span class="c0 c5">1 2 3</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and even reuse the same name to hide formerly declared variables:</span></p><p class="c4"><span class="c0">let $x := 1</span></p><p class="c4"><span class="c0">let $x := $x + 2</span></p><p class="c4"><span class="c0">let $x := $x + 3</span></p><p class="c4"><span class="c0">return $x</span></p><p class="c4 c11"><span class="c0 c5">6</span></p><h2 class="c4"><a name="h.92ak2udyfghp"></a><span>Iteration</span></h2><p class="c4 c9"><span>In a way very similar to let, you can iterate over a sequence of values with the &quot;for&quot; keyword. Instead of binding the entire sequence of the variable, it will bind each value of the sequence in turn to this variable.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span class="c0">for $i in 1 to 10</span></p><p class="c4 c9"><span class="c0">return $i * 2</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8 10 12 14 16 18 20</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>More interestingly, you can combine fors and lets like so:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $sequence := 1 to 10</span></p><p class="c4"><span class="c0">for $value in $sequence</span></p><p class="c4"><span class="c0">let $square := $value * 2</span></p><p class="c4"><span class="c0">return $square</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8 10 12 14 16 18 20</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and even filter out some values:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $sequence := 1 to 10</span></p><p class="c4"><span class="c0">for $value in $sequence</span></p><p class="c4"><span class="c0">let $square := $value * 2</span></p><p class="c4"><span class="c0">where $square &lt; 10</span></p><p class="c4"><span class="c0">return $square</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8</span></p><h2 class="c4"><a name="h.5fcoouj7073u"></a><span>Note that you can only iterate over sequences, not arrays. To iterate over an array, you can obtain the sequence of its values with jn:members([1, 2, 3]).</span></h2><h2 class="c4"><a name="h.zdhx60a5duyu"></a><span>Conditions</span></h2><p class="c4"><span>You can make the output depend on a condition with an if-then-else construct:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">for $x in 1 to 10</span></p><p class="c4"><span class="c0">return if ($x &lt; 5) then $x</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else -$x</span></p><p class="c4 c11"><span class="c0 c5">1 2 3 4 -5 -6 -7 -8 -9 -10</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Note that the else clause is required - however, it can be the empty sequence () which is often when you need if only the then clause is relevant to you.</span></p><h2 class="c4"><a name="h.ccs6lkxiixw4"></a><span>Composability of Expressions</span></h2><p class="c4"><span>Now that you know of a couple of elementary JSONiq expressions, you can combine them in more elaborate expressions. For example, you can put any sequence of values in an array:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">[ 1 to 10 ]</span></p><p class="c4 c11"><span class="c0 c5">[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>Or you can dynamically compute the value of object pairs (or their key):</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">{</span></p><p class="c4"><span class="c0">&nbsp; &quot;Greeting&quot; : (let $d := &quot;Mister Spock&quot;</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return concat(&quot;Hello, &quot;, $d)),</span></p><p class="c4"><span class="c0">&nbsp; &quot;Farewell&quot; : string-join((&quot;Live&quot;, &quot;long&quot;, &quot;and&quot;, &quot;prosper&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot; &quot;)</span></p><p class="c4"><span class="c0">}</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;Greeting&quot; : &quot;Hello, Mister Spock&quot;, &quot;Farewell&quot; : &quot;Live long and prosper&quot; }</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span>You can dynamically generate object singletons (with a single pair):</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{ concat(&quot;Integer &quot;, 2) : 2 * 2 }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;Integer 2&quot; : 4 }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and then merge lots of them into a new object with the {| |} notation:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{|</span></p><p class="c4"><span class="c0">&nbsp; for $i in 1 to 10</span></p><p class="c4"><span class="c0">&nbsp; return { concat(&quot;Square of &quot;, $i) : $i * $i }</span></p><p class="c4"><span class="c0">|}</span></p><p class="c2"><span class="c0 c5">{</span></p><p class="c2"><span class="c0 c5">&quot;Square of 1&quot; : 1,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 2&quot; : 4,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 3&quot; : 9,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 4&quot; : 16,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 5&quot; : 25,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 6&quot; : 36,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 7&quot; : 49,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 8&quot; : 64,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 9&quot; : 81,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 10&quot; : 100</span></p><p class="c2"><span class="c0 c5">}</span></p><h1 class="c4"><a name="h.mjv7kyjurri2"></a><span>JSON Navigation</span></h1><p class="c4 c9"><span>Up to now, you have learnt how to compose expressions so as to do some computations and to build objects and arrays. It also works the other way round: if you have some JSON data, you can access it and navigate.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>All you need to know is: JSONiq views</span></p><ol class="c15" start="1"><li class="c14 c4 c9"><span>an array as an ordered list of values,</span></li><li class="c14 c4 c9"><span>an object as a set of name/value pairs</span></li></ol><h2 class="c4 c9"><a name="h.xosiyb17dh24"></a><span>Objects</span></h2><p class="c4 c9"><span>You can use an object as if it were a function and pass the call an argument of type xs:string. It will return the value associated thereto:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;first name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return $person(&quot;first name&quot;)</span></p><p class="c4 c11"><span class="c0 c5">&quot;Sarah&quot;</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>You can also ask for all keys in an object:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return { &quot;keys&quot; : [ jn:keys($person)] }</span></p><p class="c1 c19"><span class="c0 c5"></span></p><p class="c4 c11 c19"><span class="c0 c5">{ &quot;keys&quot; : [ &quot;name&quot;, &quot;age&quot;, &quot;gender&quot;, &quot;friends&quot; ] }</span></p><h2 class="c4"><a name="h.mrf42gizl3y6"></a><span>Arrays</span></h2><p class="c4 c9"><span>You can use an array as if it were a function and pass the call an argument of type xs:integer. It will return the entry at that position:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $friends := [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">return $friends(2)</span></p><p class="c4 c11"><span class="c0 c5">Mary</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>It is also possible to get the size of an array:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return { &quot;how many friends&quot; : jn:size($person(&quot;friends&quot;)) }</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;how many friends&quot; : 3 }</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>For convenience, there is a function that returns all elements in an array, as a sequence:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return jn:members($person(&quot;friends&quot;))</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">Jim Mary Jennifer</span></p><p class="c1"><span class="c5"></span></p><h1 class="c4"><a name="h.eb0bxle2oykl"></a><span>Relational Algebra</span></h1><p class="c4 c9"><span>Do you r</span><span>emember SQL&#39;s SELECT FROM WHERE statements? JSONiq inherits selection, projection and join capability from XQuery, too.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $stores :=</span></p><p class="c4"><span class="c0">[</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $sales := [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $join :=</span></p><p class="c4"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c4"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c4"><span class="c0">&nbsp; return {</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c4"><span class="c0">&nbsp; }</span></p><p class="c4"><span class="c0">return [$join]</span></p><p class="c2"><span class="c0 c5">[ </span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c2"><span class="c0 c5">&nbsp;]</span></p><h1 class="c4"><a name="h.oii6pvliilhi"></a><span>Access external data</span></h1><p class="c4"><span>Our implementation supports collections of (and indices on) JSON objects or arrays:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">dml:collection(&quot;my:data&quot;)</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;Your&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;Collection&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;of&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;JSON&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;objects&quot; }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>It is also possible to get JSON content with an HTTP request, or by parsing it from a string. The EXPath http-client module (described in the Zorba documentation) &nbsp;allows you to make HTTP requests, and the jn:parse-json() function allows you to use the body as an object or an array.</span></p><h1 class="c4"><a name="h.bm3buqmzhtko"></a><span>I want more</span></h1><p class="c4 c9"><span>JSONiq supports JSON updates. You can declaratively update your JSON data. JSONiq provides updating expressions. The list of updates that is eventually output by your program is then applied to your JSON data.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">copy $people := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;John&quot; : { &quot;status&quot; : &quot;single&quot; },</span></p><p class="c4"><span class="c0">&nbsp; &quot;Mary&quot; : { &quot;status&quot; : &quot;single&quot; } }</span></p><p class="c4"><span class="c0">modify (replace json value of $people(&quot;John&quot;)(&quot;status&quot;) with &quot;married&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; replace json value of $people(&quot;Mary&quot;)(&quot;status&quot;) with &quot;married&quot;)</span></p><p class="c4"><span class="c0">return $people</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;John&quot; : { &quot;status&quot; : &quot;married&quot; }, &quot;Mary&quot; : { &quot;status&quot; : &quot;married&quot; } }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4 c9"><span>Other updates are insertion into an object or an array, replacement of a value in an object or an array, deletion in an object or an array, renaming an object pair, appending to an array. This is documented on jsoniq.org.</span></p><h2 class="c4"><a name="h.5itcphr8262b"></a><span>Even more</span></h2><p class="c4"><span>JSONiq can do way more that what is presented here. Here are a couple of highlights:</span></p><p class="c4 c9"><span>- JSONiq is a strongly typed language, but is smart enough to not bother you with types when unnecessary. It potentially supports static typing as well to detect errors before you even execute your program.</span></p><p class="c4"><span>- You can define your own functions and modules.</span></p><p class="c4"><span>- JSONiq provides you with loads of available modules shipped with Zorba.</span></p><p class="c4 c9"><span>- JSONiq has tons of further features such as switch, typeswitch and try-catch expressions, universal/existential quantifiers, path expressions, filtering expressions, functors, mappings, grouping, windowing.</span></p><h2 class="c4"><a name="h.j7oh3cyhem38"></a><span>More is not enough</span></h2><p class="c4 c9"><span>- JSONiq supports XML. Yes: you can manipulate JSON and XML with the same language! JSONiq is actually a superset of XQuery, a W3C standard, and extends its data model to support JSON.</span></p><p class="c4 c9"><span>- JSONiq supports scripting. If you need to write a full-fledged, side-effecting Web application, scripting is for you.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>The complete JSONiq specification is available on </span><span class="c20"><a class="c13" href="http://jsoniq.org/";>http://jsoniq.org/</a></span></p></body></html>
\ No newline at end of file
+<html><head><title>XQuery for JSON</title><style type="text/css">@import url('https://themes.googleusercontent.com/fonts/css?kit=lhDjYqiy3mZ0x6ROQEUoUw');ol{margin:0;padding:0}.c1{height:11pt;text-align:right;direction:ltr}.c3{color:#1155cc;text-decoration:underline;font-weight:bold}.c15{list-style-type:disc;margin:0;padding:0}.c16{max-width:468pt;background-color:#ffffff;padding:72pt 72pt 72pt 72pt}.c7{color:#ff0000;font-style:italic}.c19{text-indent:-13.5pt;margin-left:76.5pt}.c2{direction:ltr;margin-left:144pt}.c13{color:inherit;text-decoration:inherit}.c14{padding-left:0pt;margin-left:36pt}.c20{color:#1155cc;text-decoration:underline}.c17{color:#4a86e8}.c6{text-align:center}.c0{font-family:"Consolas"}.c10{font-style:italic}.c4{direction:ltr}.c9{text-align:justify}.c11{text-align:right}.c5{color:#38761d}.c18{color:#ff9900}.c12{font-weight:bold}.c8{height:11pt}.title{padding-top:24pt;line-height:1.15;text-align:center;color:#4a86e8;font-size:36pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}.subtitle{padding-top:18pt;line-height:1.15;text-align:left;color:#666666;font-style:italic;font-size:24pt;font-family:"Georgia";padding-bottom:4pt}li{color:#000000;font-size:11pt;font-family:"Arial"}p{color:#000000;font-size:11pt;margin:0;font-family:"Arial"}h1{padding-top:24pt;line-height:1.15;text-align:left;color:#4a86e8;font-size:24pt;font-family:"Arial";font-weight:bold;padding-bottom:6pt}h2{padding-top:18pt;line-height:1.15;text-align:left;color:#ff9900;font-size:18pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h3{padding-top:14pt;line-height:1.15;text-align:left;color:#000000;font-size:14pt;font-family:"Arial";font-weight:bold;padding-bottom:4pt}h4{padding-top:12pt;line-height:1.15;text-align:left;color:#000000;font-size:12pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h5{padding-top:11pt;line-height:1.15;text-align:left;color:#000000;font-size:11pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}h6{padding-top:10pt;line-height:1.15;text-align:left;color:#000000;font-size:10pt;font-family:"Arial";font-weight:bold;padding-bottom:2pt}</style></head><body class="c16"><p class="c4 title"><a name="h.ngvhp3svo6iy"></a><span>JSONiq for JSON users</span></p><p class="c6 c4"><span>This tutorial introduces the JSONiq language, which declaratively manipulates JSON data.</span></p><p class="c6 c4"><span>Why don&#39;t you go ahead can try the queries of this document on our online demo interface?</span></p><p class="c4 c6"><span>&nbsp;</span><span class="c3"><a class="c13" href="http://zorbawebsite2.my28msec.com/html/demo";>http://zorbawebsite2.my28msec.com/html/demo</a></span></p><p class="c4 c8"><span></span></p><h1 class="c4"><a name="h.f453h84m2u1a"></a><span>JSON</span></h1><p class="c4 c9"><span>As explained on the official Web site </span><span class="c20"><a class="c13" href="http://www.json.org/";>http://www.json.org/</a></span><span>, JSON is a lightweight data-interchange format designed for humans as well as for computers. It supports as values:</span></p><ol class="c15" start="1"><li class="c14 c4 c9"><span>objects (string-to-value maps)</span></li><li class="c4 c9 c14"><span>arrays (ordered sequences of values)</span></li><li class="c14 c4 c9"><span>strings</span></li><li class="c14 c4 c9"><span>numbers</span></li><li class="c14 c4 c9"><span>booleans (true, false)</span></li><li class="c14 c4 c9"><span>null</span></li></ol><p class="c4 c8"><span></span></p><p class="c4"><span>JSONiq provides declarative querying and updating capabilities on JSON data.</span></p><h1 class="c4"><a name="h.qtfakecy3fr7"></a><span>Elevator Pitch</span></h1><p class="c4 c9"><span>JSONiq is based on XQuery, which is a W3C standard (like XML and HTML). XQuery is a very powerful declarative language that originally manipulates XML data, but it turns out that it is also a very good fit for manipulating JSON natively.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>JSONiq, since it extends XQuery, is a very powerful general-purpose declarative programming language. Our experience is that, for the same task, you will probably write about 80% less code compared to imperative languages like JavaScript, Python or Ruby. Additionally, you get the benefits of strong type checking without actually having to write type declarations.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>Here is an appetizer before we start the tutorial from scratch.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $stores :=</span></p><p class="c4"><span class="c0">[</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $sales := [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $join :=</span></p><p class="c4"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c4"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c4"><span class="c0">&nbsp; return {</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c4"><span class="c0">&nbsp; }</span></p><p class="c4"><span class="c0">return [$join]</span></p><p class="c2"><span class="c0 c5">[ </span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">&nbsp; { &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c2"><span class="c0 c5">&nbsp;]</span></p><p class="c4 c8"><span></span></p><h1 class="c4"><a name="h.yugk1mszt0re"></a><span>And here you go</span></h1><h2 class="c4"><a name="h.4uvhbej4btrt"></a><span>Actually</span><span>, you already knew some JSONiq</span></h2><p class="c4 c9"><span>The first thing you need to know is that, as a rule of thumb, a well-formed JSON document is a JSONiq expression as well.</span></p><p class="c4 c8"><span></span></p><p class="c4 c9"><span>This means that, most of the time, you can copy-and-paste a JSON document into a query. The following are JSONiq queries that are &quot;idempotent&quot; (they just output themselves):</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;pi&quot; : 3.14, &quot;sq2&quot; : 1.4 }</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span class="c0">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c11"><span class="c0 c5">[ 2, 3, 5, 7, 11, 13 ]</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{</span></p><p class="c4"><span class="c0">&nbsp; &quot;operations&quot; : [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot;] },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; { &quot;unary&quot; : [&quot;not&quot;] }</span></p><p class="c4"><span class="c0">&nbsp; ],</span></p><p class="c4"><span class="c0">&nbsp; &quot;bits&quot; : [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; 0, 1</span></p><p class="c4"><span class="c0">&nbsp; ]</span></p><p class="c4"><span class="c0">}</span></p><p class="c2"><span class="c0 c5">{</span></p><p class="c2"><span class="c0 c5">&nbsp; &quot;operations&quot; : [</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; { &quot;binary&quot; : [ &quot;and&quot;, &quot;or&quot; ] },</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; { &quot;unary&quot; : [ &quot;not&quot; ] }</span></p><p class="c2"><span class="c0 c5">&nbsp; ],</span></p><p class="c2"><span class="c0 c5">&nbsp; &quot;bits&quot; : [</span></p><p class="c2"><span class="c0 c5">&nbsp; &nbsp; 0, 1</span></p><p class="c2"><span class="c0 c5">&nbsp; ]</span></p><p class="c2"><span class="c0 c5">}</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">[ { &quot;Question&quot; : &quot;Ultimate&quot; }, [&quot;Life&quot;, &quot;the universe&quot;, &quot;and everything&quot;] ]</span></p><p class="c1"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">[ { &quot;Question&quot; : &quot;Ultimate&quot; }, [ &quot;Life&quot;, &quot;the universe&quot;, &quot;and everything&quot; ] ]</span></p><p class="c1"><span class="c0"></span></p><p class="c4"><span>This works with objects, arrays (even nested), strings, numbers, booleans, null. </span><span class="c10">The exceptions to this rule (but we are working on it!) are that:</span></p><p class="c4 c9"><span class="c10">(i) empty objects are not recognized and must be written {| |}.</span></p><p class="c4 c9"><span class="c10">(ii) characters escaped with the \ in JSON strings are not recognized (XQuery uses another means of escaping characters).</span></p><p class="c4 c8"><span class="c0 c7"></span></p><p class="c4 c9"><span>It also works the other way round: if your query outputs an object or an array, you can use it as a JSON document.</span></p><p class="c4 c8"><span></span></p><p class="c4 c9"><span>JSONiq is a declarative language. This means that you only need to say </span><span class="c10">what</span><span>&nbsp;you want - the compiler will take care of the </span><span class="c10">how</span><span>. In the above queries, you are basically saying: I want to output this JSON content, and here it is.</span></p><h1 class="c4"><a name="h.1gal1zhyffu4"></a><span>JSONiq basics</span></h1><h2 class="c4"><a name="h.ncbxtez2z3rn"></a><span>The real JSONiq Hello, World!</span></h2><p class="c4"><span>Wondering what a hello world program looks like in JSONiq? Here it is:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">&quot;Hello, World!&quot;</span></p><p class="c4 c11"><span class="c0 c5">Hello, World!</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span>Not surprisingly, it outputs the string &quot;Hello, World!&quot;.</span></p><h2 class="c4"><a name="h.ifcjheuaxoqc"></a><span>Numbers and arithmetic operations</span></h2><p class="c4 c9"><span>Okay, so, now, you might be thinking: &quot;What is the use of this language if it just outputs what I put in?&quot; Of course, JSONiq can more than that. And still in a declarative way. Here is how it works with numbers:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">2 + 2</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>will output:</span></p><p class="c4 c11"><span class="c0 c5">4</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>whereas</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">(38 + 2) div 2 + 11 * 2</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>will output</span></p><p class="c4 c11"><span class="c0 c5">42</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4 c9"><span>(mind the division operator which is the &quot;div&quot; keyword. The slash operator has different semantics).</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Like JSON, JSONiq works with decimals and doubles:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">6.022e23 * 42</span></p><p class="c4 c11"><span class="c0 c5">2.52924E25</span></p><h2 class="c4"><a name="h.jmbc6c1fqqwx"></a><span>Logical operations</span></h2><p class="c4 c9"><span>JSONiq supports boolean operations.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4"><span class="c0">true and false</span></p><p class="c4 c11"><span class="c0 c5">false</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">(true or false) and (false or true)</span></p><p class="c4 c11"><span class="c0 c5">true</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>The unary not is a function (yes, JSONiq has functions):</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">not(true)</span></p><p class="c4 c11"><span class="c0 c5">false</span></p><h2 class="c4"><a name="h.iq1ixg5ywx0r"></a><span>Strings</span></h2><p class="c4"><span>JSONiq is capable of manipulating strings as well, using functions:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">concat(&quot;Hello &quot;, &quot;Captain &quot;, &quot;Kirk&quot;)</span></p><p class="c4 c11"><span class="c0 c5">Hello Captain Kirk</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">substring(&quot;Mister Spock&quot;, 8, 5)</span></p><p class="c4 c11"><span class="c0 c5">Spock</span></p><p class="c1"><span class="c5"></span></p><p class="c4 c9"><span>JSONiq comes up with a rich string function library out of the box, inherited from its base language. These functions are listed </span><span class="c20"><a class="c13" href="http://www.w3.org/TR/xpath-functions-30/#string-functions";>here</a></span><span>&nbsp;(actually, you will find many more for numbers, etc.)</span></p><h2 class="c4"><a name="h.rv6w8p4wenfa"></a><span>Sequences</span></h2><p class="c4"><span>Until now, we have only been working with single values (an object, an array, a number, a string, a boolean). JSONiq supports sequences of values. You can build a sequence using commas:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)</span></p><p class="c4 c11"><span class="c5">1 2 3 4 5 6 7 8 9 10</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span class="c0">1, </span><span class="c0">true</span><span class="c0">, 4.2e1, &quot;Life&quot;</span></p><p class="c4 c11"><span class="c0 c5">1 true 42 Life</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span>The &quot;to&quot; operator is very convenient, too:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">(1 to 100)</span></p><p class="c4 c11"><span class="c5">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20</span></p><p class="c4 c11"><span class="c5">21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40</span></p><p class="c4 c11"><span class="c5">41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60</span></p><p class="c4 c11"><span class="c5">61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80</span></p><p class="c4 c11"><span class="c5">81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Some functions even work on sequences:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">sum(1 to 100)</span></p><p class="c4 c11"><span class="c0 c5">5050</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">string-join((&quot;These&quot;, &quot;are&quot;, &quot;some&quot;, &quot;words&quot;), &quot;-&quot;)</span></p><p class="c4 c11"><span class="c0 c5">These-are-some-words</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span class="c0">count(10 to 20)</span></p><p class="c4 c11"><span class="c0 c5">11</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span class="c0">avg(1 to 100)</span></p><p class="c4 c11"><span class="c0 c5">50.5</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span>Unlike arrays, sequences are flat. The sequence (3) is identical to the integer 3, and (1, (2, 3)) is identical to (1, 2, 3).</span></p><h1 class="c4"><a name="h.7x2r8sj1zjwe"></a><span>A bit more in depth</span></h1><h2 class="c4"><a name="h.b6c9zq9um8cu"></a><span>Variables</span></h2><p class="c4"><span>You can bind a sequence of values to a (dollar-prefixed) variable, like so:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $x := &quot;Bearing 3 1 4 Mark 5. &quot;</span></p><p class="c4"><span class="c0">return concat($x, &quot;Engage!&quot;)</span></p><p class="c4 c11"><span class="c0 c5">Bearing 3 1 4 Mark 5. Engage!</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c1"><span class="c0"></span></p><p class="c4"><span class="c0">let $x := (&quot;Kirk&quot;, &quot;Picard&quot;, &quot;Sisko&quot;)</span></p><p class="c4"><span class="c0">return string-join($x, &quot; and &quot;)</span></p><p class="c4 c11"><span class="c0 c5">Kirk and Picard and Sisko</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4"><span>You can bind as many variables as you want:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $x := 1</span></p><p class="c4"><span class="c0">let $y := $x * 2</span></p><p class="c4"><span class="c0">let $z := $y + $x</span></p><p class="c4"><span class="c0">return ($x, $y, $z)</span></p><p class="c4 c11"><span class="c0 c5">1 2 3</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and even reuse the same name to hide formerly declared variables:</span></p><p class="c4"><span class="c0">let $x := 1</span></p><p class="c4"><span class="c0">let $x := $x + 2</span></p><p class="c4"><span class="c0">let $x := $x + 3</span></p><p class="c4"><span class="c0">return $x</span></p><p class="c4 c11"><span class="c0 c5">6</span></p><h2 class="c4"><a name="h.92ak2udyfghp"></a><span>Iteration</span></h2><p class="c4 c9"><span>In a way very similar to let, you can iterate over a sequence of values with the &quot;for&quot; keyword. Instead of binding the entire sequence of the variable, it will bind each value of the sequence in turn to this variable.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span class="c0">for $i in 1 to 10</span></p><p class="c4 c9"><span class="c0">return $i * 2</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8 10 12 14 16 18 20</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>More interestingly, you can combine fors and lets like so:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $sequence := 1 to 10</span></p><p class="c4"><span class="c0">for $value in $sequence</span></p><p class="c4"><span class="c0">let $square := $value * 2</span></p><p class="c4"><span class="c0">return $square</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8 10 12 14 16 18 20</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and even filter out some values:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $sequence := 1 to 10</span></p><p class="c4"><span class="c0">for $value in $sequence</span></p><p class="c4"><span class="c0">let $square := $value * 2</span></p><p class="c4"><span class="c0">where $square &lt; 10</span></p><p class="c4"><span class="c0">return $square</span></p><p class="c4 c11"><span class="c0 c5">2 4 6 8</span></p><h2 class="c4"><a name="h.5fcoouj7073u"></a><span>Note that you can only iterate over sequences, not arrays. To iterate over an array, you can obtain the sequence of its values with jn:members([1, 2, 3]).</span></h2><h2 class="c4"><a name="h.zdhx60a5duyu"></a><span>Conditions</span></h2><p class="c4"><span>You can make the output depend on a condition with an if-then-else construct:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">for $x in 1 to 10</span></p><p class="c4"><span class="c0">return if ($x &lt; 5) then $x</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;else -$x</span></p><p class="c4 c11"><span class="c0 c5">1 2 3 4 -5 -6 -7 -8 -9 -10</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>Note that the else clause is required - however, it can be the empty sequence () which is often when you need if only the then clause is relevant to you.</span></p><h2 class="c4"><a name="h.ccs6lkxiixw4"></a><span>Composability of Expressions</span></h2><p class="c4"><span>Now that you know of a couple of elementary JSONiq expressions, you can combine them in more elaborate expressions. For example, you can put any sequence of values in an array:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">[ 1 to 10 ]</span></p><p class="c4 c11"><span class="c0 c5">[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>Or you can dynamically compute the value of object pairs (or their key):</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">{</span></p><p class="c4"><span class="c0">&nbsp; &quot;Greeting&quot; : (let $d := &quot;Mister Spock&quot;</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return concat(&quot;Hello, &quot;, $d)),</span></p><p class="c4"><span class="c0">&nbsp; &quot;Farewell&quot; : string-join((&quot;Live&quot;, &quot;long&quot;, &quot;and&quot;, &quot;prosper&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&quot; &quot;)</span></p><p class="c4"><span class="c0">}</span></p><p class="c4 c8"><span class="c0 c5"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;Greeting&quot; : &quot;Hello, Mister Spock&quot;, &quot;Farewell&quot; : &quot;Live long and prosper&quot; }</span></p><p class="c4 c8"><span class="c5"></span></p><p class="c4"><span>You can dynamically generate object singletons (with a single pair):</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{ concat(&quot;Integer &quot;, 2) : 2 * 2 }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;Integer 2&quot; : 4 }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>and then merge lots of them into a new object with the {| |} notation:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">{|</span></p><p class="c4"><span class="c0">&nbsp; for $i in 1 to 10</span></p><p class="c4"><span class="c0">&nbsp; return { concat(&quot;Square of &quot;, $i) : $i * $i }</span></p><p class="c4"><span class="c0">|}</span></p><p class="c2"><span class="c0 c5">{</span></p><p class="c2"><span class="c0 c5">&quot;Square of 1&quot; : 1,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 2&quot; : 4,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 3&quot; : 9,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 4&quot; : 16,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 5&quot; : 25,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 6&quot; : 36,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 7&quot; : 49,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 8&quot; : 64,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 9&quot; : 81,</span></p><p class="c2"><span class="c0 c5">&quot;Square of 10&quot; : 100</span></p><p class="c2"><span class="c0 c5">}</span></p><h1 class="c4"><a name="h.mjv7kyjurri2"></a><span>JSON Navigation</span></h1><p class="c4 c9"><span>Up to now, you have learnt how to compose expressions so as to do some computations and to build objects and arrays. It also works the other way round: if you have some JSON data, you can access it and navigate.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>All you need to know is: JSONiq views</span></p><ol class="c15" start="1"><li class="c14 c4 c9"><span>an array as an ordered list of values,</span></li><li class="c14 c4 c9"><span>an object as a set of name/value pairs</span></li></ol><h2 class="c4 c9"><a name="h.xosiyb17dh24"></a><span>Objects</span></h2><p class="c4 c9"><span>You can use an object as if it were a function and pass the call an argument of type xs:string. It will return the value associated thereto:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;first name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return $person(&quot;first name&quot;)</span></p><p class="c4 c11"><span class="c0 c5">&quot;Sarah&quot;</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>You can also ask for all keys in an object:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return { &quot;keys&quot; : [ jn:keys($person)] }</span></p><p class="c1 c19"><span class="c0 c5"></span></p><p class="c4 c11 c19"><span class="c0 c5">{ &quot;keys&quot; : [ &quot;name&quot;, &quot;age&quot;, &quot;gender&quot;, &quot;friends&quot; ] }</span></p><h2 class="c4"><a name="h.mrf42gizl3y6"></a><span>Arrays</span></h2><p class="c4 c9"><span>You can use an array as if it were a function and pass the call an argument of type xs:integer. It will return the entry at that position:</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4"><span class="c0">let $friends := [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">return $friends(2)</span></p><p class="c4 c11"><span class="c0 c5">Mary</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>It is also possible to get the size of an array:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return { &quot;how many friends&quot; : jn:size($person(&quot;friends&quot;)) }</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;how many friends&quot; : 3 }</span></p><p class="c4 c8"><span></span></p><p class="c4"><span>For convenience, there is a function that returns all elements in an array, as a sequence:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $person := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;name&quot; : &quot;Sarah&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;age&quot; : 13,</span></p><p class="c4"><span class="c0">&nbsp; &quot;gender&quot; : &quot;female&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &quot;friends&quot; : [ &quot;Jim&quot;, &quot;Mary&quot;, &quot;Jennifer&quot;]</span></p><p class="c4"><span class="c0">}</span></p><p class="c4"><span class="c0">return jn:members($person(&quot;friends&quot;))</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">Jim Mary Jennifer</span></p><p class="c1"><span class="c5"></span></p><h1 class="c4"><a name="h.eb0bxle2oykl"></a><span>Relational Algebra</span></h1><p class="c4 c9"><span>Do you r</span><span>emember SQL&#39;s SELECT FROM WHERE statements? JSONiq inherits selection, projection and join capability from XQuery, too.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">let $stores :=</span></p><p class="c4"><span class="c0">[</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 1, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 2, &quot;state&quot; : &quot;MA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 3, &quot;state&quot; : &quot;CA&quot; },</span></p><p class="c4"><span class="c0">&nbsp; { &quot;store number&quot; : 4, &quot;state&quot; : &quot;CA&quot; }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $sales := [</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;broiler&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 20 &nbsp;},</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;toaster&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 50 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 100 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;blender&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 150 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 1, &quot;quantity&quot; : 500 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;socks&quot;, &quot;store number&quot; : 2, &quot;quantity&quot; : 10 },</span></p><p class="c4"><span class="c0">&nbsp; &nbsp;{ &quot;product&quot; : &quot;shirt&quot;, &quot;store number&quot; : 3, &quot;quantity&quot; : 10 }</span></p><p class="c4"><span class="c0">]</span></p><p class="c4"><span class="c0">let $join :=</span></p><p class="c4"><span class="c0">&nbsp; for $store in jn:members($stores), $sale in jn:members($sales)</span></p><p class="c4"><span class="c0">&nbsp; where $store(&quot;store number&quot;) = $sale(&quot;store number&quot;)</span></p><p class="c4"><span class="c0">&nbsp; return {</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;nb&quot; : $store(&quot;store number&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;state&quot; : $store(&quot;state&quot;),</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &quot;sold&quot; : $sale(&quot;product&quot;)</span></p><p class="c4"><span class="c0">&nbsp; }</span></p><p class="c4"><span class="c0">return [$join]</span></p><p class="c2"><span class="c0 c5">[ </span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;broiler&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 1, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 2, &quot;state&quot; : &quot;MA&quot;, &quot;sold&quot; : &quot;socks&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;toaster&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;blender&quot; },</span></p><p class="c2"><span class="c0 c5">{ &quot;nb&quot; : 3, &quot;state&quot; : &quot;CA&quot;, &quot;sold&quot; : &quot;shirt&quot; }</span></p><p class="c2"><span class="c0 c5">&nbsp;]</span></p><h1 class="c4"><a name="h.oii6pvliilhi"></a><span>Access external data</span></h1><p class="c4"><span>Our implementation supports collections of (and indices on) JSON objects or arrays:</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">dml:collection(&quot;my:data&quot;)</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;Your&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;Collection&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;of&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;JSON&quot; }</span></p><p class="c4 c11"><span class="c0 c5">{ &quot;foo&quot; : &quot;objects&quot; }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4"><span>It is also possible to get JSON content with an HTTP request, or by parsing it from a string. The EXPath http-client module (described in the Zorba documentation) &nbsp;allows you to make HTTP requests, and the jn:parse-json() function allows you to use the body as an object or an array.</span></p><h1 class="c4"><a name="h.bm3buqmzhtko"></a><span>I want more</span></h1><p class="c4 c9"><span>JSONiq supports JSON updates. You can declaratively update your JSON data. JSONiq provides updating expressions. The list of updates that is eventually output by your program is then applied to your JSON data.</span></p><p class="c4 c8"><span></span></p><p class="c4"><span class="c0">copy $people := {</span></p><p class="c4"><span class="c0">&nbsp; &quot;John&quot; : { &quot;status&quot; : &quot;single&quot; },</span></p><p class="c4"><span class="c0">&nbsp; &quot;Mary&quot; : { &quot;status&quot; : &quot;single&quot; } }</span></p><p class="c4"><span class="c0">modify (replace json value of $people(&quot;John&quot;)(&quot;status&quot;) with &quot;married&quot;,</span></p><p class="c4"><span class="c0">&nbsp; &nbsp; &nbsp; &nbsp; replace json value of $people(&quot;Mary&quot;)(&quot;status&quot;) with &quot;married&quot;)</span></p><p class="c4"><span class="c0">return $people</span></p><p class="c4 c8"><span class="c0"></span></p><p class="c4 c11"><span class="c0 c5">{ &quot;John&quot; : { &quot;status&quot; : &quot;married&quot; }, &quot;Mary&quot; : { &quot;status&quot; : &quot;married&quot; } }</span></p><p class="c1"><span class="c0 c5"></span></p><p class="c4 c9"><span>Other updates are insertion into an object or an array, replacement of a value in an object or an array, deletion in an object or an array, renaming an object pair, appending to an array. This is documented on jsoniq.org.</span></p><h2 class="c4"><a name="h.5itcphr8262b"></a><span>Even more</span></h2><p class="c4"><span>JSONiq can do way more that what is presented here. Here are a couple of highlights:</span></p><p class="c4 c9"><span>- JSONiq is a strongly typed language, but is smart enough to not bother you with types when unnecessary. It potentially supports static typing as well to detect errors before you even execute your program.</span></p><p class="c4"><span>- You can define your own functions and modules.</span></p><p class="c4"><span>- JSONiq provides you with loads of available modules shipped with Zorba.</span></p><p class="c4 c9"><span>- JSONiq has tons of further features such as switch, typeswitch and try-catch expressions, universal/existential quantifiers, path expressions, filtering expressions, functors, mappings, grouping, windowing.</span></p><h2 class="c4"><a name="h.j7oh3cyhem38"></a><span>More is not enough</span></h2><p class="c4 c9"><span>- JSONiq supports XML. Yes: you can manipulate JSON and XML with the same language! JSONiq is actually a superset of XQuery, a W3C standard, and extends its data model to support JSON.</span></p><p class="c4 c9"><span>- JSONiq supports scripting. If you need to write a full-fledged, side-effecting Web application, scripting is for you.</span></p><p class="c4 c9 c8"><span></span></p><p class="c4 c9"><span>The complete JSONiq specification is available on </span><span class="c20"><a class="c13" href="http://jsoniq.org/";>http://jsoniq.org/</a></span></p></body></html>

=== modified file 'doc/zorba/build_and_install.dox'
--- doc/zorba/build_and_install.dox	2013-02-07 17:24:36 +0000
+++ doc/zorba/build_and_install.dox	2013-09-17 13:34:04 +0000
@@ -5,22 +5,22 @@
 Once you have successfully configured your Zorba build (as described
 in \ref configure_zorba), you should now be able to build the project.
 
-- For Makefile-based builds, just type \c make (or <tt>make j2</tt> to
+- For Makefile-based builds, just type \c make (or \code make j2 \endcode to
 do a parallel build on a multi-core machine) from inside the \c
 {ZORBABUILD} directory.
 
 - For IDE-based builds, open the project created in the previous step
- and build the \c ALL target.
+ and build the <b>ALL</b> target.
 
 The build will take some time.  If it finishes successfully, you're
 ready to install and run Zorba.
 
 \section install_zorba Installing Zorba
 
-- For Makefile-based builds, just type <tt>make install</tt>.  There
-is also a <tt>make uninstall</tt> target.
+- For Makefile-based builds, just type \code make install \endcode.  There
+is also a \code make uninstall \endcode target.
 
-- For IDE-based builds, invoke the \c INSTALL project.
+- For IDE-based builds, invoke the <b>INSTALL</b> project.
 
 In either case, Zorba will be installed into the location specified by
 the CMake configuration parameter \c CMAKE_INSTALL_PREFIX, as
@@ -28,7 +28,7 @@
 
 \section install_paths Setting the PATH
 
-In order for users on your system to use Zorba, the \c bin/ subdirectory
+In order for users on your system to use Zorba, the <b>bin/</b> subdirectory
 of your installation directory must be on their path.
 
 \section testing_install Testing your Zorba Installation
@@ -50,10 +50,8 @@
 
 \section build_help Help!
 
-If you have any problems building or running Zorba, contact the \c
-zorba-users mailing list. Sign up and see other instructions at
+If you have any problems building or running Zorba, contact the <b>zorba-users<b>
+mailing list. Sign up and see other instructions at
 https://groups.google.com/forum/?hl=en&fromgroups#!forum/zorba-users .
 
-
 */
-

=== modified file 'doc/zorba/build_configure.dox'
--- doc/zorba/build_configure.dox	2012-05-02 10:40:42 +0000
+++ doc/zorba/build_configure.dox	2013-09-17 13:34:04 +0000
@@ -10,10 +10,10 @@
 The instructions in this section are based on executing commands at
 the command line. It is also possible configure Zorba using CMake's
 GUI configuration utility if you prefer. On Linux distributions, this
-is often a separate package named \"\c cmake-gui\". On Windows, the
+is often a separate package named <b>"cmake-gui"</b>. On Windows, the
 GUI is installed by default and can be started via the Start menu.  On
-MacOS, it is available as the \"\c gui\" variant of the \c cmake
-package.
+MacOS, it is available as the <b>"gui"</b> variant of the
+<a href="http://www.cmake.org/";>CMake</a> package.
 
 \note
 The important configuration parameters - source and build directory;
@@ -61,7 +61,7 @@
 cmake -G "Visual Studio 10" {ZORBASRC} \endcode
 
 The list of available Generators for your CMake installation
-can be seen by typing \" <tt>cmake --help</tt> \".
+can be seen by typing \code cmake --help \endcode.
 
 \section configure_parameters Configuration Parameters (the -D arguments)
 

=== modified file 'doc/zorba/build_macos.dox'
--- doc/zorba/build_macos.dox	2012-05-02 10:40:42 +0000
+++ doc/zorba/build_macos.dox	2013-09-17 13:34:04 +0000
@@ -14,7 +14,7 @@
 CMake on Mac OS X uses the Makefile generator.
 Alternatively,
 you can specify different generators (e.g., Xcode)
-by starting CMake using the \c -G option (e.g., <tt>-G Xcode</tt>). 
+by starting CMake using the <b>-G</b> option (e.g., <b>-G Xcode</b>).
 
 \section macos_swig Swig Version
 

=== modified file 'doc/zorba/build_prepare.dox'
--- doc/zorba/build_prepare.dox	2013-06-19 19:51:53 +0000
+++ doc/zorba/build_prepare.dox	2013-09-17 13:34:04 +0000
@@ -13,8 +13,8 @@
 
 \subsection download_source Getting a Source Code Release
 
-You may download the latest Zorba release source code as either a \c
-.zip or \c .tar.gz file from Launchpad:
+You may download the latest Zorba release source code as either a
+<b>.zip</b> or <b>.tar.gz</b> file from Launchpad:
 https://launchpad.net/zorba/+download .
 
 \subsection checkout_source Getting the Latest Code from Launchpad
@@ -77,15 +77,16 @@
 
 \note
 Please note that some of these modules depend on other modules.  Most
-notably, the EXPath http-client module (in the \c http-client module
-package) depends on the \c html module, which is in the \c
-data-converters module package. So, if you download the \c http-client
-package, you must also download the \c data-converters package (and
-ensure that \c libtidy is installed; see \ref noncore_requirements).
+notably, the EXPath http-client module (in the
+<a href="../modules/expath.org_ns_http-client.html">http-client</a> module
+package) depends on the
+<a href="../modules//www.zorba-xquery.com_modules_converters_html">html</a>
+module, which is in the <b>data-converters</b> module package. So, if you
+download the <b>http-client</b> package, you must also download the
+<b>data-converters</b> package (and ensure that
+<a href="http://tidy.sourceforge.net/";>libtidy</a> is installed; see \ref noncore_requirements).
 \note
-Please see our <a
-href="/img/documentation/2.9/zorba/modules.svg">module-interdependency
-graph</a> for details.
+Please see our <a href="../modules/images/modules.svg">module-interdependency graph</a> for details.
 
 \section create_build_dir Creating a Build Directory
 
@@ -93,7 +94,7 @@
 href="http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F";
 target="_blank">out-of-source build</a>, which means you need to
 create a separate (empty) build directory. A common convention is to
-create a directory named \"\c build\" in the Zorba source directory,
+create a directory named <b>"build"</b> in the Zorba source directory,
 but you may name it and place it anywhere you like.  We refer to this
 directory as \c {ZORBABUILD} in the following steps.
 

=== modified file 'doc/zorba/build_prerequisites.dox'
--- doc/zorba/build_prerequisites.dox	2013-06-19 15:19:17 +0000
+++ doc/zorba/build_prerequisites.dox	2013-09-17 13:34:04 +0000
@@ -45,7 +45,7 @@
     (http://xerces.apache.org/xerces-c/). This package is required to
     enable XML schema support. This feature is enabled by default. In
     order to disable XML schema support, you need to provide the CMake
-    configuration parameter \c ZORBA_NO_XMLSCHEMA=ON. Note that the Zorba
+    configuration parameter <b>ZORBA_NO_XMLSCHEMA=ON</b>. Note that the Zorba
     team tests with Xerces-C 3.1.1. Xerces-C 2.8.0 in particular is known
     to cause a few bugs with schema handling.
 
@@ -53,7 +53,7 @@
   required to enable Unicode support as well as some other
   internationalization features. This feature is enabled by
   default. To build without ICU, you need to provide the CMake
-  configuration parameter \c ZORBA_NO_ICU=ON.
+  configuration parameter <b>ZORBA_NO_ICU=ON</b>.
 
 \subsection optional_core_zorba Optional for Core Zorba
 
@@ -63,14 +63,13 @@
 by CMake.
 
 - CURL (libcurl) 7.12 or later (http://curl.haxx.se/). This package is
-    required if <a
-    href="../xqdoc/xhtml/www.zorba-xquery.com_modules_http-client.html">Zorba's built-in
+    required if <a href="../modules/www.zorba-xquery.com_modules_http-client.html">Zorba's built-in
     HTTP module</a> should be available.  Zorba will automatically be
     built with this module if the curl packages are installed.
     \note Please note that other modules depend on the http-client module
     (i.e., import it). Hence, those dependent modules will not work if
     the http module is not available. Please see our <a
-    href="../xqdoc/xhtml/images/modules.svg">module
+    href="../modules/images/modules.svg">module
     dependency graph</a> for the module inter-dependencies.
     \note Also note that Zorba internally uses this module when resolving
     http: URIs in queries, module/schema imports, and so on. If this
@@ -78,12 +77,12 @@
     URIs from the web.
     \note If you happen to have libcurl installed but would like to build
     Zorba without HTTP support, you may set the CMake configuration
-    parameter \c ZORBA_SUPPRESS_CURL=ON.
+    parameter <b>ZORBA_SUPPRESS_CURL=ON</b>.
 
 - LibXslt version 1.1.24 or later (http://xmlsoft.org/XSLT/). The
     LibXslt package is required for XQueryX support. This feature is
     not enabled by default.  To enable XQueryX support, you need to
-    provide the CMake configuration parameter \c ZORBA_XQUERYX=ON.
+    provide the CMake configuration parameter <b>ZORBA_XQUERYX=ON</b>.
 
 - Flex 2.5.33 or later (http://flex.sourceforge.net/) and
     Bison 2.4 or later (http://www.gnu.org/software/bison/) are
@@ -101,9 +100,7 @@
   that affects a small number of platforms, including at least
   FreeBSD. If you get compilation errors that look similar to this:
 
-\code
-   build/swig/php/zorba_apiPHP5_wrap.cxx:953: error: invalid conversion from 'const char*' to 'char*'
-\endcode
+  <b>build/swig/php/zorba_apiPHP5_wrap.cxx:953: error: invalid conversion from 'const char*' to 'char*'</b>
 
   then you may have run into this bug. Our experience is that Swig
   version at least 2.0.7 has corrected this bug, so please try upgrading
@@ -123,14 +120,14 @@
 All such modules are not built if the library (and development headers) they require are not available.
 Here is a list of the libraries required by the current non-core modules packages:
 
-- data-converters (CSV, HTML)
+- data-converters (HTML module)
   - Tidy (http://tidy.sourceforge.net)
 - data-formatting (XSL-FO)
   - Java (http://java.sun.com/javase/downloads/index.jsp)
   - Apache FOP (http://xmlgraphics.apache.org/fop/download.html)
-- email
+- email (SMTP module)
   - IMAP CClient (http://www.washington.edu/imap/)
-- geo
+- geo (GEO module)
   - GEOS version 3.2.2 or later (http://trac.osgeo.org/geos/)
 - EXPath http-client
   - CURL 7.12 or later (http://curl.haxx.se/)
@@ -139,6 +136,9 @@
 - languages (XSLT)
   - LibXslt version 1.1.24 or later (http://xmlsoft.org/XSLT/)
 
+For a more up to date list please see section "External C++ Library dependencies"
+in the <a href="../modules/images/modules.svg">module dependency graph</a>.
+
 In many cases you can find binary packages for these dependencies, which 
 will be the quickest and easiest way to meet the requirements. We have
 provided links or instructions for downloading binary packages for some

=== modified file 'doc/zorba/commandline.dox'
--- doc/zorba/commandline.dox	2013-08-23 11:15:04 +0000
+++ doc/zorba/commandline.dox	2013-09-17 13:34:04 +0000
@@ -193,15 +193,15 @@
  These are the files used in this example and their meaning:
 <table border="0">
  <tr>
-  <td><tt>  works-mod.xml</tt></td>
+  <td><tt>works-mod.xml</tt></td>
   <td>File that will be used as external variable.</td>
  </tr>
  <tr>
-  <td><tt>  comandline_doc_example_2.xq</tt></td>
+  <td><tt>comandline_doc_example_2.xq</tt></td>
   <td>This is an update query. For details please see below.</td>
  </tr>
  <tr>
-  <td><tt>  comandline_doc_example_2-test.xq</tt></td>
+  <td><tt>comandline_doc_example_2-test.xq</tt></td>
   <td>Query used to see the results of the update query. For details please see below.</td>
  </tr>
 </table>

=== modified file 'doc/zorba/conformance.dox'
--- doc/zorba/conformance.dox	2013-06-19 22:47:21 +0000
+++ doc/zorba/conformance.dox	2013-09-17 13:34:04 +0000
@@ -14,33 +14,35 @@
 
 
 \section summary_XQ10 Summary conformance W3C XQuery 1.0
-<table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="4">
+
+\htmlonly
+<table border="1" cellpadding="4">
   <tr>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Product
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Version
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests passed
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests failed
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests run
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     % passed
     </td>
   </tr>
   <tr>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Zorba
     </td>
-    <td bgcolor="paleturquoise">
-    2.9.1
+    <td bgcolor="lightcyan">
+    1.9.1
     </td>
     <td>
     21581
@@ -56,36 +58,38 @@
     </td>
   </tr>
 </table>
+\endhtmlonly
 
 \section summary_XQ30 Summary conformance W3C XQuery 3.0
 
-<table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="4">
+\htmlonly
+<table border="1" cellpadding="4">
   <tr>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Product
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Version
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests passed
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests failed
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Tests run
     </td>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     % passed
     </td>
   </tr>
   <tr>
-    <td bgcolor="paleturquoise">
+    <td bgcolor="lightcyan">
     Zorba
     </td>
-    <td bgcolor="paleturquoise">
-    2.9.1
+    <td bgcolor="lightcyan">
+    1.9.1
     </td>
     <td>
     25897
@@ -101,215 +105,179 @@
     </td>
   </tr>
 </table>
+\endhtmlonly
 
 \section summaryXQUTS Summary conformance W3C XQuery Update Facility 1.0
 
 The following table shows the supported features:
-<table bgcolor="lightcyan">
-  <tr>
-    <td>W3C XQuery Update Facility 1.0 feature</td>
-    <td>supported</td>
-  </tr>
-  <tr>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr>
-    <td>Minimal Conformance</td>
+\htmlonly
+<table border="1">
+  <tr>
+    <td bgcolor="lightcyan">W3C XQuery Update Facility 1.0 feature</td>
+    <td bgcolor="lightcyan">supported</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">Minimal Conformance</td>
     <td bgcolor="mediumseagreen">true</td>
   </tr>
   <tr>
-    <td>Update Facility Static Typing Feature</td>
+    <td bgcolor="lightcyan">Update Facility Static Typing Feature</td>
     <td bgcolor="white">false</td>
   </tr>
 </table>
+\endhtmlonly
 
 This is the W3C XQuery Update Facility 1.0 conformance summary:
  In generating the report we used Zorba version 2.5 that can be downloaded from https://launchpad.net/zorba/trunk/2.5 and XQUTS version 'current' (XQUTS version taken from CVS as of 2012-01-12). 
-<table bgcolor="lightcyan">
-  <tr>
-    <td>W3C XQuery Update Facility 1.0 feature</td>
-    <td>supported</td>
-  </tr>
-  <tr>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr>
-    <td>Minimal Conformance</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>Update Facility Static Typing Feature</td>
-    <td bgcolor="white">false</td>
-  </tr>
-</table>
-<table bgcolor="lightcyan">
-  <tr>
-    <td>W3C XQuery Update Facility 1.0 features</td>
-    <td>XQuery</td>
-    <td>XQueryX</td>
-  </tr>
-  <tr>
-    <td></td>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr bgcolor="lightcyan">
+\htmlonly
+<table border="1">
+  <tr>
+    <td bgcolor="lightcyan">W3C XQuery Update Facility 1.0 features</td>
+    <td bgcolor="lightcyan">XQuery</td>
+    <td bgcolor="lightcyan">XQueryX</td>
+  </tr>
+  <tr>
     <td bgcolor="lightcyan">Minimal Conformance</td>
-    <td align="center" bgcolor="mediumseagreen">667/667<br />100%</td>
-    <td align="center" bgcolor="mediumseagreen">667/667<br />100%</td>
+    <td align="center" bgcolor="mediumseagreen">667/667 100%</td>
+    <td align="center" bgcolor="mediumseagreen">667/667 100%</td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">Optional Features</td>
-    <td align="center" bgcolor="palegreen">97/126<br />76.98%</td>
-    <td align="center" bgcolor="palegreen">97/126<br />76.98%</td>
+    <td align="center" bgcolor="palegreen">97/126 76.98%</td>
+    <td align="center" bgcolor="palegreen">97/126 76.98%</td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">  Revalidation</td>
-    <td align="center" bgcolor="palegreen">76/77<br />
-    </td>
-    <td align="center" bgcolor="palegreen">76/77<br />
-    </td>
+    <td align="center" bgcolor="palegreen">76/77 </td>
+    <td align="center" bgcolor="palegreen">76/77 </td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">  Update Facility Static Typing Feature</td>
-    <td align="center" bgcolor="white">0/27<br />
-    </td>
-    <td align="center" bgcolor="white">0/27<br />
-    </td>
+    <td align="center" bgcolor="white">0/27 </td>
+    <td align="center" bgcolor="white">0/27 </td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">  Tests that need the Full Axis Feature</td>
-    <td align="center" bgcolor="mediumseagreen">14/14<br />
-    </td>
-    <td align="center" bgcolor="mediumseagreen">14/14<br />
-    </td>
+    <td align="center" bgcolor="mediumseagreen">14/14 </td>
+    <td align="center" bgcolor="mediumseagreen">14/14 </td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">  fn:put applied to nodes other than document and element nodes</td>
-    <td align="center" bgcolor="palegreen">7/8<br />
-    </td>
-    <td align="center" bgcolor="palegreen">7/8<br />
-    </td>
+    <td align="center" bgcolor="palegreen">7/8 </td>
+    <td align="center" bgcolor="palegreen">7/8 </td>
   </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="lightcyan">Use Cases</td>
-    <td align="center" bgcolor="mediumseagreen">22/22<br />100%</td>
-    <td align="center" bgcolor="mediumseagreen">22/22<br />100%</td>
+    <td align="center" bgcolor="mediumseagreen">22/22 100%</td>
+    <td align="center" bgcolor="mediumseagreen">22/22 100%</td>
   </tr>
 </table>
+\endhtmlonly
 
 \section summaryXQFTTS Summary conformance W3C XQuery and XPath Full Text 1.0
 The following table shows the supported features:
-<table bgcolor="lightcyan">
-  <tr>
-    <td>W3C XQuery and XPath Full Text 1.0 features</td>
-    <td>supported</td>
-  </tr>
-  <tr>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr>
-    <td>Minimal Conformance</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTMildNot Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTUnaryNot Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTUnit and FTBigUnit</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTOrder Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTScope Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTWindow Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTDistance Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTTimes Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTContent Operator</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTCaseOption</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTStopwordOption</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTLanguageOption</td>
-    <td bgcolor="mediumseagreen">true</td>
-  </tr>
-  <tr>
-    <td>FTIgnoreOption</td>
-    <td bgcolor="white">false</td>
-  </tr>
-  <tr>
-    <td>Scoring</td>
-    <td bgcolor="white">false</td>
-  </tr>
-  <tr>
-    <td>Weights</td>
+\htmlonly
+<table border="1">
+  <tr>
+    <td bgcolor="lightcyan">W3C XQuery and XPath Full Text 1.0 features</td>
+    <td bgcolor="lightcyan">supported</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">Minimal Conformance</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTMildNot Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTUnaryNot Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTUnit and FTBigUnit</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTOrder Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTScope Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTWindow Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTDistance Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTTimes Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTContent Operator</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTCaseOption</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTStopwordOption</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTLanguageOption</td>
+    <td bgcolor="mediumseagreen">true</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">FTIgnoreOption</td>
+    <td bgcolor="white">false</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">Scoring</td>
+    <td bgcolor="white">false</td>
+  </tr>
+  <tr>
+    <td bgcolor="lightcyan">Weights</td>
     <td bgcolor="white">false</td>
   </tr>
 </table>
+\endhtmlonly
 
 This is the W3C XQuery and XPath Full Text 1.0 conformance summary:
 In generating the report we used Zorba version 2.5 that can be downloaded from https://launchpad.net/zorba/trunk/2.5 and XQFTTS version 'current' (XQFTTS taken from W3C CVS as of 2012-01-12). 
-
-<table bgcolor="lightcyan">
-  <tr>
-    <td>W3C XQuery and XPath Full Text 1.0 features</td>
-    <td>XQuery</td>
-    <td>XQueryX</td>
-  </tr>
-  <tr>
-    <td></td>
-    <td></td>
-    <td></td>
-  </tr>
-  <tr bgcolor="lightcyan">
+\htmlonly
+<table border="1">
+  <tr>
+    <td bgcolor="lightcyan">W3C XQuery and XPath Full Text 1.0 features</td>
+    <td bgcolor="lightcyan">XQuery</td>
+    <td bgcolor="lightcyan">XQueryX</td>
+  </tr>
+  <tr>
     <td bgcolor="lightcyan">Minimal Conformance</td>
-    <td align="center" bgcolor="palegreen">384/429<br />89.51%</td>
-    <td align="center" bgcolor="palegreen">374/429<br />87.18%</td>
+    <td align="center" bgcolor="palegreen">384/429 89.51%</td>
+    <td align="center" bgcolor="palegreen">374/429 87.18%</td>
   </tr>
-  <tr bgcolor="lightcyan">
+  <tr>
     <td bgcolor="lightcyan">Optional Features</td>
-    <td align="center" bgcolor="palegreen">106/125<br />84.8%</td>
-    <td align="center" bgcolor="palegreen">97/125<br />77.6%</td>
+    <td align="center" bgcolor="palegreen">106/125 84.8%</td>
+    <td align="center" bgcolor="palegreen">97/125 77.6%</td>
   </tr>
-  <tr bgcolor="lightcyan">
+  <tr>
     <td bgcolor="lightcyan">Use Cases</td>
-    <td align="center" bgcolor="palegreen">120/135<br />88.89%</td>
-    <td align="center" bgcolor="palegreen">102/135<br />75.56%</td>
+    <td align="center" bgcolor="palegreen">120/135 88.89%</td>
+    <td align="center" bgcolor="palegreen">102/135 75.56%</td>
   </tr>
-  <tr bgcolor="lightcyan">
+  <tr>
     <td bgcolor="lightcyan">Consistency in XQFTTS Catalog</td>
-    <td align="center" bgcolor="mediumseagreen">3/3<br />100%</td>
-    <td align="center" bgcolor="mediumseagreen">3/3<br />100%</td>
+    <td align="center" bgcolor="mediumseagreen">3/3 100%</td>
+    <td align="center" bgcolor="mediumseagreen">3/3 100%</td>
   </tr>
 </table>
+\endhtmlonly
 */

=== modified file 'doc/zorba/conformanceXQFTTS.dox'
--- doc/zorba/conformanceXQFTTS.dox	2013-02-07 17:24:36 +0000
+++ doc/zorba/conformanceXQFTTS.dox	2013-09-17 13:34:04 +0000
@@ -2,19 +2,15 @@
 
  In generating the report we used Zorba version 2.5 that can be downloaded from https://launchpad.net/zorba/trunk/2.5 and XQFTTS version 'current' (XQFTTS taken from W3C CVS as of 2012-01-12). 
  Zorba achieves 89.51% on minimal conformance (and 84.8% on Optional Features) for the W3C XPath Full Text 1.0 Test Suite.
-            
-Please see the table below for more details. 
-<table bgcolor="lightcyan">
+
+Please see the table below for more details.
+\htmlonly
+<table border="1" bgcolor="lightcyan">
   <tr>
     <td>W3C XQuery and XPath Full Text 1.0 features</td>
     <td>XQuery</td>
     <td>XQueryX</td>
   </tr>
-  <tr>
-    <td></td>
-    <td></td>
-    <td></td>
-  </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="paleturquoise">Minimal Conformance</td>
     <td align="center" bgcolor="paleturquoise"></td>
@@ -486,4 +482,5 @@
     <td align="center" bgcolor="mediumseagreen">3/3</td>
   </tr>
 </table>
+\endhtmlonly
 */
\ No newline at end of file

=== modified file 'doc/zorba/conformanceXQUTS.dox'
--- doc/zorba/conformanceXQUTS.dox	2013-02-07 17:24:36 +0000
+++ doc/zorba/conformanceXQUTS.dox	2013-09-17 13:34:04 +0000
@@ -2,19 +2,15 @@
 
  In generating the report we used Zorba version 2.5 that can be downloaded from https://launchpad.net/zorba/trunk/2.5 and XQUTS version 'current' (XQUTS version taken from CVS as of 2012-01-12). 
  Zorba achieves 100% on minimal conformance (and 76.98% on Optional Features) for the W3C XQuery Update Facility Test Suite.
-            
-Please see the table below for more details. 
-<table bgcolor="lightcyan">
+
+Please see the table below for more details.
+\htmlonly
+<table border="1" bgcolor="lightcyan">
   <tr>
     <td>W3C XQuery Update Facility 1.0 features</td>
     <td>XQuery</td>
     <td>XQueryX</td>
   </tr>
-  <tr>
-    <td></td>
-    <td></td>
-    <td></td>
-  </tr>
   <tr bgcolor="lightcyan">
     <td bgcolor="paleturquoise">Minimal Conformance</td>
     <td align="center" bgcolor="paleturquoise"></td>
@@ -251,7 +247,8 @@
     <td align="center" bgcolor="mediumseagreen">14/14</td>
   </tr>
   <tr bgcolor="lightcyan">
-    <td bgcolor="paleturquoise">  fn:put applied to nodes other than document and element nodes</td>
+    <td bgcolor="paleturquoise">  fn:put applied to nodes other than document and element
+      nodes</td>
     <td align="center" bgcolor="paleturquoise"></td>
     <td align="center" bgcolor="paleturquoise"></td>
   </tr>
@@ -271,7 +268,8 @@
     <td align="center" bgcolor="mediumseagreen">1/1</td>
   </tr>
   <tr bgcolor="lightcyan">
-    <td bgcolor="lightcyan">    fn:put() applied to processing-instruction nodes - unsupported</td>
+    <td bgcolor="lightcyan">    fn:put() applied to processing-instruction nodes -
+      unsupported</td>
     <td align="center" bgcolor="mediumseagreen">1/1</td>
     <td align="center" bgcolor="mediumseagreen">1/1</td>
   </tr>
@@ -316,7 +314,8 @@
     <td align="center" bgcolor="mediumseagreen">1/1</td>
   </tr>
   <tr bgcolor="lightcyan">
-    <td bgcolor="lightcyan">  Use Cases "Namespaces" - moving elements from one namespace to another</td>
+    <td bgcolor="lightcyan">  Use Cases "Namespaces" - moving elements from one namespace to
+      another</td>
     <td align="center" bgcolor="mediumseagreen">1/1</td>
     <td align="center" bgcolor="mediumseagreen">1/1</td>
   </tr>
@@ -331,4 +330,5 @@
     <td align="center" bgcolor="mediumseagreen">1/1</td>
   </tr>
 </table>
+\endhtmlonly
 */
\ No newline at end of file

=== modified file 'doc/zorba/conformance_XQ10.dox'
--- doc/zorba/conformance_XQ10.dox	2013-06-19 22:47:21 +0000
+++ doc/zorba/conformance_XQ10.dox	2013-09-17 13:34:04 +0000
@@ -9,3041 +9,1537 @@
 Zorba achieves 99.53 for the XQuery 1.0 tests in <a href="http://dev.w3.org/2011/QT3-test-suite/";>XQuery/XPath/XSLT 3.* Test Suite</a>.
 
 Please see the table below for more details.
-
+\htmlonly
 <table border="1" width="100%">
   <th>
-  <b>
-  Summary of results for XQuery 1.0
-  </b>
+    <b> Summary of results for XQuery 1.0 </b>
   </th>
   <tr>
     <td>
       <table>
         <tr>
-          <td>
-          Legend:&nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
+          <td> Legend:&nbsp;&nbsp;&nbsp;&nbsp; </td>
           <td>
             <table>
               <tr>
-                <td bgcolor="mediumseagreen">
-                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                <td bgcolor="mediumseagreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 </td>
               </tr>
             </table>
           </td>
-          <td>
-          passed
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="palegreen">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-             </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          almost passed<br>(≥ 98%)
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="coral">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-              </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          failed
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-         </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="white">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          untested
-          </td>
+          <td> passed </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="palegreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> almost passed (≥ 98%) </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="coral"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> failed </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="white"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> untested </td>
         </tr>
       </table>
-      </td>
-    </tr>
-  </table>
+    </td>
+  </tr>
+</table>
+\endhtmlonly
+
+\htmlonly
 <table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="2">
   <tr>
-    <th>
-    Tests
-    </th>
-    <th>
-    Zorba 2.9.1
-    <br>
-    XQ30
-    <br>
-    (QT3 vCVS)
-    </th>
-  </tr>
-  <tr>
-    <td valign="top">
-    fn-abs
-    </td>
-    <td align="center" bgcolor="mediumseagreen">
-    183/183
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-    fn-adjust-date-to-timezone
-    </td>
-    <td align="center" bgcolor="mediumseagreen">
-    40/40
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-adjust-dateTime-to-timezone
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    47/47
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-adjust-time-to-timezone
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    41/41
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-analyze-string
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-available-environment-variables
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    1/1
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-avg
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    237/237
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-base-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    62/62
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-boolean
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    136/136
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-ceiling
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    87/87
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-codepoint-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    36/36
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-codepoints-to-string
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    76/76
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-collection
-    </td>
-      <td align="center" bgcolor="coral">
-      18/29
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-compare
-    </td>
-    <td align="center" bgcolor="palegreen">
-      63/64
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-concat
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    95/95
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-contains
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    41/41
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-count
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    316/316
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-current-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    26/26
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-current-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-current-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-data
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    53/53
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    52/52
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-day-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-day-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-days-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-deep-equal
-    </td>
-      <td align="center" bgcolor="coral">
-      204/210
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-default-collation
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    7/7
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-distinct-values
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    104/104
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-doc
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    43/43
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-doc-available
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    13/13
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-document-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    35/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-element-with-id
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    5/5
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-empty
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    54/54
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-encode-for-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    29/29
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-ends-with
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    38/38
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-environment-variable
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    3/3
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-error
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    97/97
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-escape-html-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-exactly-one
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    54/54
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-exists
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-false
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-filter
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-floor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    88/88
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-fold-left
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-fold-right
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-format-date
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-format-dateTime
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-format-integer
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-format-number
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-format-time
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-function-lookup
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-function-arity
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-function-name
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-generate-id
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-has-children
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-head
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-hours-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-hours-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-hours-from-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-id
-    </td>
-      <td align="center" bgcolor="coral">
-      39/41
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-idref
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    30/30
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-implicit-timezone
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-innermost
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-index-of
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    53/53
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-insert-before
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    43/43
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-in-scope-prefixes
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-iri-to-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    46/46
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-lang
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    36/36
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-last
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    65/65
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-local-name
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    59/59
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-local-name-from-QName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-lower-case
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-map
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-max
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    201/201
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-map-pairs
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-matches
-    </td>
-       <td align="center" bgcolor="palegreen">
-      145/146
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-matches.re
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    1/1
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-min
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    200/200
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-minutes-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-minutes-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    32/32
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-minutes-from-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-month-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-months-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-month-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-name
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    33/33
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-namespace-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    33/33
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-namespace-uri-for-prefix
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    29/29
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-namespace-uri-from-QName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    29/29
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-nilled
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    54/54
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-node-name
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    35/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-normalize-space
-    </td>
-      <td align="center" bgcolor="coral">
-      37/39
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-normalize-unicode
-    </td>
-      <td align="center" bgcolor="coral">
-      41/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-not
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    83/83
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-number
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    66/66
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-one-or-more
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    56/56
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-outermost
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-parse-json
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-parse-xml
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-parse-xml-fragment
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-path
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-position
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    66/66
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-prefix-from-QName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-QName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-remove
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    48/48
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-replace
-    </td>
-       <td align="center" bgcolor="palegreen">
-      72/73
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-resolve-QName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-resolve-uri
-    </td>
-      <td align="center" bgcolor="coral">
-      36/38
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-reverse
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    70/70
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-root
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    36/36
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-round
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    245/245
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-round-half-to-even
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    128/128
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-seconds-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-seconds-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    32/32
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-seconds-from-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-serialize
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-serialize-json
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-starts-with
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    39/39
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-static-base-uri
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    18/18
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-string
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    62/62
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-string-join
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-string-length
-    </td>
-      <td align="center" bgcolor="coral">
-      33/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-string-to-codepoints
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-subsequence
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    103/103
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-substring
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    48/48
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-substring-after
-    </td>
-      <td align="center" bgcolor="coral">
-      36/37
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-substring-before
-    </td>
-      <td align="center" bgcolor="coral">
-      35/36
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-sum
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    218/218
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-tail
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-timezone-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-timezone-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-timezone-from-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-tokenize
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    50/50
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-trace
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-translate
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    42/42
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-true
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-unordered
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-unparsed-text
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-unparsed-text-available
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-unparsed-text-lines
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-upper-case
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    24/24
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-uri-collection
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-year-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-years-from-duration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-year-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      fn-zero-or-one
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    51/51
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-acos
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-asin
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-atan
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-atan2
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-cos
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-exp
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-exp10
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-log
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-log10
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-pi
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-pow
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-sin
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-sqrt
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      math-tan
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-new
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-contains
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-get
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-entry
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-size
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-keys
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-remove
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      map-collation
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-anyURI
-    </td>
-      <td align="center" bgcolor="coral">
-      11/13
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-base64Binary
-    </td>
-      <td align="center" bgcolor="coral">
-      36/37
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-dateTimeStamp
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    6/6
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-double
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    3/3
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-error
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-float
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    5/5
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-hexBinary
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    1/1
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-normalizedString
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    6/6
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      xs-token
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    6/6
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-dayTimeDurations
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    61/61
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-dayTimeDuration-to-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    25/25
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-dayTimeDuration-to-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-dayTimeDuration-to-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    26/26
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-yearMonthDurations
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-yearMonthDuration-to-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-add-yearMonthDuration-to-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    29/29
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-anyURI-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    22/22
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-anyURI-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    10/10
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-anyURI-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    8/8
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-bang
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-base64Binary-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    30/30
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-boolean-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    55/55
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-boolean-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    49/49
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-boolean-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    49/49
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-concat
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-concatenate
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    54/54
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-date-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    47/47
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-date-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    48/48
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-date-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    48/48
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-dateTime-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    71/71
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-dateTime-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-dateTime-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-dayTimeDuration-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-dayTimeDuration-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    46/46
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-divide-dayTimeDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    55/55
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-divide-dayTimeDuration-by-dayTimeDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    25/25
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-divide-yearMonthDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-divide-yearMonthDuration-by-yearMonthDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    23/23
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-duration-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    158/158
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-except
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    71/71
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-gDay-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    51/51
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-gMonth-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    45/45
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-gMonthDay-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    51/51
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-gYear-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    46/46
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-gYearMonth-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    46/46
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-hexBinary-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    32/32
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-intersect
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    71/71
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-is-same-node
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    37/37
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-multiply-dayTimeDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    46/46
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-multiply-yearMonthDuration
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-node-after
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    35/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-node-before
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    35/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-NOTATION-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    22/22
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-add
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    140/140
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    202/202
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-divide
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    140/140
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    116/116
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-integer-divide
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    136/136
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    183/183
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-mod
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    124/124
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-multiply
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    107/107
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-subtract
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    119/119
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-unary-minus
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    64/64
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-numeric-unary-plus
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    55/55
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-QName-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    38/38
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-string-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    15/15
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-string-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    9/9
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-string-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    10/10
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dates
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    30/30
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dateTimes
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    30/30
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dayTimeDuration-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    23/23
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dayTimeDuration-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    22/22
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dayTimeDuration-from-time
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-dayTimeDurations
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    69/69
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-times
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    33/33
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-yearMonthDuration-from-date
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    25/25
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-yearMonthDuration-from-dateTime
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    23/23
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-subtract-yearMonthDurations
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    33/33
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-time-equal
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-time-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-time-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-to
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    69/69
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-union
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    82/82
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-yearMonthDuration-greater-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      op-yearMonthDuration-less-than
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AllowingEmpty
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-Annotation
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    330/330
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.abbr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    23/23
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.ancestor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    43/43
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.ancestor-or-self
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.following
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    25/25
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.following-sibling
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    33/33
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.preceding
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    31/31
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.preceding-sibling
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    28/28
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.static-typing
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-AxisStep.unabbr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    26/26
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-BaseURIDecl
-    </td>
-      <td align="center" bgcolor="coral">
-      37/38
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-BoundarySpaceDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    28/28
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CastableExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    799/799
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CastExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    2732/2732
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CastExpr.derived
-    </td>
-       <td align="center" bgcolor="palegreen">
-      154/155
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CastExpr.schema
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-Comment
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    45/45
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompAttrConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    109/109
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompDocConstructor
-    </td>
-       <td align="center" bgcolor="palegreen">
-      57/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompCommentConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    28/28
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompElemConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    72/72
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompNamespaceConstructor
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompPIConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    54/54
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CompTextConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    35/35
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ConstructionDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    26/26
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ConstructionDecl.schema
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    4/4
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ContextItemDecl
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ContextItemExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    45/45
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CopyNamespacesDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    36/36
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-CountClause
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DecimalFormatDecl
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DefaultCollationDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    8/8
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DefaultNamespaceDecl
-    </td>
-      <td align="center" bgcolor="coral">
-      57/59
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirAttributeList
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    124/124
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirectConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    91/91
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirElemConstructor
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    67/67
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirElemContent
-    </td>
-       <td align="center" bgcolor="palegreen">
-      126/127
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirElemContent.namespace
-    </td>
-       <td align="center" bgcolor="palegreen">
-      131/132
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-DirElemContent.whitespace
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    83/83
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-EmptyOrderDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    32/32
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-EQName
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    2/2
-    </td>
-
-
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ExtensionExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    51/51
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-FLWORExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    21/21
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-FLWORExpr.static-typing
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ForClause
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    188/188
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-FunctionCall
-    </td>
-      <td align="center" bgcolor="coral">
-      66/69
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-FunctionDecl
-    </td>
-      <td align="center" bgcolor="coral">
-      137/152
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.eq
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    172/172
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.ge
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    110/110
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.gt
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    118/118
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.le
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    108/108
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.lt
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    127/127
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GeneralComp.ne
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    140/140
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-GroupByClause
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-IfExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    42/42
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-InstanceofExpr
-    </td>
-       <td align="center" bgcolor="palegreen">
-      277/278
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-LetClause
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    81/81
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-Literal
-    </td>
-       <td align="center" bgcolor="palegreen">
-      163/166
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ModuleImport
-    </td>
-      <td align="center" bgcolor="coral">
-      72/80
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-NamedFunctionRef
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-NamespaceDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-NameTest
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    122/122
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-NodeTest
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    67/67
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-OptionDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    8/8
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-OptionDecl.serialization
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-OrExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    371/371
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-OrderByClause
-    </td>
-      <td align="center" bgcolor="coral">
-      195/201
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-OrderingModeDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    27/27
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-PathExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    17/17
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ParenthesizedExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    20/20
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-PositionalVar
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    34/34
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-Predicate
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    190/190
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-QuantifiedExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    200/200
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-RequireProhibitFeature
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ReturnClause
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    21/21
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-SchemaImport
-    </td>
-      <td align="center" bgcolor="coral">
-      105/116
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-SequenceType
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    21/21
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-StepExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    58/58
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-SwitchExpr
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-TreatExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    69/69
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-TryCatchExpr
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-TypeswitchExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    56/56
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-UnorderedExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    26/26
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ValidateExpr
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    66/66
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-ValueComp
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    44/44
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-VarDecl
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    124/124
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-VarDecl.external
-    </td>
-       <td align="center" bgcolor="palegreen">
-      94/95
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-VarDefaultValue
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-VersionDecl
-    </td>
-      <td align="center" bgcolor="coral">
-      27/28
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-WhereClause
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    71/71
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      prod-WindowClause
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-CombinedErrorCodes
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    254/254
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-AnnexE
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    8/8
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-AppendixA4
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    9/9
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-ErrorsAndOptimization
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    7/7
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-HigherOrderFunctions
-    </td>
-      <td align="center" bgcolor="white">
-      0/0
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-MiscFunctions
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    38/38
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-StaticContext
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    1/1
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-Serialization
-    </td>
-      <td align="center" bgcolor="coral">
-      4/12
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-Surrogates
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    17/17
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      misc-XMLEdition
-    </td>
-      <td align="center" bgcolor="coral">
-      9/10
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-CatalogCheck
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    10/10
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-Demos
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    4/4
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-FunctxFn
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    500/500
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-FunctxFunctx
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    627/627
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseNS
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    8/8
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCasePARTS
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    1/1
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseR
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    18/18
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseSEQ
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    5/5
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseSGML
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    11/11
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseSTRING
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    4/4
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseTREE
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    6/6
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-UseCaseXMP
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    12/12
-    </td>
-  </tr>
-  <tr>
-    <td valign="top">
-      app-XMark
-    </td>
-      <td align="center" bgcolor="mediumseagreen">
-    21/21
-    </td>
+    <th> Tests </th>
+    <th> Zorba 2.9.1 XQ30 (QT3 vCVS) </th>
+  </tr>
+  <tr>
+    <td valign="top"> fn-abs </td>
+    <td align="center" bgcolor="mediumseagreen"> 183/183 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-adjust-date-to-timezone </td>
+    <td align="center" bgcolor="mediumseagreen"> 40/40 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-adjust-dateTime-to-timezone </td>
+    <td align="center" bgcolor="mediumseagreen"> 47/47 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-adjust-time-to-timezone </td>
+    <td align="center" bgcolor="mediumseagreen"> 41/41 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-analyze-string </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-available-environment-variables </td>
+    <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-avg </td>
+    <td align="center" bgcolor="mediumseagreen"> 237/237 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-base-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 62/62 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-boolean </td>
+    <td align="center" bgcolor="mediumseagreen"> 136/136 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-ceiling </td>
+    <td align="center" bgcolor="mediumseagreen"> 87/87 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-codepoint-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-codepoints-to-string </td>
+    <td align="center" bgcolor="mediumseagreen"> 76/76 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-collection </td>
+    <td align="center" bgcolor="coral"> 18/29 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-compare </td>
+    <td align="center" bgcolor="palegreen"> 63/64 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-concat </td>
+    <td align="center" bgcolor="mediumseagreen"> 95/95 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-contains </td>
+    <td align="center" bgcolor="mediumseagreen"> 41/41 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-count </td>
+    <td align="center" bgcolor="mediumseagreen"> 316/316 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-current-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-current-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-current-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-data </td>
+    <td align="center" bgcolor="mediumseagreen"> 53/53 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 52/52 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-day-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-day-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-days-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-deep-equal </td>
+    <td align="center" bgcolor="coral"> 204/210 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-default-collation </td>
+    <td align="center" bgcolor="mediumseagreen"> 7/7 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-distinct-values </td>
+    <td align="center" bgcolor="mediumseagreen"> 104/104 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-doc </td>
+    <td align="center" bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-doc-available </td>
+    <td align="center" bgcolor="mediumseagreen"> 13/13 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-document-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-element-with-id </td>
+    <td align="center" bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-empty </td>
+    <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-encode-for-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-ends-with </td>
+    <td align="center" bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-environment-variable </td>
+    <td align="center" bgcolor="mediumseagreen"> 3/3 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-error </td>
+    <td align="center" bgcolor="mediumseagreen"> 97/97 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-escape-html-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-exactly-one </td>
+    <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-exists </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-false </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-filter </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-floor </td>
+    <td align="center" bgcolor="mediumseagreen"> 88/88 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-fold-left </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-fold-right </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-format-date </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-format-dateTime </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-format-integer </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-format-number </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-format-time </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-function-lookup </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-function-arity </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-function-name </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-generate-id </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-has-children </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-head </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-hours-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-hours-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-hours-from-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-id </td>
+    <td align="center" bgcolor="coral"> 39/41 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-idref </td>
+    <td align="center" bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-implicit-timezone </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-innermost </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-index-of </td>
+    <td align="center" bgcolor="mediumseagreen"> 53/53 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-insert-before </td>
+    <td align="center" bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-in-scope-prefixes </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-iri-to-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-lang </td>
+    <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-last </td>
+    <td align="center" bgcolor="mediumseagreen"> 65/65 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-local-name </td>
+    <td align="center" bgcolor="mediumseagreen"> 59/59 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-local-name-from-QName </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-lower-case </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-map </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-max </td>
+    <td align="center" bgcolor="mediumseagreen"> 201/201 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-map-pairs </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-matches </td>
+    <td align="center" bgcolor="palegreen"> 145/146 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-matches.re </td>
+    <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-min </td>
+    <td align="center" bgcolor="mediumseagreen"> 200/200 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-minutes-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-minutes-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-minutes-from-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-month-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-months-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-month-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-name </td>
+    <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-namespace-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-namespace-uri-for-prefix </td>
+    <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-namespace-uri-from-QName </td>
+    <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-nilled </td>
+    <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-node-name </td>
+    <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-normalize-space </td>
+    <td align="center" bgcolor="coral"> 37/39 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-normalize-unicode </td>
+    <td align="center" bgcolor="coral"> 41/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-not </td>
+    <td align="center" bgcolor="mediumseagreen"> 83/83 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-number </td>
+    <td align="center" bgcolor="mediumseagreen"> 66/66 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-one-or-more </td>
+    <td align="center" bgcolor="mediumseagreen"> 56/56 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-outermost </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-parse-json </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-parse-xml </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-parse-xml-fragment </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-path </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-position </td>
+    <td align="center" bgcolor="mediumseagreen"> 66/66 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-prefix-from-QName </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-QName </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-remove </td>
+    <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-replace </td>
+    <td align="center" bgcolor="palegreen"> 72/73 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-resolve-QName </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-resolve-uri </td>
+    <td align="center" bgcolor="coral"> 36/38 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-reverse </td>
+    <td align="center" bgcolor="mediumseagreen"> 70/70 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-root </td>
+    <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-round </td>
+    <td align="center" bgcolor="mediumseagreen"> 245/245 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-round-half-to-even </td>
+    <td align="center" bgcolor="mediumseagreen"> 128/128 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-seconds-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-seconds-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-seconds-from-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-serialize </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-serialize-json </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-starts-with </td>
+    <td align="center" bgcolor="mediumseagreen"> 39/39 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-static-base-uri </td>
+    <td align="center" bgcolor="mediumseagreen"> 18/18 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-string </td>
+    <td align="center" bgcolor="mediumseagreen"> 62/62 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-string-join </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-string-length </td>
+    <td align="center" bgcolor="coral"> 33/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-string-to-codepoints </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-subsequence </td>
+    <td align="center" bgcolor="mediumseagreen"> 103/103 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-substring </td>
+    <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-substring-after </td>
+    <td align="center" bgcolor="coral"> 36/37 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-substring-before </td>
+    <td align="center" bgcolor="coral"> 35/36 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-sum </td>
+    <td align="center" bgcolor="mediumseagreen"> 218/218 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-tail </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-timezone-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-timezone-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-timezone-from-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-tokenize </td>
+    <td align="center" bgcolor="mediumseagreen"> 50/50 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-trace </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-translate </td>
+    <td align="center" bgcolor="mediumseagreen"> 42/42 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-true </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-unordered </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-unparsed-text </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-unparsed-text-available </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-unparsed-text-lines </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-upper-case </td>
+    <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-uri-collection </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-year-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-years-from-duration </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-year-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> fn-zero-or-one </td>
+    <td align="center" bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-acos </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-asin </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-atan </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-atan2 </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-cos </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-exp </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-exp10 </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-log </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-log10 </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-pi </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-pow </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-sin </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-sqrt </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> math-tan </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-new </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-contains </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-get </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-entry </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-size </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-keys </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-remove </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> map-collation </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-anyURI </td>
+    <td align="center" bgcolor="coral"> 11/13 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-base64Binary </td>
+    <td align="center" bgcolor="coral"> 36/37 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-dateTimeStamp </td>
+    <td align="center" bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-double </td>
+    <td align="center" bgcolor="mediumseagreen"> 3/3 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-error </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-float </td>
+    <td align="center" bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-hexBinary </td>
+    <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-normalizedString </td>
+    <td align="center" bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td valign="top"> xs-token </td>
+    <td align="center" bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-dayTimeDurations </td>
+    <td align="center" bgcolor="mediumseagreen"> 61/61 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-dayTimeDuration-to-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-dayTimeDuration-to-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-dayTimeDuration-to-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-yearMonthDurations </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-yearMonthDuration-to-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-add-yearMonthDuration-to-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-anyURI-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-anyURI-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-anyURI-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-bang </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-base64Binary-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-boolean-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-boolean-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 49/49 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-boolean-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 49/49 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-concat </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-concatenate </td>
+    <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-date-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 47/47 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-date-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-date-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-dateTime-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-dateTime-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-dateTime-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-dayTimeDuration-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-dayTimeDuration-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-divide-dayTimeDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-divide-dayTimeDuration-by-dayTimeDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-divide-yearMonthDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-divide-yearMonthDuration-by-yearMonthDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-duration-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 158/158 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-except </td>
+    <td align="center" bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-gDay-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-gMonth-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-gMonthDay-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-gYear-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-gYearMonth-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-hexBinary-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-intersect </td>
+    <td align="center" bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-is-same-node </td>
+    <td align="center" bgcolor="mediumseagreen"> 37/37 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-multiply-dayTimeDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-multiply-yearMonthDuration </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-node-after </td>
+    <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-node-before </td>
+    <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-NOTATION-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-add </td>
+    <td align="center" bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 202/202 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-divide </td>
+    <td align="center" bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 116/116 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-integer-divide </td>
+    <td align="center" bgcolor="mediumseagreen"> 136/136 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 183/183 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-mod </td>
+    <td align="center" bgcolor="mediumseagreen"> 124/124 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-multiply </td>
+    <td align="center" bgcolor="mediumseagreen"> 107/107 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-subtract </td>
+    <td align="center" bgcolor="mediumseagreen"> 119/119 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-unary-minus </td>
+    <td align="center" bgcolor="mediumseagreen"> 64/64 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-numeric-unary-plus </td>
+    <td align="center" bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-QName-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-string-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 15/15 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-string-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-string-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dates </td>
+    <td align="center" bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dateTimes </td>
+    <td align="center" bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dayTimeDuration-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dayTimeDuration-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dayTimeDuration-from-time </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-dayTimeDurations </td>
+    <td align="center" bgcolor="mediumseagreen"> 69/69 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-times </td>
+    <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-yearMonthDuration-from-date </td>
+    <td align="center" bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-yearMonthDuration-from-dateTime </td>
+    <td align="center" bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-subtract-yearMonthDurations </td>
+    <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-time-equal </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-time-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-time-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-to </td>
+    <td align="center" bgcolor="mediumseagreen"> 69/69 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-union </td>
+    <td align="center" bgcolor="mediumseagreen"> 82/82 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-yearMonthDuration-greater-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> op-yearMonthDuration-less-than </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AllowingEmpty </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-Annotation </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep </td>
+    <td align="center" bgcolor="mediumseagreen"> 330/330 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.abbr </td>
+    <td align="center" bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.ancestor </td>
+    <td align="center" bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.ancestor-or-self </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.following </td>
+    <td align="center" bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.following-sibling </td>
+    <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.preceding </td>
+    <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.preceding-sibling </td>
+    <td align="center" bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.static-typing </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-AxisStep.unabbr </td>
+    <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-BaseURIDecl </td>
+    <td align="center" bgcolor="coral"> 37/38 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-BoundarySpaceDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CastableExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 799/799 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CastExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 2732/2732 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CastExpr.derived </td>
+    <td align="center" bgcolor="palegreen"> 154/155 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CastExpr.schema </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-Comment </td>
+    <td align="center" bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompAttrConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 109/109 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompDocConstructor </td>
+    <td align="center" bgcolor="palegreen"> 57/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompCommentConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompElemConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 72/72 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompNamespaceConstructor </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompPIConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CompTextConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ConstructionDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ConstructionDecl.schema </td>
+    <td align="center" bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ContextItemDecl </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ContextItemExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CopyNamespacesDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-CountClause </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DecimalFormatDecl </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DefaultCollationDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DefaultNamespaceDecl </td>
+    <td align="center" bgcolor="coral"> 57/59 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirAttributeList </td>
+    <td align="center" bgcolor="mediumseagreen"> 124/124 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirectConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 91/91 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirElemConstructor </td>
+    <td align="center" bgcolor="mediumseagreen"> 67/67 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirElemContent </td>
+    <td align="center" bgcolor="palegreen"> 126/127 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirElemContent.namespace </td>
+    <td align="center" bgcolor="palegreen"> 131/132 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-DirElemContent.whitespace </td>
+    <td align="center" bgcolor="mediumseagreen"> 83/83 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-EmptyOrderDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-EQName </td>
+    <td align="center" bgcolor="mediumseagreen"> 2/2 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ExtensionExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-FLWORExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-FLWORExpr.static-typing </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ForClause </td>
+    <td align="center" bgcolor="mediumseagreen"> 188/188 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-FunctionCall </td>
+    <td align="center" bgcolor="coral"> 66/69 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-FunctionDecl </td>
+    <td align="center" bgcolor="coral"> 137/152 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.eq </td>
+    <td align="center" bgcolor="mediumseagreen"> 172/172 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.ge </td>
+    <td align="center" bgcolor="mediumseagreen"> 110/110 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.gt </td>
+    <td align="center" bgcolor="mediumseagreen"> 118/118 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.le </td>
+    <td align="center" bgcolor="mediumseagreen"> 108/108 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.lt </td>
+    <td align="center" bgcolor="mediumseagreen"> 127/127 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GeneralComp.ne </td>
+    <td align="center" bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-GroupByClause </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-IfExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 42/42 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-InstanceofExpr </td>
+    <td align="center" bgcolor="palegreen"> 277/278 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-LetClause </td>
+    <td align="center" bgcolor="mediumseagreen"> 81/81 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-Literal </td>
+    <td align="center" bgcolor="palegreen"> 163/166 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ModuleImport </td>
+    <td align="center" bgcolor="coral"> 72/80 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-NamedFunctionRef </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-NamespaceDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-NameTest </td>
+    <td align="center" bgcolor="mediumseagreen"> 122/122 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-NodeTest </td>
+    <td align="center" bgcolor="mediumseagreen"> 67/67 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-OptionDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-OptionDecl.serialization </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-OrExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 371/371 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-OrderByClause </td>
+    <td align="center" bgcolor="coral"> 195/201 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-OrderingModeDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-PathExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 17/17 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ParenthesizedExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 20/20 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-PositionalVar </td>
+    <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-Predicate </td>
+    <td align="center" bgcolor="mediumseagreen"> 190/190 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-QuantifiedExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 200/200 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-RequireProhibitFeature </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ReturnClause </td>
+    <td align="center" bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-SchemaImport </td>
+    <td align="center" bgcolor="coral"> 105/116 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-SequenceType </td>
+    <td align="center" bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-StepExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-SwitchExpr </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-TreatExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 69/69 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-TryCatchExpr </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-TypeswitchExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 56/56 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-UnorderedExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ValidateExpr </td>
+    <td align="center" bgcolor="mediumseagreen"> 66/66 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-ValueComp </td>
+    <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-VarDecl </td>
+    <td align="center" bgcolor="mediumseagreen"> 124/124 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-VarDecl.external </td>
+    <td align="center" bgcolor="palegreen"> 94/95 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-VarDefaultValue </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-VersionDecl </td>
+    <td align="center" bgcolor="coral"> 27/28 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-WhereClause </td>
+    <td align="center" bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td valign="top"> prod-WindowClause </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-CombinedErrorCodes </td>
+    <td align="center" bgcolor="mediumseagreen"> 254/254 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-AnnexE </td>
+    <td align="center" bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-AppendixA4 </td>
+    <td align="center" bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-ErrorsAndOptimization </td>
+    <td align="center" bgcolor="mediumseagreen"> 7/7 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-HigherOrderFunctions </td>
+    <td align="center" bgcolor="white"> 0/0 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-MiscFunctions </td>
+    <td align="center" bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-StaticContext </td>
+    <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-Serialization </td>
+    <td align="center" bgcolor="coral"> 4/12 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-Surrogates </td>
+    <td align="center" bgcolor="mediumseagreen"> 17/17 </td>
+  </tr>
+  <tr>
+    <td valign="top"> misc-XMLEdition </td>
+    <td align="center" bgcolor="coral"> 9/10 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-CatalogCheck </td>
+    <td align="center" bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-Demos </td>
+    <td align="center" bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-FunctxFn </td>
+    <td align="center" bgcolor="mediumseagreen"> 500/500 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-FunctxFunctx </td>
+    <td align="center" bgcolor="mediumseagreen"> 627/627 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseNS </td>
+    <td align="center" bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCasePARTS </td>
+    <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseR </td>
+    <td align="center" bgcolor="mediumseagreen"> 18/18 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseSEQ </td>
+    <td align="center" bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseSGML </td>
+    <td align="center" bgcolor="mediumseagreen"> 11/11 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseSTRING </td>
+    <td align="center" bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseTREE </td>
+    <td align="center" bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-UseCaseXMP </td>
+    <td align="center" bgcolor="mediumseagreen"> 12/12 </td>
+  </tr>
+  <tr>
+    <td valign="top"> app-XMark </td>
+    <td align="center" bgcolor="mediumseagreen"> 21/21 </td>
   </tr>
 </table>
-
+\endhtmlonly
 */
\ No newline at end of file

=== modified file 'doc/zorba/conformance_XQ30.dox'
--- doc/zorba/conformance_XQ30.dox	2013-06-19 22:47:21 +0000
+++ doc/zorba/conformance_XQ30.dox	2013-09-17 13:34:04 +0000
@@ -10,3005 +10,1537 @@
 
 Please see the table below for more details.
 
+\htmlonly
 <table border="1" width="100%">
   <th>
-  <b>
-  Summary of results for XQuery 3.0
-  </b>
+    <b> Summary of results for XQuery 3.0 </b>
   </th>
   <tr>
     <td>
       <table>
         <tr>
-          <td>
-          Legend:&nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
+          <td> Legend:&nbsp;&nbsp;&nbsp;&nbsp; </td>
           <td>
             <table>
               <tr>
-                <td bgcolor="mediumseagreen">
-                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+                <td bgcolor="mediumseagreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                 </td>
               </tr>
             </table>
           </td>
-          <td>
-          passed
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="palegreen">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-             </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          almost passed<br>(≥ 98%)
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="coral">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-              </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          failed
-          </td>
-          <td>
-          &nbsp;&nbsp;&nbsp;&nbsp;
-         </td>
-          <td>
-          <table>
-            <tr>
-              <td bgcolor="white">
-              &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
-          </td>
-            </tr>
-          </table>
-          </td>
-          <td>
-          untested
-          </td>
+          <td> passed </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="palegreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> almost passed (≥ 98%) </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="coral"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> failed </td>
+          <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
+          <td>
+            <table>
+              <tr>
+                <td bgcolor="white"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
+              </tr>
+            </table>
+          </td>
+          <td> untested </td>
         </tr>
       </table>
-      </td>
-    </tr>
-  </table>
-  <table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="2">
-    <tr>
-      <th>
-      Tests
-      </th>
-      <th>
-      Zorba 2.9.1
-      <br>
-      XQ30
-      <br>
-      (QT3 vCVS)
-      </th>
-    </tr>
-    <tr>
-      <td>
-      fn-abs
-      </td>
-      <td bgcolor="mediumseagreen">
-      183/183
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-adjust-date-to-timezone
-      </td>
-      <td bgcolor="mediumseagreen">
-      40/40
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-adjust-dateTime-to-timezone
-      </td>
-      <td bgcolor="mediumseagreen">
-      47/47
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-adjust-time-to-timezone
-      </td>
-      <td bgcolor="mediumseagreen">
-      41/41
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-analyze-string
-      </td>
-      <td bgcolor="mediumseagreen">
-      32/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-available-environment-variables
-      </td>
-      <td bgcolor="mediumseagreen">
-      11/11
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-avg
-      </td>
-      <td bgcolor="mediumseagreen">
-      237/237
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-base-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      82/82
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-boolean
-      </td>
-      <td bgcolor="mediumseagreen">
-      137/137
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-ceiling
-      </td>
-      <td bgcolor="mediumseagreen">
-      87/87
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-codepoint-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      36/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-codepoints-to-string
-      </td>
-      <td bgcolor="mediumseagreen">
-      76/76
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-collection
-      </td>
-      <td bgcolor="coral">
-      18/29
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-compare
-      </td>
-      <td bgcolor="palegreen">63/64
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-concat
-      </td>
-      <td bgcolor="mediumseagreen">
-      96/96
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-contains
-      </td>
-      <td bgcolor="mediumseagreen">
-      41/41
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-count
-      </td>
-      <td bgcolor="mediumseagreen">
-      316/316
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-current-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      26/26
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-current-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-current-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-data
-      </td>
-      <td bgcolor="mediumseagreen">
-      56/56
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      52/52
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-day-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-day-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-days-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-deep-equal
-      </td>
-      <td bgcolor="coral">
-      204/214
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-default-collation
-      </td>
-      <td bgcolor="mediumseagreen">
-      7/7
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-distinct-values
-      </td>
-      <td bgcolor="mediumseagreen">
-      104/104
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-doc
-      </td>
-      <td bgcolor="mediumseagreen">
-      43/43
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-doc-available
-      </td>
-      <td bgcolor="mediumseagreen">
-      13/13
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-document-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      53/53
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-element-with-id
-      </td>
-      <td bgcolor="mediumseagreen">
-      5/5
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-empty
-      </td>
-      <td bgcolor="mediumseagreen">
-      54/54
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-encode-for-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      29/29
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-ends-with
-      </td>
-      <td bgcolor="mediumseagreen">
-      38/38
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-environment-variable
-      </td>
-      <td bgcolor="mediumseagreen">
-      12/12
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-error
-      </td>
-      <td bgcolor="mediumseagreen">
-      97/97
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-escape-html-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-exactly-one
-      </td>
-      <td bgcolor="mediumseagreen">
-      54/54
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-exists
-      </td>
-      <td bgcolor="mediumseagreen">
-      58/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-false
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-filter
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-floor
-      </td>
-      <td bgcolor="mediumseagreen">
-      88/88
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-fold-left
-      </td>
-      <td bgcolor="coral">
-      19/20
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-fold-right
-      </td>
-      <td bgcolor="mediumseagreen">
-      20/20
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-format-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      89/89
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-format-dateTime
-      </td>
-      <td bgcolor="palegreen">76/77
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-format-integer
-      </td>
-      <td bgcolor="palegreen">59/60
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-format-number
-      </td>
-      <td bgcolor="coral">
-      62/71
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-format-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      37/37
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-function-lookup
-      </td>
-      <td bgcolor="palegreen">553/558
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-function-arity
-      </td>
-      <td bgcolor="mediumseagreen">
-      21/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-function-name
-      </td>
-      <td bgcolor="mediumseagreen">
-      23/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-generate-id
-      </td>
-      <td bgcolor="coral">
-      17/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-has-children
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-head
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-hours-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-hours-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-hours-from-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-id
-      </td>
-      <td bgcolor="coral">
-      39/41
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-idref
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-implicit-timezone
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-innermost
-      </td>
-      <td bgcolor="mediumseagreen">
-      50/50
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-index-of
-      </td>
-      <td bgcolor="mediumseagreen">
-      53/53
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-insert-before
-      </td>
-      <td bgcolor="mediumseagreen">
-      43/43
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-in-scope-prefixes
-      </td>
-      <td bgcolor="mediumseagreen">
-      58/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-iri-to-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      46/46
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-lang
-      </td>
-      <td bgcolor="mediumseagreen">
-      36/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-last
-      </td>
-      <td bgcolor="mediumseagreen">
-      65/65
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-local-name
-      </td>
-      <td bgcolor="mediumseagreen">
-      59/59
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-local-name-from-QName
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-lower-case
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-map
-      </td>
-      <td bgcolor="mediumseagreen">
-      11/11
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-max
-      </td>
-      <td bgcolor="mediumseagreen">
-      201/201
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-map-pairs
-      </td>
-      <td bgcolor="coral">
-      44/45
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-matches
-      </td>
-      <td bgcolor="palegreen">149/150
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-matches.re
-      </td>
-      <td bgcolor="mediumseagreen">
-      1001/1001
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-min
-      </td>
-      <td bgcolor="mediumseagreen">
-      200/200
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-minutes-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-minutes-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      32/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-minutes-from-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-month-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-months-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-month-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-name
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-namespace-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-namespace-uri-for-prefix
-      </td>
-      <td bgcolor="mediumseagreen">
-      29/29
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-namespace-uri-from-QName
-      </td>
-      <td bgcolor="mediumseagreen">
-      29/29
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-nilled
-      </td>
-      <td bgcolor="mediumseagreen">
-      63/63
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-node-name
-      </td>
-      <td bgcolor="mediumseagreen">
-      43/43
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-normalize-space
-      </td>
-      <td bgcolor="coral">
-      37/39
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-normalize-unicode
-      </td>
-      <td bgcolor="coral">
-      41/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-not
-      </td>
-      <td bgcolor="mediumseagreen">
-      83/83
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-number
-      </td>
-      <td bgcolor="mediumseagreen">
-      66/66
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-one-or-more
-      </td>
-      <td bgcolor="mediumseagreen">
-      56/56
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-outermost
-      </td>
-      <td bgcolor="mediumseagreen">
-      50/50
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-parse-json
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-parse-xml
-      </td>
-      <td bgcolor="coral">
-      12/14
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-parse-xml-fragment
-      </td>
-      <td bgcolor="coral">
-      20/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-path
-      </td>
-      <td bgcolor="mediumseagreen">
-      17/17
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-position
-      </td>
-      <td bgcolor="mediumseagreen">
-      66/66
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-prefix-from-QName
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-QName
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-remove
-      </td>
-      <td bgcolor="mediumseagreen">
-      48/48
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-replace
-      </td>
-      <td bgcolor="palegreen">72/73
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-resolve-QName
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-resolve-uri
-      </td>
-      <td bgcolor="coral">
-      37/39
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-reverse
-      </td>
-      <td bgcolor="mediumseagreen">
-      70/70
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-root
-      </td>
-      <td bgcolor="mediumseagreen">
-      36/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-round
-      </td>
-      <td bgcolor="mediumseagreen">
-      254/254
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-round-half-to-even
-      </td>
-      <td bgcolor="mediumseagreen">
-      128/128
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-seconds-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-seconds-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      32/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-seconds-from-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-serialize
-      </td>
-      <td bgcolor="coral">
-      11/13
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-serialize-json
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-starts-with
-      </td>
-      <td bgcolor="mediumseagreen">
-      39/39
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-static-base-uri
-      </td>
-      <td bgcolor="mediumseagreen">
-      18/18
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-string
-      </td>
-      <td bgcolor="mediumseagreen">
-      63/63
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-string-join
-      </td>
-      <td bgcolor="mediumseagreen">
-      39/39
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-string-length
-      </td>
-      <td bgcolor="coral">
-      34/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-string-to-codepoints
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-subsequence
-      </td>
-      <td bgcolor="mediumseagreen">
-      105/105
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-substring
-      </td>
-      <td bgcolor="mediumseagreen">
-      48/48
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-substring-after
-      </td>
-      <td bgcolor="coral">
-      36/37
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-substring-before
-      </td>
-      <td bgcolor="coral">
-      35/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-sum
-      </td>
-      <td bgcolor="mediumseagreen">
-      218/218
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-tail
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-timezone-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-timezone-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-timezone-from-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-tokenize
-      </td>
-      <td bgcolor="coral">
-      51/53
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-trace
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-translate
-      </td>
-      <td bgcolor="mediumseagreen">
-      42/42
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-true
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-unordered
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-unparsed-text
-      </td>
-      <td bgcolor="coral">
-      45/49
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-unparsed-text-available
-      </td>
-      <td bgcolor="coral">
-      43/48
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-unparsed-text-lines
-      </td>
-      <td bgcolor="coral">
-      42/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-upper-case
-      </td>
-      <td bgcolor="mediumseagreen">
-      24/24
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-uri-collection
-      </td>
-      <td bgcolor="mediumseagreen">
-      7/7
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-year-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-years-from-duration
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-year-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      fn-zero-or-one
-      </td>
-      <td bgcolor="mediumseagreen">
-      51/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-acos
-      </td>
-      <td bgcolor="coral">
-      8/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-asin
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-atan
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-atan2
-      </td>
-      <td bgcolor="mediumseagreen">
-      10/10
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-cos
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-exp
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-exp10
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-log
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-log10
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-pi
-      </td>
-      <td bgcolor="mediumseagreen">
-      5/5
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-pow
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-sin
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-sqrt
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      math-tan
-      </td>
-      <td bgcolor="mediumseagreen">
-      11/11
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-new
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-contains
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-get
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-entry
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-size
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-keys
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-remove
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      map-collation
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-anyURI
-      </td>
-      <td bgcolor="coral">
-      11/13
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-base64Binary
-      </td>
-      <td bgcolor="coral">
-      36/37
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-dateTimeStamp
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-double
-      </td>
-      <td bgcolor="mediumseagreen">
-      3/3
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-error
-      </td>
-      <td bgcolor="coral">
-      36/49
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-float
-      </td>
-      <td bgcolor="mediumseagreen">
-      5/5
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-hexBinary
-      </td>
-      <td bgcolor="mediumseagreen">
-      1/1
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-normalizedString
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      xs-token
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-dayTimeDurations
-      </td>
-      <td bgcolor="mediumseagreen">
-      61/61
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-dayTimeDuration-to-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-dayTimeDuration-to-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-dayTimeDuration-to-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      26/26
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-yearMonthDurations
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-yearMonthDuration-to-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-add-yearMonthDuration-to-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      29/29
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-anyURI-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      22/22
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-anyURI-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      10/10
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-anyURI-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-bang
-      </td>
-      <td bgcolor="mediumseagreen">
-      14/14
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-base64Binary-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      30/30
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-boolean-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      55/55
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-boolean-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      49/49
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-boolean-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      49/49
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-concat
-      </td>
-      <td bgcolor="mediumseagreen">
-      92/92
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-concatenate
-      </td>
-      <td bgcolor="mediumseagreen">
-      54/54
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-date-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      47/47
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-date-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      48/48
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-date-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      48/48
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-dateTime-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      71/71
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-dateTime-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-dateTime-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-dayTimeDuration-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      58/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-dayTimeDuration-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      46/46
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-divide-dayTimeDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      55/55
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-divide-dayTimeDuration-by-dayTimeDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-divide-yearMonthDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-divide-yearMonthDuration-by-yearMonthDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      23/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-duration-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      158/158
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-except
-      </td>
-      <td bgcolor="mediumseagreen">
-      71/71
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-gDay-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      51/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-gMonth-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      45/45
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-gMonthDay-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      51/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-gYear-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      46/46
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-gYearMonth-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      46/46
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-hexBinary-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      32/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-intersect
-      </td>
-      <td bgcolor="mediumseagreen">
-      71/71
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-is-same-node
-      </td>
-      <td bgcolor="mediumseagreen">
-      37/37
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-multiply-dayTimeDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      46/46
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-multiply-yearMonthDuration
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-node-after
-      </td>
-      <td bgcolor="mediumseagreen">
-      35/35
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-node-before
-      </td>
-      <td bgcolor="mediumseagreen">
-      35/35
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-NOTATION-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      22/22
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-add
-      </td>
-      <td bgcolor="mediumseagreen">
-      140/140
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      202/202
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-divide
-      </td>
-      <td bgcolor="mediumseagreen">
-      140/140
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      116/116
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-integer-divide
-      </td>
-      <td bgcolor="mediumseagreen">
-      136/136
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      183/183
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-mod
-      </td>
-      <td bgcolor="mediumseagreen">
-      124/124
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-multiply
-      </td>
-      <td bgcolor="mediumseagreen">
-      107/107
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-subtract
-      </td>
-      <td bgcolor="mediumseagreen">
-      119/119
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-unary-minus
-      </td>
-      <td bgcolor="mediumseagreen">
-      64/64
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-numeric-unary-plus
-      </td>
-      <td bgcolor="mediumseagreen">
-      55/55
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-QName-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      38/38
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-string-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      15/15
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-string-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-string-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      10/10
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dates
-      </td>
-      <td bgcolor="mediumseagreen">
-      30/30
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dateTimes
-      </td>
-      <td bgcolor="mediumseagreen">
-      30/30
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dayTimeDuration-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      23/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dayTimeDuration-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      22/22
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dayTimeDuration-from-time
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-dayTimeDurations
-      </td>
-      <td bgcolor="mediumseagreen">
-      69/69
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-times
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-yearMonthDuration-from-date
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-yearMonthDuration-from-dateTime
-      </td>
-      <td bgcolor="mediumseagreen">
-      23/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-subtract-yearMonthDurations
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-time-equal
-      </td>
-      <td bgcolor="mediumseagreen">
-      58/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-time-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-time-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-to
-      </td>
-      <td bgcolor="mediumseagreen">
-      72/72
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-union
-      </td>
-      <td bgcolor="mediumseagreen">
-      82/82
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-yearMonthDuration-greater-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      op-yearMonthDuration-less-than
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AllowingEmpty
-      </td>
-      <td bgcolor="mediumseagreen">
-      18/18
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-Annotation
-      </td>
-      <td bgcolor="coral">
-      37/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep
-      </td>
-      <td bgcolor="mediumseagreen">
-      332/332
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.abbr
-      </td>
-      <td bgcolor="mediumseagreen">
-      23/23
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.ancestor
-      </td>
-      <td bgcolor="mediumseagreen">
-      43/43
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.ancestor-or-self
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.following
-      </td>
-      <td bgcolor="mediumseagreen">
-      25/25
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.following-sibling
-      </td>
-      <td bgcolor="mediumseagreen">
-      33/33
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.preceding
-      </td>
-      <td bgcolor="mediumseagreen">
-      31/31
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.preceding-sibling
-      </td>
-      <td bgcolor="mediumseagreen">
-      28/28
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.static-typing
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-AxisStep.unabbr
-      </td>
-      <td bgcolor="mediumseagreen">
-      26/26
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-BaseURIDecl
-      </td>
-      <td bgcolor="coral">
-      37/38
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-BoundarySpaceDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      28/28
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CastableExpr
-      </td>
-      <td bgcolor="palegreen">800/801
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CastExpr
-      </td>
-      <td bgcolor="palegreen">2742/2744
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CastExpr.derived
-      </td>
-      <td bgcolor="palegreen">154/155
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CastExpr.schema
-      </td>
-      <td bgcolor="coral">
-      113/126
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-Comment
-      </td>
-      <td bgcolor="mediumseagreen">
-      45/45
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompAttrConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      109/109
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompDocConstructor
-      </td>
-      <td bgcolor="palegreen">57/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompCommentConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      28/28
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompElemConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      72/72
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompNamespaceConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      41/41
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompPIConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      54/54
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CompTextConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      35/35
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ConstructionDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      26/26
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ConstructionDecl.schema
-      </td>
-      <td bgcolor="mediumseagreen">
-      4/4
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ContextItemDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      38/38
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ContextItemExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      45/45
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CopyNamespacesDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      36/36
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-CountClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      10/10
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DecimalFormatDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      30/30
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DefaultCollationDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DefaultNamespaceDecl
-      </td>
-      <td bgcolor="coral">
-      57/59
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirAttributeList
-      </td>
-      <td bgcolor="mediumseagreen">
-      124/124
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirectConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      91/91
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirElemConstructor
-      </td>
-      <td bgcolor="mediumseagreen">
-      67/67
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirElemContent
-      </td>
-      <td bgcolor="palegreen">126/127
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirElemContent.namespace
-      </td>
-      <td bgcolor="palegreen">131/132
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-DirElemContent.whitespace
-      </td>
-      <td bgcolor="mediumseagreen">
-      83/83
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-EmptyOrderDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      32/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-EQName
-      </td>
-      <td bgcolor="coral">
-      20/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ExtensionExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      51/51
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-FLWORExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      21/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-FLWORExpr.static-typing
-      </td>
-      <td bgcolor="white">0/0
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ForClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      188/188
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-FunctionCall
-      </td>
-      <td bgcolor="coral">
-      86/95
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-FunctionDecl
-      </td>
-      <td bgcolor="palegreen">151/152
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.eq
-      </td>
-      <td bgcolor="mediumseagreen">
-      172/172
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.ge
-      </td>
-      <td bgcolor="mediumseagreen">
-      110/110
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.gt
-      </td>
-      <td bgcolor="mediumseagreen">
-      118/118
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.le
-      </td>
-      <td bgcolor="mediumseagreen">
-      108/108
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.lt
-      </td>
-      <td bgcolor="mediumseagreen">
-      127/127
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GeneralComp.ne
-      </td>
-      <td bgcolor="mediumseagreen">
-      140/140
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-GroupByClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      28/28
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-IfExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      42/42
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-InstanceofExpr
-      </td>
-      <td bgcolor="palegreen">304/308
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-LetClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      81/81
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-Literal
-      </td>
-      <td bgcolor="palegreen">163/166
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ModuleImport
-      </td>
-      <td bgcolor="coral">
-      99/107
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-NamedFunctionRef
-      </td>
-      <td bgcolor="palegreen">537/542
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-NamespaceDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-NameTest
-      </td>
-      <td bgcolor="mediumseagreen">
-      122/122
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-NodeTest
-      </td>
-      <td bgcolor="mediumseagreen">
-      67/67
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-OptionDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-OptionDecl.serialization
-      </td>
-      <td bgcolor="coral">
-      25/32
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-OrExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      371/371
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-OrderByClause
-      </td>
-      <td bgcolor="coral">
-      198/204
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-OrderingModeDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      27/27
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-PathExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      17/17
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ParenthesizedExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      20/20
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-PositionalVar
-      </td>
-      <td bgcolor="mediumseagreen">
-      34/34
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-Predicate
-      </td>
-      <td bgcolor="mediumseagreen">
-      190/190
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-QuantifiedExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      200/200
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-RequireProhibitFeature
-      </td>
-      <td bgcolor="mediumseagreen">
-      59/59
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ReturnClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      21/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-SchemaImport
-      </td>
-      <td bgcolor="coral">
-      103/134
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-SequenceType
-      </td>
-      <td bgcolor="mediumseagreen">
-      21/21
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-StepExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      58/58
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-SwitchExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      22/22
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-TreatExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      69/69
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-TryCatchExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      167/167
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-TypeswitchExpr
-      </td>
-      <td bgcolor="palegreen">68/69
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-UnorderedExpr
-      </td>
-      <td bgcolor="mediumseagreen">
-      26/26
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ValidateExpr
-      </td>
-      <td bgcolor="coral">
-      76/83
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-ValueComp
-      </td>
-      <td bgcolor="mediumseagreen">
-      44/44
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-VarDecl
-      </td>
-      <td bgcolor="mediumseagreen">
-      125/125
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-VarDecl.external
-      </td>
-      <td bgcolor="palegreen">94/95
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-VarDefaultValue
-      </td>
-      <td bgcolor="mediumseagreen">
-      37/37
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-VersionDecl
-      </td>
-      <td bgcolor="coral">
-      27/28
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-WhereClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      79/79
-      </td>
-    </tr>
-    <tr>
-      <td>
-      prod-WindowClause
-      </td>
-      <td bgcolor="mediumseagreen">
-      117/117
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-CombinedErrorCodes
-      </td>
-      <td bgcolor="palegreen">243/244
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-AnnexE
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-AppendixA4
-      </td>
-      <td bgcolor="mediumseagreen">
-      9/9
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-ErrorsAndOptimization
-      </td>
-      <td bgcolor="mediumseagreen">
-      7/7
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-HigherOrderFunctions
-      </td>
-      <td bgcolor="palegreen">125/126
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-MiscFunctions
-      </td>
-      <td bgcolor="mediumseagreen">
-      38/38
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-StaticContext
-      </td>
-      <td bgcolor="mediumseagreen">
-      1/1
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-Serialization
-      </td>
-      <td bgcolor="coral">
-      4/12
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-Surrogates
-      </td>
-      <td bgcolor="mediumseagreen">
-      17/17
-      </td>
-    </tr>
-    <tr>
-      <td>
-      misc-XMLEdition
-      </td>
-      <td bgcolor="coral">
-      9/10
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-CatalogCheck
-      </td>
-      <td bgcolor="mediumseagreen">
-      12/12
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-Demos
-      </td>
-      <td bgcolor="mediumseagreen">
-      4/4
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-FunctxFn
-      </td>
-      <td bgcolor="mediumseagreen">
-      500/500
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-FunctxFunctx
-      </td>
-      <td bgcolor="mediumseagreen">
-      627/627
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseNS
-      </td>
-      <td bgcolor="mediumseagreen">
-      8/8
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCasePARTS
-      </td>
-      <td bgcolor="mediumseagreen">
-      1/1
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseR
-      </td>
-      <td bgcolor="mediumseagreen">
-      18/18
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseSEQ
-      </td>
-      <td bgcolor="mediumseagreen">
-      5/5
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseSGML
-      </td>
-      <td bgcolor="mediumseagreen">
-      11/11
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseSTRING
-      </td>
-      <td bgcolor="mediumseagreen">
-      4/4
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseTREE
-      </td>
-      <td bgcolor="mediumseagreen">
-      6/6
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-UseCaseXMP
-      </td>
-      <td bgcolor="mediumseagreen">
-      12/12
-      </td>
-    </tr>
-    <tr>
-      <td>
-      app-XMark
-      </td>
-      <td bgcolor="mediumseagreen">
-      21/21
-      </td>
-    </tr>
-</table>
+    </td>
+  </tr>
+</table>
+\endhtmlonly
+
+\htmlonly
+<table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="2">
+  <tr>
+    <th> Tests </th>
+    <th> Zorba 2.9.1 XQ30 (QT3 vCVS) </th>
+  </tr>
+  <tr>
+    <td> fn-abs </td>
+    <td bgcolor="mediumseagreen"> 183/183 </td>
+  </tr>
+  <tr>
+    <td> fn-adjust-date-to-timezone </td>
+    <td bgcolor="mediumseagreen"> 40/40 </td>
+  </tr>
+  <tr>
+    <td> fn-adjust-dateTime-to-timezone </td>
+    <td bgcolor="mediumseagreen"> 47/47 </td>
+  </tr>
+  <tr>
+    <td> fn-adjust-time-to-timezone </td>
+    <td bgcolor="mediumseagreen"> 41/41 </td>
+  </tr>
+  <tr>
+    <td> fn-analyze-string </td>
+    <td bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td> fn-available-environment-variables </td>
+    <td bgcolor="mediumseagreen"> 11/11 </td>
+  </tr>
+  <tr>
+    <td> fn-avg </td>
+    <td bgcolor="mediumseagreen"> 237/237 </td>
+  </tr>
+  <tr>
+    <td> fn-base-uri </td>
+    <td bgcolor="mediumseagreen"> 82/82 </td>
+  </tr>
+  <tr>
+    <td> fn-boolean </td>
+    <td bgcolor="mediumseagreen"> 137/137 </td>
+  </tr>
+  <tr>
+    <td> fn-ceiling </td>
+    <td bgcolor="mediumseagreen"> 87/87 </td>
+  </tr>
+  <tr>
+    <td> fn-codepoint-equal </td>
+    <td bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td> fn-codepoints-to-string </td>
+    <td bgcolor="mediumseagreen"> 76/76 </td>
+  </tr>
+  <tr>
+    <td> fn-collection </td>
+    <td bgcolor="coral"> 18/29 </td>
+  </tr>
+  <tr>
+    <td> fn-compare </td>
+    <td bgcolor="palegreen">63/64 </td>
+  </tr>
+  <tr>
+    <td> fn-concat </td>
+    <td bgcolor="mediumseagreen"> 96/96 </td>
+  </tr>
+  <tr>
+    <td> fn-contains </td>
+    <td bgcolor="mediumseagreen"> 41/41 </td>
+  </tr>
+  <tr>
+    <td> fn-count </td>
+    <td bgcolor="mediumseagreen"> 316/316 </td>
+  </tr>
+  <tr>
+    <td> fn-current-date </td>
+    <td bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td> fn-current-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-current-time </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-data </td>
+    <td bgcolor="mediumseagreen"> 56/56 </td>
+  </tr>
+  <tr>
+    <td> fn-dateTime </td>
+    <td bgcolor="mediumseagreen"> 52/52 </td>
+  </tr>
+  <tr>
+    <td> fn-day-from-date </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-day-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-days-from-duration </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> fn-deep-equal </td>
+    <td bgcolor="coral"> 204/214 </td>
+  </tr>
+  <tr>
+    <td> fn-default-collation </td>
+    <td bgcolor="mediumseagreen"> 7/7 </td>
+  </tr>
+  <tr>
+    <td> fn-distinct-values </td>
+    <td bgcolor="mediumseagreen"> 104/104 </td>
+  </tr>
+  <tr>
+    <td> fn-doc </td>
+    <td bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td> fn-doc-available </td>
+    <td bgcolor="mediumseagreen"> 13/13 </td>
+  </tr>
+  <tr>
+    <td> fn-document-uri </td>
+    <td bgcolor="mediumseagreen"> 53/53 </td>
+  </tr>
+  <tr>
+    <td> fn-element-with-id </td>
+    <td bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td> fn-empty </td>
+    <td bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td> fn-encode-for-uri </td>
+    <td bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td> fn-ends-with </td>
+    <td bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td> fn-environment-variable </td>
+    <td bgcolor="mediumseagreen"> 12/12 </td>
+  </tr>
+  <tr>
+    <td> fn-error </td>
+    <td bgcolor="mediumseagreen"> 97/97 </td>
+  </tr>
+  <tr>
+    <td> fn-escape-html-uri </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> fn-exactly-one </td>
+    <td bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td> fn-exists </td>
+    <td bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td> fn-false </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> fn-filter </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-floor </td>
+    <td bgcolor="mediumseagreen"> 88/88 </td>
+  </tr>
+  <tr>
+    <td> fn-fold-left </td>
+    <td bgcolor="coral"> 19/20 </td>
+  </tr>
+  <tr>
+    <td> fn-fold-right </td>
+    <td bgcolor="mediumseagreen"> 20/20 </td>
+  </tr>
+  <tr>
+    <td> fn-format-date </td>
+    <td bgcolor="mediumseagreen"> 89/89 </td>
+  </tr>
+  <tr>
+    <td> fn-format-dateTime </td>
+    <td bgcolor="palegreen">76/77 </td>
+  </tr>
+  <tr>
+    <td> fn-format-integer </td>
+    <td bgcolor="palegreen">59/60 </td>
+  </tr>
+  <tr>
+    <td> fn-format-number </td>
+    <td bgcolor="coral"> 62/71 </td>
+  </tr>
+  <tr>
+    <td> fn-format-time </td>
+    <td bgcolor="mediumseagreen"> 37/37 </td>
+  </tr>
+  <tr>
+    <td> fn-function-lookup </td>
+    <td bgcolor="palegreen">553/558 </td>
+  </tr>
+  <tr>
+    <td> fn-function-arity </td>
+    <td bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td> fn-function-name </td>
+    <td bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td> fn-generate-id </td>
+    <td bgcolor="coral"> 17/21 </td>
+  </tr>
+  <tr>
+    <td> fn-has-children </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> fn-head </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> fn-hours-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-hours-from-duration </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> fn-hours-from-time </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-id </td>
+    <td bgcolor="coral"> 39/41 </td>
+  </tr>
+  <tr>
+    <td> fn-idref </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> fn-implicit-timezone </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-innermost </td>
+    <td bgcolor="mediumseagreen"> 50/50 </td>
+  </tr>
+  <tr>
+    <td> fn-index-of </td>
+    <td bgcolor="mediumseagreen"> 53/53 </td>
+  </tr>
+  <tr>
+    <td> fn-insert-before </td>
+    <td bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td> fn-in-scope-prefixes </td>
+    <td bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td> fn-iri-to-uri </td>
+    <td bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td> fn-lang </td>
+    <td bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td> fn-last </td>
+    <td bgcolor="mediumseagreen"> 65/65 </td>
+  </tr>
+  <tr>
+    <td> fn-local-name </td>
+    <td bgcolor="mediumseagreen"> 59/59 </td>
+  </tr>
+  <tr>
+    <td> fn-local-name-from-QName </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-lower-case </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-map </td>
+    <td bgcolor="mediumseagreen"> 11/11 </td>
+  </tr>
+  <tr>
+    <td> fn-max </td>
+    <td bgcolor="mediumseagreen"> 201/201 </td>
+  </tr>
+  <tr>
+    <td> fn-map-pairs </td>
+    <td bgcolor="coral"> 44/45 </td>
+  </tr>
+  <tr>
+    <td> fn-matches </td>
+    <td bgcolor="palegreen">149/150 </td>
+  </tr>
+  <tr>
+    <td> fn-matches.re </td>
+    <td bgcolor="mediumseagreen"> 1001/1001 </td>
+  </tr>
+  <tr>
+    <td> fn-min </td>
+    <td bgcolor="mediumseagreen"> 200/200 </td>
+  </tr>
+  <tr>
+    <td> fn-minutes-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-minutes-from-duration </td>
+    <td bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td> fn-minutes-from-time </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-month-from-date </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-months-from-duration </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> fn-month-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-name </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> fn-namespace-uri </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> fn-namespace-uri-for-prefix </td>
+    <td bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td> fn-namespace-uri-from-QName </td>
+    <td bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td> fn-nilled </td>
+    <td bgcolor="mediumseagreen"> 63/63 </td>
+  </tr>
+  <tr>
+    <td> fn-node-name </td>
+    <td bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td> fn-normalize-space </td>
+    <td bgcolor="coral"> 37/39 </td>
+  </tr>
+  <tr>
+    <td> fn-normalize-unicode </td>
+    <td bgcolor="coral"> 41/44 </td>
+  </tr>
+  <tr>
+    <td> fn-not </td>
+    <td bgcolor="mediumseagreen"> 83/83 </td>
+  </tr>
+  <tr>
+    <td> fn-number </td>
+    <td bgcolor="mediumseagreen"> 66/66 </td>
+  </tr>
+  <tr>
+    <td> fn-one-or-more </td>
+    <td bgcolor="mediumseagreen"> 56/56 </td>
+  </tr>
+  <tr>
+    <td> fn-outermost </td>
+    <td bgcolor="mediumseagreen"> 50/50 </td>
+  </tr>
+  <tr>
+    <td> fn-parse-json </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> fn-parse-xml </td>
+    <td bgcolor="coral"> 12/14 </td>
+  </tr>
+  <tr>
+    <td> fn-parse-xml-fragment </td>
+    <td bgcolor="coral"> 20/23 </td>
+  </tr>
+  <tr>
+    <td> fn-path </td>
+    <td bgcolor="mediumseagreen"> 17/17 </td>
+  </tr>
+  <tr>
+    <td> fn-position </td>
+    <td bgcolor="mediumseagreen"> 66/66 </td>
+  </tr>
+  <tr>
+    <td> fn-prefix-from-QName </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-QName </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> fn-remove </td>
+    <td bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td> fn-replace </td>
+    <td bgcolor="palegreen">72/73 </td>
+  </tr>
+  <tr>
+    <td> fn-resolve-QName </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-resolve-uri </td>
+    <td bgcolor="coral"> 37/39 </td>
+  </tr>
+  <tr>
+    <td> fn-reverse </td>
+    <td bgcolor="mediumseagreen"> 70/70 </td>
+  </tr>
+  <tr>
+    <td> fn-root </td>
+    <td bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td> fn-round </td>
+    <td bgcolor="mediumseagreen"> 254/254 </td>
+  </tr>
+  <tr>
+    <td> fn-round-half-to-even </td>
+    <td bgcolor="mediumseagreen"> 128/128 </td>
+  </tr>
+  <tr>
+    <td> fn-seconds-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-seconds-from-duration </td>
+    <td bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td> fn-seconds-from-time </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-serialize </td>
+    <td bgcolor="coral"> 11/13 </td>
+  </tr>
+  <tr>
+    <td> fn-serialize-json </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> fn-starts-with </td>
+    <td bgcolor="mediumseagreen"> 39/39 </td>
+  </tr>
+  <tr>
+    <td> fn-static-base-uri </td>
+    <td bgcolor="mediumseagreen"> 18/18 </td>
+  </tr>
+  <tr>
+    <td> fn-string </td>
+    <td bgcolor="mediumseagreen"> 63/63 </td>
+  </tr>
+  <tr>
+    <td> fn-string-join </td>
+    <td bgcolor="mediumseagreen"> 39/39 </td>
+  </tr>
+  <tr>
+    <td> fn-string-length </td>
+    <td bgcolor="coral"> 34/36 </td>
+  </tr>
+  <tr>
+    <td> fn-string-to-codepoints </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> fn-subsequence </td>
+    <td bgcolor="mediumseagreen"> 105/105 </td>
+  </tr>
+  <tr>
+    <td> fn-substring </td>
+    <td bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td> fn-substring-after </td>
+    <td bgcolor="coral"> 36/37 </td>
+  </tr>
+  <tr>
+    <td> fn-substring-before </td>
+    <td bgcolor="coral"> 35/36 </td>
+  </tr>
+  <tr>
+    <td> fn-sum </td>
+    <td bgcolor="mediumseagreen"> 218/218 </td>
+  </tr>
+  <tr>
+    <td> fn-tail </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> fn-timezone-from-date </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> fn-timezone-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-timezone-from-time </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-tokenize </td>
+    <td bgcolor="coral"> 51/53 </td>
+  </tr>
+  <tr>
+    <td> fn-trace </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-translate </td>
+    <td bgcolor="mediumseagreen"> 42/42 </td>
+  </tr>
+  <tr>
+    <td> fn-true </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> fn-unordered </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> fn-unparsed-text </td>
+    <td bgcolor="coral"> 45/49 </td>
+  </tr>
+  <tr>
+    <td> fn-unparsed-text-available </td>
+    <td bgcolor="coral"> 43/48 </td>
+  </tr>
+  <tr>
+    <td> fn-unparsed-text-lines </td>
+    <td bgcolor="coral"> 42/51 </td>
+  </tr>
+  <tr>
+    <td> fn-upper-case </td>
+    <td bgcolor="mediumseagreen"> 24/24 </td>
+  </tr>
+  <tr>
+    <td> fn-uri-collection </td>
+    <td bgcolor="mediumseagreen"> 7/7 </td>
+  </tr>
+  <tr>
+    <td> fn-year-from-date </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-years-from-duration </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> fn-year-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> fn-zero-or-one </td>
+    <td bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td> math-acos </td>
+    <td bgcolor="coral"> 8/9 </td>
+  </tr>
+  <tr>
+    <td> math-asin </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-atan </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-atan2 </td>
+    <td bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td> math-cos </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-exp </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-exp10 </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> math-log </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-log10 </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-pi </td>
+    <td bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td> math-pow </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> math-sin </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-sqrt </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> math-tan </td>
+    <td bgcolor="mediumseagreen"> 11/11 </td>
+  </tr>
+  <tr>
+    <td> map-new </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-contains </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-get </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-entry </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-size </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-keys </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-remove </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> map-collation </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> xs-anyURI </td>
+    <td bgcolor="coral"> 11/13 </td>
+  </tr>
+  <tr>
+    <td> xs-base64Binary </td>
+    <td bgcolor="coral"> 36/37 </td>
+  </tr>
+  <tr>
+    <td> xs-dateTimeStamp </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> xs-double </td>
+    <td bgcolor="mediumseagreen"> 3/3 </td>
+  </tr>
+  <tr>
+    <td> xs-error </td>
+    <td bgcolor="coral"> 36/49 </td>
+  </tr>
+  <tr>
+    <td> xs-float </td>
+    <td bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td> xs-hexBinary </td>
+    <td bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td> xs-normalizedString </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> xs-token </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> op-add-dayTimeDurations </td>
+    <td bgcolor="mediumseagreen"> 61/61 </td>
+  </tr>
+  <tr>
+    <td> op-add-dayTimeDuration-to-date </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> op-add-dayTimeDuration-to-dateTime </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> op-add-dayTimeDuration-to-time </td>
+    <td bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td> op-add-yearMonthDurations </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> op-add-yearMonthDuration-to-date </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> op-add-yearMonthDuration-to-dateTime </td>
+    <td bgcolor="mediumseagreen"> 29/29 </td>
+  </tr>
+  <tr>
+    <td> op-anyURI-equal </td>
+    <td bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td> op-anyURI-greater-than </td>
+    <td bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td> op-anyURI-less-than </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> op-bang </td>
+    <td bgcolor="mediumseagreen"> 14/14 </td>
+  </tr>
+  <tr>
+    <td> op-base64Binary-equal </td>
+    <td bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td> op-boolean-equal </td>
+    <td bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td> op-boolean-greater-than </td>
+    <td bgcolor="mediumseagreen"> 49/49 </td>
+  </tr>
+  <tr>
+    <td> op-boolean-less-than </td>
+    <td bgcolor="mediumseagreen"> 49/49 </td>
+  </tr>
+  <tr>
+    <td> op-concat </td>
+    <td bgcolor="mediumseagreen"> 92/92 </td>
+  </tr>
+  <tr>
+    <td> op-concatenate </td>
+    <td bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td> op-date-equal </td>
+    <td bgcolor="mediumseagreen"> 47/47 </td>
+  </tr>
+  <tr>
+    <td> op-date-greater-than </td>
+    <td bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td> op-date-less-than </td>
+    <td bgcolor="mediumseagreen"> 48/48 </td>
+  </tr>
+  <tr>
+    <td> op-dateTime-equal </td>
+    <td bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td> op-dateTime-greater-than </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> op-dateTime-less-than </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> op-dayTimeDuration-greater-than </td>
+    <td bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td> op-dayTimeDuration-less-than </td>
+    <td bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td> op-divide-dayTimeDuration </td>
+    <td bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td> op-divide-dayTimeDuration-by-dayTimeDuration </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> op-divide-yearMonthDuration </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> op-divide-yearMonthDuration-by-yearMonthDuration </td>
+    <td bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td> op-duration-equal </td>
+    <td bgcolor="mediumseagreen"> 158/158 </td>
+  </tr>
+  <tr>
+    <td> op-except </td>
+    <td bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td> op-gDay-equal </td>
+    <td bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td> op-gMonth-equal </td>
+    <td bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td> op-gMonthDay-equal </td>
+    <td bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td> op-gYear-equal </td>
+    <td bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td> op-gYearMonth-equal </td>
+    <td bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td> op-hexBinary-equal </td>
+    <td bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td> op-intersect </td>
+    <td bgcolor="mediumseagreen"> 71/71 </td>
+  </tr>
+  <tr>
+    <td> op-is-same-node </td>
+    <td bgcolor="mediumseagreen"> 37/37 </td>
+  </tr>
+  <tr>
+    <td> op-multiply-dayTimeDuration </td>
+    <td bgcolor="mediumseagreen"> 46/46 </td>
+  </tr>
+  <tr>
+    <td> op-multiply-yearMonthDuration </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> op-node-after </td>
+    <td bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td> op-node-before </td>
+    <td bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td> op-NOTATION-equal </td>
+    <td bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-add </td>
+    <td bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-equal </td>
+    <td bgcolor="mediumseagreen"> 202/202 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-divide </td>
+    <td bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-greater-than </td>
+    <td bgcolor="mediumseagreen"> 116/116 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-integer-divide </td>
+    <td bgcolor="mediumseagreen"> 136/136 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-less-than </td>
+    <td bgcolor="mediumseagreen"> 183/183 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-mod </td>
+    <td bgcolor="mediumseagreen"> 124/124 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-multiply </td>
+    <td bgcolor="mediumseagreen"> 107/107 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-subtract </td>
+    <td bgcolor="mediumseagreen"> 119/119 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-unary-minus </td>
+    <td bgcolor="mediumseagreen"> 64/64 </td>
+  </tr>
+  <tr>
+    <td> op-numeric-unary-plus </td>
+    <td bgcolor="mediumseagreen"> 55/55 </td>
+  </tr>
+  <tr>
+    <td> op-QName-equal </td>
+    <td bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td> op-string-equal </td>
+    <td bgcolor="mediumseagreen"> 15/15 </td>
+  </tr>
+  <tr>
+    <td> op-string-greater-than </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> op-string-less-than </td>
+    <td bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dates </td>
+    <td bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dateTimes </td>
+    <td bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dayTimeDuration-from-date </td>
+    <td bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dayTimeDuration-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dayTimeDuration-from-time </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-dayTimeDurations </td>
+    <td bgcolor="mediumseagreen"> 69/69 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-times </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-yearMonthDuration-from-date </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-yearMonthDuration-from-dateTime </td>
+    <td bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td> op-subtract-yearMonthDurations </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> op-time-equal </td>
+    <td bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td> op-time-greater-than </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> op-time-less-than </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> op-to </td>
+    <td bgcolor="mediumseagreen"> 72/72 </td>
+  </tr>
+  <tr>
+    <td> op-union </td>
+    <td bgcolor="mediumseagreen"> 82/82 </td>
+  </tr>
+  <tr>
+    <td> op-yearMonthDuration-greater-than </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> op-yearMonthDuration-less-than </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> prod-AllowingEmpty </td>
+    <td bgcolor="mediumseagreen"> 18/18 </td>
+  </tr>
+  <tr>
+    <td> prod-Annotation </td>
+    <td bgcolor="coral"> 37/51 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep </td>
+    <td bgcolor="mediumseagreen"> 332/332 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.abbr </td>
+    <td bgcolor="mediumseagreen"> 23/23 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.ancestor </td>
+    <td bgcolor="mediumseagreen"> 43/43 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.ancestor-or-self </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.following </td>
+    <td bgcolor="mediumseagreen"> 25/25 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.following-sibling </td>
+    <td bgcolor="mediumseagreen"> 33/33 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.preceding </td>
+    <td bgcolor="mediumseagreen"> 31/31 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.preceding-sibling </td>
+    <td bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.static-typing </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> prod-AxisStep.unabbr </td>
+    <td bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td> prod-BaseURIDecl </td>
+    <td bgcolor="coral"> 37/38 </td>
+  </tr>
+  <tr>
+    <td> prod-BoundarySpaceDecl </td>
+    <td bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td> prod-CastableExpr </td>
+    <td bgcolor="palegreen">800/801 </td>
+  </tr>
+  <tr>
+    <td> prod-CastExpr </td>
+    <td bgcolor="palegreen">2742/2744 </td>
+  </tr>
+  <tr>
+    <td> prod-CastExpr.derived </td>
+    <td bgcolor="palegreen">154/155 </td>
+  </tr>
+  <tr>
+    <td> prod-CastExpr.schema </td>
+    <td bgcolor="coral"> 113/126 </td>
+  </tr>
+  <tr>
+    <td> prod-Comment </td>
+    <td bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td> prod-CompAttrConstructor </td>
+    <td bgcolor="mediumseagreen"> 109/109 </td>
+  </tr>
+  <tr>
+    <td> prod-CompDocConstructor </td>
+    <td bgcolor="palegreen">57/58 </td>
+  </tr>
+  <tr>
+    <td> prod-CompCommentConstructor </td>
+    <td bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td> prod-CompElemConstructor </td>
+    <td bgcolor="mediumseagreen"> 72/72 </td>
+  </tr>
+  <tr>
+    <td> prod-CompNamespaceConstructor </td>
+    <td bgcolor="mediumseagreen"> 41/41 </td>
+  </tr>
+  <tr>
+    <td> prod-CompPIConstructor </td>
+    <td bgcolor="mediumseagreen"> 54/54 </td>
+  </tr>
+  <tr>
+    <td> prod-CompTextConstructor </td>
+    <td bgcolor="mediumseagreen"> 35/35 </td>
+  </tr>
+  <tr>
+    <td> prod-ConstructionDecl </td>
+    <td bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td> prod-ConstructionDecl.schema </td>
+    <td bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td> prod-ContextItemDecl </td>
+    <td bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td> prod-ContextItemExpr </td>
+    <td bgcolor="mediumseagreen"> 45/45 </td>
+  </tr>
+  <tr>
+    <td> prod-CopyNamespacesDecl </td>
+    <td bgcolor="mediumseagreen"> 36/36 </td>
+  </tr>
+  <tr>
+    <td> prod-CountClause </td>
+    <td bgcolor="mediumseagreen"> 10/10 </td>
+  </tr>
+  <tr>
+    <td> prod-DecimalFormatDecl </td>
+    <td bgcolor="mediumseagreen"> 30/30 </td>
+  </tr>
+  <tr>
+    <td> prod-DefaultCollationDecl </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> prod-DefaultNamespaceDecl </td>
+    <td bgcolor="coral"> 57/59 </td>
+  </tr>
+  <tr>
+    <td> prod-DirAttributeList </td>
+    <td bgcolor="mediumseagreen"> 124/124 </td>
+  </tr>
+  <tr>
+    <td> prod-DirectConstructor </td>
+    <td bgcolor="mediumseagreen"> 91/91 </td>
+  </tr>
+  <tr>
+    <td> prod-DirElemConstructor </td>
+    <td bgcolor="mediumseagreen"> 67/67 </td>
+  </tr>
+  <tr>
+    <td> prod-DirElemContent </td>
+    <td bgcolor="palegreen">126/127 </td>
+  </tr>
+  <tr>
+    <td> prod-DirElemContent.namespace </td>
+    <td bgcolor="palegreen">131/132 </td>
+  </tr>
+  <tr>
+    <td> prod-DirElemContent.whitespace </td>
+    <td bgcolor="mediumseagreen"> 83/83 </td>
+  </tr>
+  <tr>
+    <td> prod-EmptyOrderDecl </td>
+    <td bgcolor="mediumseagreen"> 32/32 </td>
+  </tr>
+  <tr>
+    <td> prod-EQName </td>
+    <td bgcolor="coral"> 20/21 </td>
+  </tr>
+  <tr>
+    <td> prod-ExtensionExpr </td>
+    <td bgcolor="mediumseagreen"> 51/51 </td>
+  </tr>
+  <tr>
+    <td> prod-FLWORExpr </td>
+    <td bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td> prod-FLWORExpr.static-typing </td>
+    <td bgcolor="white">0/0 </td>
+  </tr>
+  <tr>
+    <td> prod-ForClause </td>
+    <td bgcolor="mediumseagreen"> 188/188 </td>
+  </tr>
+  <tr>
+    <td> prod-FunctionCall </td>
+    <td bgcolor="coral"> 86/95 </td>
+  </tr>
+  <tr>
+    <td> prod-FunctionDecl </td>
+    <td bgcolor="palegreen">151/152 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.eq </td>
+    <td bgcolor="mediumseagreen"> 172/172 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.ge </td>
+    <td bgcolor="mediumseagreen"> 110/110 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.gt </td>
+    <td bgcolor="mediumseagreen"> 118/118 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.le </td>
+    <td bgcolor="mediumseagreen"> 108/108 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.lt </td>
+    <td bgcolor="mediumseagreen"> 127/127 </td>
+  </tr>
+  <tr>
+    <td> prod-GeneralComp.ne </td>
+    <td bgcolor="mediumseagreen"> 140/140 </td>
+  </tr>
+  <tr>
+    <td> prod-GroupByClause </td>
+    <td bgcolor="mediumseagreen"> 28/28 </td>
+  </tr>
+  <tr>
+    <td> prod-IfExpr </td>
+    <td bgcolor="mediumseagreen"> 42/42 </td>
+  </tr>
+  <tr>
+    <td> prod-InstanceofExpr </td>
+    <td bgcolor="palegreen">304/308 </td>
+  </tr>
+  <tr>
+    <td> prod-LetClause </td>
+    <td bgcolor="mediumseagreen"> 81/81 </td>
+  </tr>
+  <tr>
+    <td> prod-Literal </td>
+    <td bgcolor="palegreen">163/166 </td>
+  </tr>
+  <tr>
+    <td> prod-ModuleImport </td>
+    <td bgcolor="coral"> 99/107 </td>
+  </tr>
+  <tr>
+    <td> prod-NamedFunctionRef </td>
+    <td bgcolor="palegreen">537/542 </td>
+  </tr>
+  <tr>
+    <td> prod-NamespaceDecl </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> prod-NameTest </td>
+    <td bgcolor="mediumseagreen"> 122/122 </td>
+  </tr>
+  <tr>
+    <td> prod-NodeTest </td>
+    <td bgcolor="mediumseagreen"> 67/67 </td>
+  </tr>
+  <tr>
+    <td> prod-OptionDecl </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> prod-OptionDecl.serialization </td>
+    <td bgcolor="coral"> 25/32 </td>
+  </tr>
+  <tr>
+    <td> prod-OrExpr </td>
+    <td bgcolor="mediumseagreen"> 371/371 </td>
+  </tr>
+  <tr>
+    <td> prod-OrderByClause </td>
+    <td bgcolor="coral"> 198/204 </td>
+  </tr>
+  <tr>
+    <td> prod-OrderingModeDecl </td>
+    <td bgcolor="mediumseagreen"> 27/27 </td>
+  </tr>
+  <tr>
+    <td> prod-PathExpr </td>
+    <td bgcolor="mediumseagreen"> 17/17 </td>
+  </tr>
+  <tr>
+    <td> prod-ParenthesizedExpr </td>
+    <td bgcolor="mediumseagreen"> 20/20 </td>
+  </tr>
+  <tr>
+    <td> prod-PositionalVar </td>
+    <td bgcolor="mediumseagreen"> 34/34 </td>
+  </tr>
+  <tr>
+    <td> prod-Predicate </td>
+    <td bgcolor="mediumseagreen"> 190/190 </td>
+  </tr>
+  <tr>
+    <td> prod-QuantifiedExpr </td>
+    <td bgcolor="mediumseagreen"> 200/200 </td>
+  </tr>
+  <tr>
+    <td> prod-RequireProhibitFeature </td>
+    <td bgcolor="mediumseagreen"> 59/59 </td>
+  </tr>
+  <tr>
+    <td> prod-ReturnClause </td>
+    <td bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td> prod-SchemaImport </td>
+    <td bgcolor="coral"> 103/134 </td>
+  </tr>
+  <tr>
+    <td> prod-SequenceType </td>
+    <td bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+  <tr>
+    <td> prod-StepExpr </td>
+    <td bgcolor="mediumseagreen"> 58/58 </td>
+  </tr>
+  <tr>
+    <td> prod-SwitchExpr </td>
+    <td bgcolor="mediumseagreen"> 22/22 </td>
+  </tr>
+  <tr>
+    <td> prod-TreatExpr </td>
+    <td bgcolor="mediumseagreen"> 69/69 </td>
+  </tr>
+  <tr>
+    <td> prod-TryCatchExpr </td>
+    <td bgcolor="mediumseagreen"> 167/167 </td>
+  </tr>
+  <tr>
+    <td> prod-TypeswitchExpr </td>
+    <td bgcolor="palegreen">68/69 </td>
+  </tr>
+  <tr>
+    <td> prod-UnorderedExpr </td>
+    <td bgcolor="mediumseagreen"> 26/26 </td>
+  </tr>
+  <tr>
+    <td> prod-ValidateExpr </td>
+    <td bgcolor="coral"> 76/83 </td>
+  </tr>
+  <tr>
+    <td> prod-ValueComp </td>
+    <td bgcolor="mediumseagreen"> 44/44 </td>
+  </tr>
+  <tr>
+    <td> prod-VarDecl </td>
+    <td bgcolor="mediumseagreen"> 125/125 </td>
+  </tr>
+  <tr>
+    <td> prod-VarDecl.external </td>
+    <td bgcolor="palegreen">94/95 </td>
+  </tr>
+  <tr>
+    <td> prod-VarDefaultValue </td>
+    <td bgcolor="mediumseagreen"> 37/37 </td>
+  </tr>
+  <tr>
+    <td> prod-VersionDecl </td>
+    <td bgcolor="coral"> 27/28 </td>
+  </tr>
+  <tr>
+    <td> prod-WhereClause </td>
+    <td bgcolor="mediumseagreen"> 79/79 </td>
+  </tr>
+  <tr>
+    <td> prod-WindowClause </td>
+    <td bgcolor="mediumseagreen"> 117/117 </td>
+  </tr>
+  <tr>
+    <td> misc-CombinedErrorCodes </td>
+    <td bgcolor="palegreen">243/244 </td>
+  </tr>
+  <tr>
+    <td> misc-AnnexE </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> misc-AppendixA4 </td>
+    <td bgcolor="mediumseagreen"> 9/9 </td>
+  </tr>
+  <tr>
+    <td> misc-ErrorsAndOptimization </td>
+    <td bgcolor="mediumseagreen"> 7/7 </td>
+  </tr>
+  <tr>
+    <td> misc-HigherOrderFunctions </td>
+    <td bgcolor="palegreen">125/126 </td>
+  </tr>
+  <tr>
+    <td> misc-MiscFunctions </td>
+    <td bgcolor="mediumseagreen"> 38/38 </td>
+  </tr>
+  <tr>
+    <td> misc-StaticContext </td>
+    <td bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td> misc-Serialization </td>
+    <td bgcolor="coral"> 4/12 </td>
+  </tr>
+  <tr>
+    <td> misc-Surrogates </td>
+    <td bgcolor="mediumseagreen"> 17/17 </td>
+  </tr>
+  <tr>
+    <td> misc-XMLEdition </td>
+    <td bgcolor="coral"> 9/10 </td>
+  </tr>
+  <tr>
+    <td> app-CatalogCheck </td>
+    <td bgcolor="mediumseagreen"> 12/12 </td>
+  </tr>
+  <tr>
+    <td> app-Demos </td>
+    <td bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td> app-FunctxFn </td>
+    <td bgcolor="mediumseagreen"> 500/500 </td>
+  </tr>
+  <tr>
+    <td> app-FunctxFunctx </td>
+    <td bgcolor="mediumseagreen"> 627/627 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseNS </td>
+    <td bgcolor="mediumseagreen"> 8/8 </td>
+  </tr>
+  <tr>
+    <td> app-UseCasePARTS </td>
+    <td bgcolor="mediumseagreen"> 1/1 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseR </td>
+    <td bgcolor="mediumseagreen"> 18/18 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseSEQ </td>
+    <td bgcolor="mediumseagreen"> 5/5 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseSGML </td>
+    <td bgcolor="mediumseagreen"> 11/11 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseSTRING </td>
+    <td bgcolor="mediumseagreen"> 4/4 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseTREE </td>
+    <td bgcolor="mediumseagreen"> 6/6 </td>
+  </tr>
+  <tr>
+    <td> app-UseCaseXMP </td>
+    <td bgcolor="mediumseagreen"> 12/12 </td>
+  </tr>
+  <tr>
+    <td> app-XMark </td>
+    <td bgcolor="mediumseagreen"> 21/21 </td>
+  </tr>
+</table>
+\endhtmlonly
 */
\ No newline at end of file

=== modified file 'doc/zorba/data_converters.dox'
--- doc/zorba/data_converters.dox	2013-08-23 11:51:02 +0000
+++ doc/zorba/data_converters.dox	2013-09-17 13:34:04 +0000
@@ -11,11 +11,12 @@
 Please take a look at the various data converter modules for more information.
 
 <ul>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_converters_csv.html">CSV</a></li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_converters_html.html">HTML</a></li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_converters_json.html">JSON</a></li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_xml.html">XML</a></li>
-  <li><a href="../xqdoc/xhtml/jsoniq.org_functions.html">JSON</a></li>
+  <li><a href="../modules/zorba.io_modules_csv.html">CSV</a></li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_converters_html.html">HTML</a></li>
+  <li><a href="../modules/zorba.io_modules_json-xml.html">JSON-XML</a></li>
+  <li><a href="../modules/jsoniq.org_function-library.html">JSON</a></li>
+  <li><a href="../modules/zorba.io_modules_xml.html">XML</a></li>
+  <li><a href="../modules/zorba.io_modules_base64.html">Base 64</a></li>
 </ul>
 
 Also, please <a href="mailto:zorba-users@xxxxxxxxxxxxxxxx";>send us</a> a message if there is a particular data format that you would like to see supported by Zorba, and we will try to help.

=== modified file 'doc/zorba/data_lifecycle.dox'
--- doc/zorba/data_lifecycle.dox	2013-08-23 11:15:04 +0000
+++ doc/zorba/data_lifecycle.dox	2013-09-17 13:34:04 +0000
@@ -108,17 +108,17 @@
   <tr>
     <td>Unordered Maps</td>
     <td>DDL / DML</td>
-    <td><a href="../modules/www.zorba-xquery.com_modules_store_data-structures_unordered-map.html">http://www.zorba-xquery.com/modules/store/dynamic/data-structures/unordered-map</a></td>
+    <td><a href="../modules/zorba.io_modules_unordered-maps.html">http://zorba.io/modules/unordered-maps</a></td>
   </tr>
   <tr>
     <td>Stacks</td>
     <td>DDL / DML</td>
-    <td><a href="../modules/www.zorba-xquery.com_modules_store_data-structures_stack.html">http://www.zorba-xquery.com/modules/store/dynamic/data-structures/stack</a></td>
+    <td><a href="../modules/zorba.io_modules_stack.html">http://zorba.io/modules/stack</a></td>
   </tr>
   <tr>
     <td>Queues</td>
     <td>DDL / DML</td>
-    <td><a href="../modules/www.zorba-xquery.com_modules_store_data-structures_queue.html">http://www.zorba-xquery.com/modules/store/dynamic/data-structures/queue</a></td>
+    <td><a href="../modules/zorba.io_modules_queue.html">http://zorba.io/modules/queue</a></td>
   </tr>
 </table>
 

=== modified file 'doc/zorba/doxy.config.in'
--- doc/zorba/doxy.config.in	2013-07-31 00:34:49 +0000
+++ doc/zorba/doxy.config.in	2013-09-17 13:34:04 +0000
@@ -700,10 +700,10 @@
 # directories that contain example code fragments that are included (see
 # the \include command).
 
-EXAMPLE_PATH           = @CMAKE_SOURCE_DIR@/doc/cxx/examples \
-                         @CMAKE_SOURCE_DIR@/test/rbkt/Queries/zorba \
+EXAMPLE_PATH           = @CMAKE_SOURCE_DIR@/test/rbkt/Queries/zorba \
                          @CMAKE_SOURCE_DIR@/test/update/Queries \
-                         @CMAKE_SOURCE_DIR@/test/update/ExpectedTestResults
+                         @CMAKE_SOURCE_DIR@/test/update/ExpectedTestResults \
+                         @CMAKE_SOURCE_DIR@/doc/zorba
 
 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
@@ -722,7 +722,8 @@
                          DEPENDENCIES \
                          CHANGELOG \
                          LICENSE \
-                         LGPL
+                         LGPL \
+                         *.html
 
 # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
 # searched for input files to be used with the \include or \dontinclude

=== modified file 'doc/zorba/errors_warnings.dox'
--- doc/zorba/errors_warnings.dox	2013-08-23 11:15:04 +0000
+++ doc/zorba/errors_warnings.dox	2013-09-17 13:34:04 +0000
@@ -14,8 +14,8 @@
 A full list of potential errors can be found in the diagnostic_list.h header (<tt>err</tt> and <tt>zerr</tt> namespaces) of the C++ API and in the following modules:
 
 <ul>
-  <li><a href="../xqdoc/modules_http:__zorba.io_modules_zorba-errors.html">http://zorba.io/errors</a></li>
-  <li><a href="../xqdoc/xhtml/www.w3.org_2005_xqt-errors.html">http://www.w3.org/2005/xqt-errors</a></li>
+  <li><a href="../modules/zorba.io_errors.html">http://zorba.io/errors</a></li>
+  <li><a href="../modules/www.w3.org_2005_xqt-errors.html">http://www.w3.org/2005/xqt-errors</a></li>
 </ul>
 
 These modules declare one variable per error.
@@ -26,7 +26,7 @@
 In addition to the errors mentioned in the previous section, Zorba may raise warnings during the static analysis phase of the query.
 Warnings are diagnostic messages that report constructions which are not inherently erroneous but which are risky or suggest there may have been an error.
 Like an error, a warning is identified by a QName whose namespace is %http://zorba.io/warnings.
-A list of warnings can be found in the diagnostic_list.h header (zwarn namespace) of the C++ API and in the <a href="../xqdoc/modules_http:__zorba.io_modules_zorba-warnings.html">http://zorba.io/warnings</a> module.
+A list of warnings can be found in the diagnostic_list.h header (zwarn namespace) of the C++ API and in the <a href="../modules/zorba.io_warnings.html">http://zorba.io/warnings</a> module.
 
 A warning can be enabled (i.e. will be reported), disabled (i.e. will not be reported), or turned into an error (i.e. an error with the same name will be raised) by specifying options in the static context that is used to compile the query (zorba::StaticContext::declareOption) or in the prolog of an XQuery module.
 

=== modified file 'doc/zorba/ft_intro.dox'
--- doc/zorba/ft_intro.dox	2013-06-19 15:19:17 +0000
+++ doc/zorba/ft_intro.dox	2013-09-17 13:34:04 +0000
@@ -8,7 +8,7 @@
 - \ref ft_stemmer
 - \ref ft_thesaurus
 - \ref ft_tokenizer
-- <a href="../www.zorba-xquery.com_modules_full-text.html">Full Text Module</a>
+- <a href="../modules/zorba.io_modules_full-text.html">Full Text Module</a>
 
 \section ft_unimplemented Unimplemented Features
 

=== modified file 'doc/zorba/impl_dep_features.dox'
--- doc/zorba/impl_dep_features.dox	2013-08-23 11:15:04 +0000
+++ doc/zorba/impl_dep_features.dox	2013-09-17 13:34:04 +0000
@@ -19,7 +19,7 @@
   </tr>
   <tr>
     <td valign="top">Version:</td>
-    <td valign="top">2.9.1</td>
+    <td valign="top">${ZORBA_MAJOR_NUMBER}.${ZORBA_MINOR_NUMBER}.${ZORBA_PATCH_NUMBER}</td>
   </tr>
   <tr>
     <td valign="top">Released:</td>

=== modified file 'doc/zorba/indexpage.dox.in'
--- doc/zorba/indexpage.dox.in	2013-06-19 23:05:32 +0000
+++ doc/zorba/indexpage.dox.in	2013-09-17 13:34:04 +0000
@@ -25,14 +25,14 @@
   - <a href="http://xqdt.org"; target="_blank">XQuery Development Toolkit (XQDT)</a>
 
 \section apis APIs
-  - <a href="../../cxx/indexpage.html">C++</a>
-  - <a class="el" href="../c/indexpage.html">C</a>
-  - <a class="el" href="../xqj/indexpage.html">XQJ</a>
-  - <a class="el" href="../java/indexpage.html">Java</a>
-  - <a class="el" href="../php/indexpage.html">PHP</a>
-  - <a class="el" href="../python/indexpage.html">Python</a>
-  - <a class="el" href="../csharp/indexpage.html">C#</a>
-  - <a class="el" href="../ruby/indexpage.html">Ruby</a>
+  - <a href="../cxx/indexpage.html">C++</a>
+  - <a href="../c/indexpage.html">C</a>
+  - <a href="../xqj/indexpage.html">XQJ</a>
+  - <a href="../java/indexpage.html">Java</a>
+  - <a href="../php/indexpage.html">PHP</a>
+  - <a href="../python/indexpage.html">Python</a>
+  - <a href="../csharp/indexpage.html">C#</a>
+  - <a href="../ruby/indexpage.html">Ruby</a>
 
 \section generalarchitecture General Architecture
   - \ref data_lifecycle
@@ -71,14 +71,14 @@
 
 \section jsoniqspec JSONiq Specifications
   - <a href="http://jsoniq.org/docs/JSONiq/html-single/index.html";>JSONiq 1.0</a>
-    - <a href="XQueryforJSON.html">JSONiq for JSON users tutorial</a>
-    - <a href="JSONforXQuery.html">JSONiq for XQuery users tutorial</a>
+    - \ref XQuery_for_JSON
+    - \ref JSON_for_XQuery
   - <a href="http://jsoniq.org/docs/JSONiqExtensionToXQuery/html-single/index.html";>JSONiq Extension to XQuery</a>
   - <a href="http://www.jsoniq.org/docs/JSOund/html-single/";>JSound 0.1</a> (A JSON schema language)
 
 \section zorbaspec Zorba Proprietary Specifications
   - \ref xqddf
-  - <a href="scripting_spec.html">Scripting Extension</a> (also see our \ref scripting_tutorial "Tutorial")
+  - \ref scripting_spec (also see our \ref scripting_tutorial "Tutorial")
   - \ref options_and_annotations
 
 \section tutorials Examples

=== modified file 'doc/zorba/memory_leaks.dox'
--- doc/zorba/memory_leaks.dox	2013-06-16 00:37:21 +0000
+++ doc/zorba/memory_leaks.dox	2013-09-17 13:34:04 +0000
@@ -4,11 +4,11 @@
 
 The Zorba Processor manages automatically its own memory, but still, there are cases where you may receive the following message:
 
-\code
+<tt>
 Zorba did not close properly, objects may still in memory while shutdown the store. 
 [n] referenced URIs remain in the string pool.
 For help avoiding this message please refer to http://www.zorba-xquery.com/html/documentation in section General Architecture -> Memory Leaks.
-\endcode
+</tt>
 
 This message means that not all the resources 
 were released before Zorba and its store were shutdown.

=== modified file 'doc/zorba/modules_top.dox'
--- doc/zorba/modules_top.dox	2013-06-17 17:44:03 +0000
+++ doc/zorba/modules_top.dox	2013-09-17 13:34:04 +0000
@@ -12,7 +12,7 @@
 The Zorba code includes a few core modules:
 
    - <a href="../modules/www.w3.org_2005_xpath-functions.html">xpath</a>
-   - <a href="../modules/www.zorba-xquery.com_modules_node.html">XDM</a>
+   - <a href="../modules/zorba.io_modules_node.html">XDM</a>
    - <a href="../modules/www.zorba-xquery.com_modules_store_dynamic_collections_ddl.html">store</a>
    - <a href="../modules/www.zorba-xquery.com_modules_introspection_sctx.html">introspection</a>
    - <a href="../modules/www.zorba-xquery.com_modules_reflection.html">reflection</a>
@@ -20,25 +20,25 @@
    - <a href="../modules/www.zorba-xquery.com_modules_fetch.html">fetch</a>
    - <a href="../modules/www.zorba-xquery.com_modules_http-client.html">http-client</a>
    - <a href="../modules/www.zorba-xquery.com_modules_xqdoc.html">xqdoc</a>
-   - <a href="../modules/www.functx.com_index.html">functx</a>
+   - <a href="../modules/www.functx.com.html">functx</a>
 
 \section non_core_modules Non-core Modules
 
 In addition, the Zorba team supports a large number of non-core modules:
 
-   - <a href="../modules/www.zorba-xquery.com_modules_data-cleaning_hybrid-string-similarity.html">data-cleaning</a>
-   - data-converters: <a href="../modules/www.zorba-xquery.com_modules_converters_json.html">JSON</a>, <a href="../modules/www.zorba-xquery.com_modules_converters_csv.html">CSV</a>, <a href="../modules/www.zorba-xquery.com_modules_converters_html.html">HTML</a>
+   - data-cleaning: <a href="../modules/zorba.io_modules_data-cleaning_hybrid-string-similarity.html">hybrid-string-similarity</a>, <a href="../modules/zorba.io_modules_data-cleaning_normalization.html">normalization</a>
+   - data-converters: <a href="../modules/zorba.io_modules_json-xml.html">JSON</a>, <a href="../modules/zorba.io_modules_csv.html">CSV</a>, <a href="../modules/www.zorba-xquery.com_modules_converters_html.html">HTML</a>
    - data-formatting: <a href="../modules/www.zorba-xquery.com_modules_xsl-fo.html">XSL-FO</a>
    - <a href="../modules/www.zorba-xquery.com_modules_email_smtp.html">email</a>
-   - <a href="../modules/www.zorba-xquery.com_modules_excel_statistical.html">excel</a>
-   - <a href="../modules/www.zorba-xquery.com_modules_geoproj.html">geo</a>
+   - <a href="../modules/zorba.io_modules_excel_statistical.html">excel</a>
+   - <a href="../modules/expath.org_ns_geo.html">geo</a>
    - <a href="../modules/expath.org_ns_http-client.html">http-client</a>
    - <a href="../modules/www.zorba-xquery.com_modules_image_manipulation.html">image</a>
    - programming languages: <a href="../modules/www.zorba-xquery.com_modules_languages_xslt.html">XSLT</a>
    - <a href="../modules/www.zorba-xquery.com_modules_oauth_client.html">oauth</a>
    - <a href="../modules/www.zorba-xquery.com_modules_process.html">process</a>
    - <a href="../modules/www.zorba-xquery.com_modules_cryptography_hmac.html">security</a>
-   - <a href="../modules/www.zorba-xquery.com_modules_system.html">system</a>
+   - <a href="../modules/zorba.io_modules_system.html">system</a>
 
 For a complete list of these modules, see: <b><a
 href="../modules/index.html">XQuery Module Library</a></b>.

=== modified file 'doc/zorba/overview.dox'
--- doc/zorba/overview.dox	2013-06-19 22:47:21 +0000
+++ doc/zorba/overview.dox	2013-09-17 13:34:04 +0000
@@ -7,7 +7,7 @@
 
 <ul>
   <li><a href="http://www.w3.org/TR/xpath/";>XPath</a></li>
-  <li><a href="http://www.w3.org/TR/xquery/";>XQuery</a></li>
+  <li><a href="http://www.w3.org/TR/xquery-30/";>XQuery</a></li>
   <li><a href="http://www.w3.org/TR/xqueryx/";>XQueryX</a></li>
   <li><a href="http://www.w3.org/TR/xslt";>XSLT</a></li>
   <li><a href="http://www.w3.org/TR/xproc/";>XProc</a></li>
@@ -34,7 +34,7 @@
 
   <li>There are several XQuery features that can be enabled or disabled:
     <ul>
-      <li><a href="scripting_spec.html">Zorba's XQuery Scripting Extension</a></li>
+      <li><a href="scripting_tutorial.html">Zorba's XQuery Scripting Extension</a></li>
       <li>\ref xqddf "Zorba's XQuery Data Definition Facility"</li>
       <li><a href="http://www.w3.org/TR/xpath-functions-30/#func-trace";>fn:trace</a></li>
       <li><a href="http://www.w3.org/TR/xquery-30/#id-dynamic-function-invocation";>Higher-order functions</a></li>

=== added file 'doc/zorba/scripting_spec.dox'
--- doc/zorba/scripting_spec.dox	1970-01-01 00:00:00 +0000
+++ doc/zorba/scripting_spec.dox	2013-09-17 13:34:04 +0000
@@ -0,0 +1,4 @@
+/** \page scripting_spec XQuery Scripting Extension Proposal
+
+\htmlinclude scripting_spec.html
+*/

=== modified file 'doc/zorba/scripting_spec.html'
--- doc/zorba/scripting_spec.html	2013-08-23 11:15:04 +0000
+++ doc/zorba/scripting_spec.html	2013-09-17 13:34:04 +0000
@@ -1,559 +1,374 @@
 <html>
-   <head>
-      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-   
-      <title>XQuery Scripting Extension Proposal</title><style type="text/css">
-/**/
-code           { font-family: monospace; }
-
-div.constraint,
-div.issue,
-div.note,
-div.notice     { margin-left: 2em; }
-
-div.issue
-p.title        { margin-left: -2em; }
-
-ol.enumar      { list-style-type: decimal; }
-ol.enumla      { list-style-type: lower-alpha; }
-ol.enumlr      { list-style-type: lower-roman; }
-ol.enumua      { list-style-type: upper-alpha; }
-ol.enumur      { list-style-type: upper-roman; }
-
-li p           { margin-top: 0.3em;
-                 margin-bottom: 0.3em; }
-
-sup small      { font-style: italic;
-                 color: #8F8F8F;
-               }
-    
-div.exampleInner pre { margin-left: 1em;
-                       margin-top: 0em; margin-bottom: 0em}
-div.exampleOuter {border: 4px double gray;
-                  margin: 0em; padding: 0em}
-div.exampleInner { background-color: #d5dee3;
-                   border-top-width: 4px;
-                   border-top-style: double;
-                   border-top-color: #d3d3d3;
-                   border-bottom-width: 4px;
-                   border-bottom-style: double;
-                   border-bottom-color: #d3d3d3;
-                   padding: 4px; margin: 0em }
-div.exampleWrapper { margin: 4px }
-div.exampleHeader { font-weight: bold;
-                    margin: 4px}
-
-div.issue { border-bottom-color: black;
-            border-bottom-style: solid;
-            border-bottom-width: 1pt;
-            margin-bottom: 20pt;
-}
-
-th.issue-toc-head { border-bottom-color: black;
-                    border-bottom-style: solid;
-                    border-bottom-width: 1pt;
-}
-
-      
-table.small    { font-size: x-small; }
-
-a.judgment:visited, a.judgment:link { font-family: sans-serif;
-                                      color: black; 
-                                      text-decoration: none }
-a.processing:visited, a.processing:link { color: black; 
-                                          text-decoration: none }
-a.env:visited, a.env:link { color: black; 
-                            text-decoration: none }
-/**/
-      </style><link rel="stylesheet" type="text/css" href="/css/W3C-WD.css">
-   </head>
-   <body>
-      <h1>XQuery Scripting Extension Proposal</h1>
-      <h2>Authors</h2>
-      <ul>
-         <li>Matthias Brantner, 28msec, Inc., matthias.brantner@xxxxxxxxxx</li>
-         <li>Daniela Florescu, Oracle Corporation, daniela.florescu@xxxxxxxxxx</li>
-         <li>Ghislain Fourny, ETH Zurich, ghislain.fourny@xxxxxxxxxxx</li>
-         <li>Josh Spiegel, Oracle Corporation, josh.spiegel@xxxxxxxxxx</li>
-      </ul>
-      <h1>Abstract</h1>
-      <p>This specification defines an extension to XQuery 3.0
-                  and XQuery Update Facility 1.0.
-                  It introduces statements including the apply, local variable declaration, assignment,
-                  while, exit and block statements, as well as statement counterparts to FLWOR, If, Switch,
-                  Typeswitch, Trycatch expressions. Statements do not return any value but can have side
-                  effects such as applying a PUL or reassigning a variable.
-                  It also introduces block expressions, which may contain statements and thus also have
-                  side effects. Such expressions must be evaluated in a specific order, which is
-                  described here. Subsequent expressions can see the effects of the expressions that came before them. 
-               
-      </p>
-      <hr>
-      <h1>Table of Contents</h1>
-      <ol>
-         <li><a href="#Introduction">Introduction</a><ol></ol>
-            <ol></ol>
-         </li>
-         <li><a href="#id-extensions-to-processing-model">Extensions to the Processing Model</a><ol></ol>
-            <ol>
-               <li><a href="#id-statements">Statements</a></li>
-               <li><a href="#id-expressions">Expressions</a></li>
-               <li><a href="#id-evaluation-order">Evaluation Order</a></li>
-               <li><a href="#id-snapshot-scope">Snapshots</a></li>
-               <li><a href="#id-nested-snapshots">Nested Snapshots</a></li>
-               <li><a href="#id-variable-revalidation">Variable Binding Revalidation</a></li>
-               <li><a href="#id-query-body">Main module</a></li>
-            </ol>
-         </li>
-         <li><a href="#id-extensions-to-prolog">Extensions to the Prolog</a><ol></ol>
-            <ol>
-               <li><a href="#id-assignable-global-var">Global Variable Declarations</a></li>
-               <li><a href="#id-function-decl">Function Declarations</a></li>
-            </ol>
-         </li>
-         <li><a href="#id-new-statements">Statements</a><ol></ol>
-            <ol>
-               <li><a href="#id-apply">Apply Statement</a></li>
-               <li><a href="#id-assignment">Assignment Statement</a></li>
-               <li><a href="#id-break">Break Statement</a></li>
-               <li><a href="#id-continue">Continue Statement</a></li>
-               <li><a href="#id-exit">Exit Statement</a></li>
-               <li><a href="#id-vardecl-statement">Variable Declaration Statement</a></li>
-               <li><a href="#id-while-statement">While Statement</a></li>
-            </ol>
-         </li>
-         <li><a href="#id-statements-expressions">Statement counterparts of existing expressions</a><ol></ol>
-            <ol>
-               <li><a href="#id-flwor-statement">FLWOR Statements and Expressions</a></li>
-               <li><a href="#id-if-statement">Conditional Statements and Expressions</a></li>
-               <li><a href="#id-switch-statement">Switch Statements and Expressions</a></li>
-               <li><a href="#id-trycatch-statement">Try-Catch Statements and Expressions</a></li>
-               <li><a href="#id-typeswitch-statement">Typeswitch Statements and Expressions</a></li>
-               <li><a href="#id-block-statement">Block Statements and Expressions</a></li>
-            </ol>
-         </li>
-         <li><a href="#id-expr-changes">Changes to existing expressions</a><ol></ol>
-            <ol>
-               <li><a href="#id-node-constructors-statements">Direct and Computed Node Constructors</a></li>
-               <li><a href="#id-predicate-quantified">Filter and quantified expressions.</a></li>
-               <li><a href="#id-other-expr">Other Expressions</a></li>
-            </ol>
-         </li>
-         <li><a href="#id-example">Example</a><ol></ol>
-            <ol></ol>
-         </li>
-         <li><a href="#id-extra-grammatical">Extra-Grammatical Constraints</a><ol></ol>
-            <ol></ol>
-         </li>
-         <li><a href="#id-lookahead">Alternative simplified grammar for LL-Parsers</a><ol></ol>
-            <ol></ol>
-         </li>
-      </ol>
-      <ol></ol>
-      <hr>
-      <h1><a name="Introduction"></a>1. Introduction
-      </h1>
-            
-      
-            
-      <p>XQuery Scripting Extension Proposal extends XQuery 3.0, enabling it to
-                  serve as a scripting language in order to satisfy XQuery Scripting Requirements. 
-                  A prerequisite for this extension is XQuery Update Facility 1.0. 
-                  The following abbreviations are used in this specification: 
-                 
-         [<b>XQUF</b> is an abbreviation for XQuery Update Facility 1.0.]
-         
-                 
-         [<b>XQSX</b> is an abbreviation for XQuery Scripting Extension.]
-         
-      </p>
-      
-            
-      <p>XQSX has the following properties:</p>
-            
-      <ul>
-         <li>
-                      
-            <p>It is a strict superset of XQuery 3.0, in the
-                           sense that all valid XQuery 3.0 expressions are also
-                           valid XQSX expressions and have the same meaning. 
-                         
-            </p>
-                    
-         </li>
-         <li>
-                      
-            <p>It is a strict superset of XQUF, in the
-                           sense that all valid XQUF expressions are also
-                           valid XQSX expressions and have the same meaning. 
-                         
-            </p>
-                    
-         </li>
-      </ul>
-            
-      <p>This specification makes use of the prefix an for some annotations, bound with the namespace http://zorba.io/annotations</p>
-          
-      <h1><a name="id-extensions-to-processing-model"></a>2. Extensions to the Processing Model
-      </h1>
-              
-      
-              
-      <p>
-                   Expressions in XQSX may have side-effects that are visible to subsequent expressions (according to their
-                   evaluation order). This requires a number of extensions to the 
-                   XQuery 3.0 and XQUF processing model.
-                 
-      </p>
-      
-              
-      <h2><a name="id-statements"></a>2.1. Statements
-      </h2>
-                
-                
-      <p>
-         [A <b>statement</b> is a grammatical construct which
-                     does not return anything (no XDM, no PUL) but can have side-effects. Statements have to be executed
-                     in the evaluation order defined in XQSX.]
-         
-      </p>
-                
-      <p>XQSX introduces the following statements:
-                     
-         <ul>
-            <li>
-               <p>Apply statements</p>
-            </li>
-            <li>
-               <p>Variable declaration statements</p>
-            </li>
-            <li>
-               <p>Variable assignment statements</p>
-            </li>
-            <li>
-               <p>Control flow statements: While, Break, Continue and Exit</p>
-            </li>
-            <li>
-               <p>Statements which have expression counterparts:
-                                  If-Then-Else, FLWOR, Try-Catch, Switch, Typeswitch and Block.
-               </p>
-            </li>
-         </ul>
-                   
-      </p>
-              
-              
-              
-      <h2><a name="id-expressions"></a>2.2. Expressions
-      </h2>
-                
-              
-      <h3><a name="id-updating-constraint"></a>2.2.1. Updating Expressions
-      </h3>
-                
-                
-      <p>
-                     XQSX builds on top of XQuery 3.0 and XQuery Update 1.0, so that it keeps
-                     the same constraints about an expression being simple (if it returns an empty PUL), updating (if it
-                     returns an empty XDM) or vacuous (if both are empty).
-      </p>
-                  
-      <p>This specification takes into account the fact that the XQUF specification might evolve and allow an updating
-                     expression to return both a PUL and an XDM. We use the terminology of "non-updating" for simple expressions.
-      </p>
-                
-      <p>The composability constraints and category rules for updating expressions are inherited
-                     from the XQUF specification. Composability constraints are given for updating expressions in new expressions as
-         well
-                   as for sequential expressions.
-      </p>
-              
-              
-      <h3><a name="id-sequential"></a>2.2.2. Sequential Expressions
-      </h3>
-                
-                
-      <p>
-                     In addition to the updating/non-updating categorization, XQSX
-                     introduces another dimension to classify expressions: sequential/non-sequential expressions.
-      </p>
-                
-      <ol>
-         <li>
-                          
-            <p>
-                               
-               [A <b>sequential expression</b>
-                                 is an expression that can have side effects other than constructing a new node or raising an error.]
-               
-                               Side effects include applying updates to an XDM instance,
-                               altering the dynamic context, or affecting the flow of control.
-            </p>
-                          
-            <p>An expression is sequential if it contains, directly or nested:</p>
-                          
-            <ul>
-               <li>
-                                    
-                  <p>a call to a sequential function.</p>
-                                  
-               </li>
-               <li>
-                                    
-                  <p>an assign statement, and the affected variable is declared outside
-                                         of the expression.
-                  </p>
-                                  
-               </li>
-               <li>
-                                    
-                  <p>an apply statement, the operand of which is updating.</p>
-                                  
-               </li>
-               <li>
-                                    
-                  <p>a break or continue statement without FLWOR or while statement inbetween in the expression tree.</p>
-                                  
-               </li>
-               <li>
-                                    
-                  <p>an exit statement.</p>
-                                  
-               </li>
-            </ul>
-                          
-            <p>
-                               The side effects of a sequential expression are immediately effective
-                               and are visible to subsequent expressions. 
-                               Because of their side effects, sequential expressions must be evaluated
-                               in evaluation order, as defined in this specification.
-                               In addition to its side effects, a sequential expression may return
-                               an XDM instance.
-            </p>
-                        
-         </li>
-         <li>
-                          
-            <p>
-                               
-               [A <b>non-sequential expression</b>
-                                 is an expression that is is not sequential.]
-               
-            </p>
-                        
-         </li>
-      </ol>
-                
-      <p>The classification of each expression into one of the above categories is
-                     performed by static analysis.
-      </p>
-                
-      <p>
-                     Note that updating/non-updating and sequential/non-sequential are two orthogonal classification dimensions.
-                     Hence, an expression can be non-updating and non-sequential, non-updating and sequential,
-                     or updating and non-sequential.
-                   
-      </p>
-              
-            
-              
-              
-      <h2><a name="id-evaluation-order"></a>2.3. Evaluation Order
-      </h2>
-                
-                
-      <p>
-                     
-         [XQSX defines an <b>evaluation order</b> on
-                       many kinds of XQuery expressions, which is the order that operand expressions must be evaluated in order
-                       to determine what side-effects are visible to later expressions.]
-         
-      </p>
-                
-      <p>Unless otherwise stated, in an evaluation of a sequential expression or of a statement,
-                     the operand expressions or statements must be evaluated exactly once, from left to right.
-      </p>
-                
-      <p>
-                     An implementation may use any execution strategy as long as the result complies with
-                     the semantics of this ordering.
-      </p>
-              
-              
-            
-      <h2><a name="id-snapshot-scope"></a>2.4. Snapshots
-      </h2>
-              
-              
-      <p>The term <b>snapshot</b> is defined in XQuery Update Facility as follows:
-                    
-         [A <b>snapshot</b> is a scope
-                    within which expressions are evaluated with respect to a fixed
-                    XDM instance, accessible through the dynamic context's bindings,
-                    and updates are held pending.]
-         
-                    A snapshot is terminated by invocation of the upd:applyUpdates operation.
-                    Unlike XQUF, XQSX
-                    permits an XQuery program to contain more than one snapshot.
-      </p>
-      
-      
-              
-      <p>
-                   XQuery 1.0 and XPath 2.0 Functions and Operators defines certain functions as stable. Stable functions
-                   such as fn:current-time and fn:doc are defined to return the same result given the same
-                   arguments within an execution scope.
-                   XQSX permits an XQuery program to contain more than one execution scope.
-      </p>
-      
-      
-              
-      <p>In XQSX, a snapshot and execution scope is defined as the lapse between two side effects to the environment, reachable
-                   through the dynamic context, on which
-                 the XQuery program operates.
-      </p>
-              
-      <p>Each of the following events marks the end of the current snapshot and execution scope, and the beginning of a new one:</p>
-              
-      <ul>
-         <li>
-            <p>The invocation of upd:applyUpdates,</p>
-         </li>
-         <li>
-            <p>Calling an external, sequential function,</p>
-         </li>
-         <li>
-            <p>Assigning a new value to a variable.</p>
-         </li>
-      </ul>
-              
-            
-              
-      <h2><a name="id-nested-snapshots"></a>2.5. Nested Snapshots
-      </h2>
-                
-      
-              
-      <p>
-                   To avoid nested snapshots, it is forbidden for an expression to be both updating and sequential. If such is the
-         case,
-                   a static error is raised.
-                 
-      </p>
-              
-            
-      
-              
-      <h2><a name="id-variable-revalidation"></a>2.6. Variable Binding Revalidation
-      </h2>
-              
-              
-      <p>
-                   To ensure type soundness, variable bindings are revalidated at the end of each scope to check that
-                   any updates applied have not made them invalid with repect to their declared types. It is a dynamic
-                   error  if, after applying a pending update list (using upd:applyUpdates),
-                   the XDM instance bound to any in-scope variable does not match the static type of that variable according
-                   to SequenceType matching rules.
-                 
-      </p>
-            
-      
-              
-      <h2><a name="id-query-body"></a>2.7. Main module
-      </h2>
-                
-                <pre>
+  <head>
+    <style type="text/css">
+      /**/
+      code{
+        font-family:monospace;
+      }
+      
+      div.constraint,
+      div.issue,
+      div.note,
+      div.notice{
+        margin-left:2em;
+      }
+      
+      div.issue
+      p.title{
+        margin-left:-2em;
+      }
+      
+      ol.enumar{
+        list-style-type:decimal;
+      }
+      ol.enumla{
+        list-style-type:lower-alpha;
+      }
+      ol.enumlr{
+        list-style-type:lower-roman;
+      }
+      ol.enumua{
+        list-style-type:upper-alpha;
+      }
+      ol.enumur{
+        list-style-type:upper-roman;
+      }
+      
+      li p{
+        margin-top:0.3em;
+        margin-bottom:0.3em;
+      }
+      
+      sup small{
+        font-style:italic;
+        color:#8F8F8F;
+      }
+      
+      div.exampleInner pre{
+        margin-left:1em;
+        margin-top:0em;
+        margin-bottom:0em
+      }
+      div.exampleOuter{
+        border:4px double gray;
+        margin:0em;
+        padding:0em
+      }
+      div.exampleInner{
+        background-color:#d5dee3;
+        border-top-width:4px;
+        border-top-style:double;
+        border-top-color:#d3d3d3;
+        border-bottom-width:4px;
+        border-bottom-style:double;
+        border-bottom-color:#d3d3d3;
+        padding:4px;
+        margin:0em
+      }
+      div.exampleWrapper{
+        margin:4px
+      }
+      div.exampleHeader{
+        font-weight:bold;
+        margin:4px}
+      
+      div.issue{
+        border-bottom-color:black;
+        border-bottom-style:solid;
+        border-bottom-width:1pt;
+        margin-bottom:20pt;
+      }
+      
+      th.issue-toc-head{
+        border-bottom-color:black;
+        border-bottom-style:solid;
+        border-bottom-width:1pt;
+      }
+      
+      
+      table.small{
+        font-size:x-small;
+      }
+      
+      a.judgment:visited,
+      a.judgment:link{
+        font-family:sans-serif;
+        color:black;
+        text-decoration:none}
+      a.processing:visited,
+      a.processing:link{
+        color:black;
+        text-decoration:none}
+      a.env:visited,
+      a.env:link{
+        color:black;
+        text-decoration:none}
+      /**/</style>
+    <link rel="stylesheet" type="text/css" href="/css/W3C-WD.css" />
+  </head>
+  <body>
+    <h2>Authors</h2>
+    <ul>
+      <li>Matthias Brantner, 28msec, Inc., matthias.brantner@xxxxxxxxxx</li>
+      <li>Daniela Florescu, Oracle Corporation, daniela.florescu@xxxxxxxxxx</li>
+      <li>Ghislain Fourny, ETH Zurich, ghislain.fourny@xxxxxxxxxxx</li>
+      <li>Josh Spiegel, Oracle Corporation, josh.spiegel@xxxxxxxxxx</li>
+    </ul>
+    <h1>Abstract</h1>
+    <p>This specification defines an extension to XQuery 3.0 and XQuery Update Facility 1.0. It
+      introduces statements including the apply, local variable declaration, assignment, while, exit
+      and block statements, as well as statement counterparts to FLWOR, If, Switch, Typeswitch,
+      Trycatch expressions. Statements do not return any value but can have side effects such as
+      applying a PUL or reassigning a variable. It also introduces block expressions, which may
+      contain statements and thus also have side effects. Such expressions must be evaluated in a
+      specific order, which is described here. Subsequent expressions can see the effects of the
+      expressions that came before them. </p>
+    <h1>Table of Contents</h1>
+    <ol>
+      <li><a href="#Introduction">Introduction</a><ol></ol>
+        <ol></ol>
+      </li>
+      <li><a href="#id-extensions-to-processing-model">Extensions to the Processing Model</a><ol></ol>
+        <ol>
+          <li><a href="#id-statements">Statements</a></li>
+          <li><a href="#id-expressions">Expressions</a></li>
+          <li><a href="#id-evaluation-order">Evaluation Order</a></li>
+          <li><a href="#id-snapshot-scope">Snapshots</a></li>
+          <li><a href="#id-nested-snapshots">Nested Snapshots</a></li>
+          <li><a href="#id-variable-revalidation">Variable Binding Revalidation</a></li>
+          <li><a href="#id-query-body">Main module</a></li>
+        </ol>
+      </li>
+      <li><a href="#id-extensions-to-prolog">Extensions to the Prolog</a><ol></ol>
+        <ol>
+          <li><a href="#id-assignable-global-var">Global Variable Declarations</a></li>
+          <li><a href="#id-function-decl">Function Declarations</a></li>
+        </ol>
+      </li>
+      <li><a href="#id-new-statements">Statements</a><ol></ol>
+        <ol>
+          <li><a href="#id-apply">Apply Statement</a></li>
+          <li><a href="#id-assignment">Assignment Statement</a></li>
+          <li><a href="#id-break">Break Statement</a></li>
+          <li><a href="#id-continue">Continue Statement</a></li>
+          <li><a href="#id-exit">Exit Statement</a></li>
+          <li><a href="#id-vardecl-statement">Variable Declaration Statement</a></li>
+          <li><a href="#id-while-statement">While Statement</a></li>
+        </ol>
+      </li>
+      <li><a href="#id-statements-expressions">Statement counterparts of existing expressions</a><ol></ol>
+        <ol>
+          <li><a href="#id-flwor-statement">FLWOR Statements and Expressions</a></li>
+          <li><a href="#id-if-statement">Conditional Statements and Expressions</a></li>
+          <li><a href="#id-switch-statement">Switch Statements and Expressions</a></li>
+          <li><a href="#id-trycatch-statement">Try-Catch Statements and Expressions</a></li>
+          <li><a href="#id-typeswitch-statement">Typeswitch Statements and Expressions</a></li>
+          <li><a href="#id-block-statement">Block Statements and Expressions</a></li>
+        </ol>
+      </li>
+      <li><a href="#id-expr-changes">Changes to existing expressions</a><ol></ol>
+        <ol>
+          <li><a href="#id-node-constructors-statements">Direct and Computed Node
+            Constructors</a></li>
+          <li><a href="#id-predicate-quantified">Filter and quantified expressions.</a></li>
+          <li><a href="#id-other-expr">Other Expressions</a></li>
+        </ol>
+      </li>
+      <li><a href="#id-example">Example</a><ol></ol>
+        <ol></ol>
+      </li>
+      <li><a href="#id-extra-grammatical">Extra-Grammatical Constraints</a><ol></ol>
+        <ol></ol>
+      </li>
+      <li><a href="#id-lookahead">Alternative simplified grammar for LL-Parsers</a><ol></ol>
+        <ol></ol>
+      </li>
+    </ol>
+    <ol></ol>
+    <h1><a name="Introduction"></a>1. Introduction </h1>
+    <p>XQuery Scripting Extension Proposal extends XQuery 3.0, enabling it to serve as a scripting
+      language in order to satisfy XQuery Scripting Requirements. A prerequisite for this extension
+      is XQuery Update Facility 1.0. The following abbreviations are used in this specification:
+        [<b>XQUF</b> is an abbreviation for XQuery Update Facility 1.0.] [<b>XQSX</b> is an
+      abbreviation for XQuery Scripting Extension.] </p>
+    <p>XQSX has the following properties:</p>
+    <ul>
+      <li>
+        <p>It is a strict superset of XQuery 3.0, in the sense that all valid XQuery 3.0 expressions
+          are also valid XQSX expressions and have the same meaning. </p>
+      </li>
+      <li>
+        <p>It is a strict superset of XQUF, in the sense that all valid XQUF expressions are also
+          valid XQSX expressions and have the same meaning. </p>
+      </li>
+    </ul>
+    <p>This specification makes use of the prefix an for some annotations, bound with the namespace
+      http://zorba.io/annotations</p>
+    <h1><a name="id-extensions-to-processing-model"></a>2. Extensions to the Processing Model </h1>
+    <p> Expressions in XQSX may have side-effects that are visible to subsequent expressions
+      (according to their evaluation order). This requires a number of extensions to the XQuery 3.0
+      and XQUF processing model. </p>
+    <h2><a name="id-statements"></a>2.1. Statements </h2>
+    <p> [A <b>statement</b> is a grammatical construct which does not return anything (no XDM, no
+      PUL) but can have side-effects. Statements have to be executed in the evaluation order defined
+      in XQSX.] </p>
+    <p>XQSX introduces the following statements: <ul>
+        <li>
+          <p>Apply statements</p>
+        </li>
+        <li>
+          <p>Variable declaration statements</p>
+        </li>
+        <li>
+          <p>Variable assignment statements</p>
+        </li>
+        <li>
+          <p>Control flow statements: While, Break, Continue and Exit</p>
+        </li>
+        <li>
+          <p>Statements which have expression counterparts: If-Then-Else, FLWOR, Try-Catch, Switch,
+            Typeswitch and Block. </p>
+        </li>
+      </ul>
+    </p>
+    <h2><a name="id-expressions"></a>2.2. Expressions </h2>
+    <h3><a name="id-updating-constraint"></a>2.2.1. Updating Expressions </h3>
+    <p> XQSX builds on top of XQuery 3.0 and XQuery Update 1.0, so that it keeps the same
+      constraints about an expression being simple (if it returns an empty PUL), updating (if it
+      returns an empty XDM) or vacuous (if both are empty). </p>
+    <p>This specification takes into account the fact that the XQUF specification might evolve and
+      allow an updating expression to return both a PUL and an XDM. We use the terminology of
+      "non-updating" for simple expressions. </p>
+    <p>The composability constraints and category rules for updating expressions are inherited from
+      the XQUF specification. Composability constraints are given for updating expressions in new
+      expressions as well as for sequential expressions. </p>
+    <h3><a name="id-sequential"></a>2.2.2. Sequential Expressions </h3>
+    <p> In addition to the updating/non-updating categorization, XQSX introduces another dimension
+      to classify expressions: sequential/non-sequential expressions. </p>
+    <ol>
+      <li>
+        <p> [A <b>sequential expression</b> is an expression that can have side effects other than
+          constructing a new node or raising an error.] Side effects include applying updates to an
+          XDM instance, altering the dynamic context, or affecting the flow of control. </p>
+        <p>An expression is sequential if it contains, directly or nested:</p>
+        <ul>
+          <li>
+            <p>a call to a sequential function.</p>
+          </li>
+          <li>
+            <p>an assign statement, and the affected variable is declared outside of the expression.
+            </p>
+          </li>
+          <li>
+            <p>an apply statement, the operand of which is updating.</p>
+          </li>
+          <li>
+            <p>a break or continue statement without FLWOR or while statement inbetween in the
+              expression tree.</p>
+          </li>
+          <li>
+            <p>an exit statement.</p>
+          </li>
+        </ul>
+        <p> The side effects of a sequential expression are immediately effective and are visible to
+          subsequent expressions. Because of their side effects, sequential expressions must be
+          evaluated in evaluation order, as defined in this specification. In addition to its side
+          effects, a sequential expression may return an XDM instance. </p>
+      </li>
+      <li>
+        <p> [A <b>non-sequential expression</b> is an expression that is is not sequential.] </p>
+      </li>
+    </ol>
+    <p>The classification of each expression into one of the above categories is performed by static
+      analysis. </p>
+    <p> Note that updating/non-updating and sequential/non-sequential are two orthogonal
+      classification dimensions. Hence, an expression can be non-updating and non-sequential,
+      non-updating and sequential, or updating and non-sequential. </p>
+    <h2><a name="id-evaluation-order"></a>2.3. Evaluation Order </h2>
+    <p> [XQSX defines an <b>evaluation order</b> on many kinds of XQuery expressions, which is the
+      order that operand expressions must be evaluated in order to determine what side-effects are
+      visible to later expressions.] </p>
+    <p>Unless otherwise stated, in an evaluation of a sequential expression or of a statement, the
+      operand expressions or statements must be evaluated exactly once, from left to right. </p>
+    <p> An implementation may use any execution strategy as long as the result complies with the
+      semantics of this ordering. </p>
+    <h2><a name="id-snapshot-scope"></a>2.4. Snapshots </h2>
+    <p>The term <b>snapshot</b> is defined in XQuery Update Facility as follows: [A <b>snapshot</b>
+      is a scope within which expressions are evaluated with respect to a fixed XDM instance,
+      accessible through the dynamic context's bindings, and updates are held pending.] A snapshot
+      is terminated by invocation of the upd:applyUpdates operation. Unlike XQUF, XQSX permits an
+      XQuery program to contain more than one snapshot. </p>
+    <p> XQuery 1.0 and XPath 2.0 Functions and Operators defines certain functions as stable. Stable
+      functions such as fn:current-time and fn:doc are defined to return the same result given the
+      same arguments within an execution scope. XQSX permits an XQuery program to contain more than
+      one execution scope. </p>
+    <p>In XQSX, a snapshot and execution scope is defined as the lapse between two side effects to
+      the environment, reachable through the dynamic context, on which the XQuery program operates. </p>
+    <p>Each of the following events marks the end of the current snapshot and execution scope, and
+      the beginning of a new one:</p>
+    <ul>
+      <li>
+        <p>The invocation of upd:applyUpdates,</p>
+      </li>
+      <li>
+        <p>Calling an external, sequential function,</p>
+      </li>
+      <li>
+        <p>Assigning a new value to a variable.</p>
+      </li>
+    </ul>
+    <h2><a name="id-nested-snapshots"></a>2.5. Nested Snapshots </h2>
+    <p> To avoid nested snapshots, it is forbidden for an expression to be both updating and
+      sequential. If such is the case, a static error is raised. </p>
+    <h2><a name="id-variable-revalidation"></a>2.6. Variable Binding Revalidation </h2>
+    <p> To ensure type soundness, variable bindings are revalidated at the end of each scope to
+      check that any updates applied have not made them invalid with repect to their declared types.
+      It is a dynamic error if, after applying a pending update list (using upd:applyUpdates), the
+      XDM instance bound to any in-scope variable does not match the static type of that variable
+      according to SequenceType matching rules. </p>
+    <h2><a name="id-query-body"></a>2.7. Main module </h2>
+    <pre>
 0 - <a name="MainModule" class="ext">MainModule</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Prolog"; class="new">Prolog</a> <a href="#Program" class="new">Program</a>
     </pre><pre>
 1 - <a name="Program" class="ext">Program</a> ::= <a href="#StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a>
     </pre><pre>
 4 - <a name="StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a> ::= <a href="#Statements" class="new">Statements</a> <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a>?
     </pre>
-                <p>A main module is redefined to be be a prolog followed by a program.</p>
-                
-      <p>A program corresponds to the body of a block expression, except that the final expression
-                     may be omitted. If such is the case, the final expression is considered to be the empty sequence.
-                   
-      </p>
-                
-      <p>The program is evaluated like a block expression. The semantics are those of XQuery 3.0 or
-                     XQuery Update Facility 1.0, i.e.,
-                     its XDM value is the result of the program and the PUL it returns is applied
-      </p>
-                
-      <hr>
-      <p><b>Note:</b></p>
-                  
-      <p>The current XQUF specification only allows either a non-empty XDM or a non-empty PUL to be returned.</p>
-                
-      <hr>
-              
-              
-            
-      <h1><a name="id-extensions-to-prolog"></a>3. Extensions to the Prolog
-      </h1>
-              
-      
-              
-      <h2><a name="id-assignable-global-var"></a>3.1. Global Variable Declarations
-      </h2>
-                
-                <pre>
+    <p>A main module is redefined to be be a prolog followed by a program.</p>
+    <p>A program corresponds to the body of a block expression, except that the final expression may
+      be omitted. If such is the case, the final expression is considered to be the empty sequence. </p>
+    <p>The program is evaluated like a block expression. The semantics are those of XQuery 3.0 or
+      XQuery Update Facility 1.0, i.e., its XDM value is the result of the program and the PUL it
+      returns is applied </p>
+    <p><b>Note:</b></p>
+    <p>The current XQUF specification only allows either a non-empty XDM or a non-empty PUL to be
+      returned.</p>
+    <h1><a name="id-extensions-to-prolog"></a>3. Extensions to the Prolog </h1>
+    <h2><a name="id-assignable-global-var"></a>3.1. Global Variable Declarations </h2>
+    <pre>
 [unchanged] AnnotatedDecl ::= "declare" Annotation* (VarDecl | FunctionDecl)
     </pre><pre>
 [unchanged] Annotation : =  "%" EQName ( "(" Literal ("," Literal)* ")" ) ?
     </pre><pre>
-[unchanged] VarDecl	::= "variable" "$" VarName TypeDeclaration? ((":=" VarValue) | ("external" (":=" VarDefaultValue)?)))
+[unchanged] VarDecl ::= "variable" "$" VarName TypeDeclaration? ((":=" VarValue) | ("external" (":=" VarDefaultValue)?)))
     </pre>
-                
-                  <b>Definitions:</b>
-                      
-      <p>
-                           XQSX allows the built-in annotations %an:assignable and %an:nonassignable
-                           to be used in a Prolog variable declaration. If both annotations are used, a static error is raised.
-      </p>
-                      
-      <p>
-         [An <b>assignable prolog variable</b> is a global
-                           variable whose declaration specifies %an:assignable, and
-                           may have its
-                           value changed by an assign statement.]
-         
-      </p>
-                      
-      <p>
-         [An <b>unassignable prolog variable</b> is a global
-                           variable whose declaration specifies %an:nonassignable, and may not have its
-                           value changed by an assign statement.]
-         
-      </p>
-                      
-      <p>If an assignment qualifier is not used, the default is unassignable.
-                         
-      </p>
-                    
-                  <b>Composability Constraints:</b>
-                      
-      <p>The initializing expression of a prolog variable (whether assignable or not)
-                           must be a non-updating and non-sequential expression .
-      </p>
-                    
-                  <b>Semantics:</b>
-                    
-      <p>The semantics of declaring assignable variables are the same as the semantics of unassignable variables, except that
-                     the static type of an assignable variable without a declared type is always item()*.
-                       
-      </p>
-                  
-                
-              
-      
-      
-              
-      <h2><a name="id-function-decl"></a>3.2. Function Declarations
-      </h2>
-                
-                <pre>
+    <b>Definitions:</b>
+    <p> XQSX allows the built-in annotations %an:assignable and %an:nonassignable to be used in a
+      Prolog variable declaration. If both annotations are used, a static error is raised. </p>
+    <p> [An <b>assignable prolog variable</b> is a global variable whose declaration specifies
+      %an:assignable, and may have its value changed by an assign statement.] </p>
+    <p> [An <b>unassignable prolog variable</b> is a global variable whose declaration specifies
+      %an:nonassignable, and may not have its value changed by an assign statement.] </p>
+    <p>If an assignment qualifier is not used, the default is unassignable. </p>
+    <b>Composability Constraints:</b>
+    <p>The initializing expression of a prolog variable (whether assignable or not) must be a
+      non-updating and non-sequential expression . </p>
+    <b>Semantics:</b>
+    <p>The semantics of declaring assignable variables are the same as the semantics of unassignable
+      variables, except that the static type of an assignable variable without a declared type is
+      always item()*. </p>
+    <h2><a name="id-function-decl"></a>3.2. Function Declarations </h2>
+    <pre>
 33 - <a name="FunctionDecl" class="ext">FunctionDecl</a> ::= "function" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-EQName"; class="un">EQName</a> "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-ParamList"; class="un">ParamList</a>? ")"
                       ("as" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-SequenceType"; class="un">SequenceType</a>)? ("{" <a href="#StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a> "}" | "external"))
     </pre><pre>
@@ -561,74 +376,33 @@
     </pre><pre></pre><pre>
 4 - <a name="StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a> ::= <a href="#Statements" class="new">Statements</a> <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a>?
     </pre>
-                
-                  <b>Definitions:</b>
-                      
-      <p>
-                           XQSX allows the built-in annotations %an:sequential and %an:nonsequential
-                           to be used in a Prolog function declaration. If both annotations are used, a static error is raised.
-      </p>
-                      
-      <p>
-                           
-         [A <b>non-sequential function</b>
-                           is a function whose declaration specifies %an:nonsequential .
-                             ]
-         
-                           
-      </p>
-                      
-      <p>
-                           
-         [A <b>sequential function</b>
-                             is a function whose declaration specifies the annotation %an:sequential.]
-         
-                         
-      </p>
-                      
-      <p>If a qualifier is not used, the default is non-sequential.</p>
-                    
-                  <b>Composability Constraints:</b>
-                      
-      <p>A function body corresponds to a block expression, except that the final expression may be omitted
-                           (i.e., there are only statements). If such is the case,
-                           the final expression is considered to be the empty sequence. Therefore in the following explanations,
-                           we identify the function body with a block expression.
-      </p>
-                      
-      <p>
-                           The body of an non-sequential function
-                           must be a non-sequential expression, except if the only reason why the expression
-                           is sequential is that it contains an exit statement. Otherwise,
-                           a static error is raised.
-      </p>
-                    
-                  <b>Semantics:</b>
-                      
-      <p>The semantics of functions
-                           are as follows. The function body is evaluated like a block expression.
-                           Its result is determined
-                           by the first exit statement encountered during evaluation of the Block. 
-                           If no exit statement is encountered, the result of the function is the value returned by the block expression
-                           (an empty XDM and an empty PUL if the final expression is omitted).
-                           Other than that, the semantics is as defined
-                           in XQuery Update Facility 1.0.
-      </p>
-                    
-                
-              
-              
-            
-      <h1><a name="id-new-statements"></a>4. Statements
-      </h1>
-            
-            
-      <p>XQSX extends the XQuery 1.0 syntax
-                 by adding statements to the grammar. A statement may or may not have
-                 side effects, and does not return anything.
-                 There are the following kinds of statements:
-      </p>
-            <pre>
+    <b>Definitions:</b>
+    <p> XQSX allows the built-in annotations %an:sequential and %an:nonsequential to be used in a
+      Prolog function declaration. If both annotations are used, a static error is raised. </p>
+    <p> [A <b>non-sequential function</b> is a function whose declaration specifies
+      %an:nonsequential . ] </p>
+    <p> [A <b>sequential function</b> is a function whose declaration specifies the annotation
+      %an:sequential.] </p>
+    <p>If a qualifier is not used, the default is non-sequential.</p>
+    <b>Composability Constraints:</b>
+    <p>A function body corresponds to a block expression, except that the final expression may be
+      omitted (i.e., there are only statements). If such is the case, the final expression is
+      considered to be the empty sequence. Therefore in the following explanations, we identify the
+      function body with a block expression. </p>
+    <p> The body of an non-sequential function must be a non-sequential expression, except if the
+      only reason why the expression is sequential is that it contains an exit statement. Otherwise,
+      a static error is raised. </p>
+    <b>Semantics:</b>
+    <p>The semantics of functions are as follows. The function body is evaluated like a block
+      expression. Its result is determined by the first exit statement encountered during evaluation
+      of the Block. If no exit statement is encountered, the result of the function is the value
+      returned by the block expression (an empty XDM and an empty PUL if the final expression is
+      omitted). Other than that, the semantics is as defined in XQuery Update Facility 1.0. </p>
+    <h1><a name="id-new-statements"></a>4. Statements </h1>
+    <p>XQSX extends the XQuery 1.0 syntax by adding statements to the grammar. A statement may or
+      may not have side effects, and does not return anything. There are the following kinds of
+      statements: </p>
+    <pre>
 5 - <a name="Statement" class="new">Statement</a> ::=
       <a href="#ApplyStatement" class="new">ApplyStatement</a>
     | <a href="#AssignStatement" class="new">AssignStatement</a>
@@ -644,389 +418,178 @@
     | <a href="#VarDeclStatement" class="new">VarDeclStatement</a>
     | <a href="#WhileStatement" class="new">WhileStatement</a>
     </pre>
-            
-            <p>This part presents the statements that have no expression counterpart because they provide
-                 new semantic features.
-      </p>
-            
-            
-      <h2><a name="id-apply"></a>4.1. Apply Statement
-      </h2>
-              
-              <pre>
+    <p>This part presents the statements that have no expression counterpart because they provide
+      new semantic features. </p>
+    <h2><a name="id-apply"></a>4.1. Apply Statement </h2>
+    <pre>
 6 - <a name="ApplyStatement" class="new">ApplyStatement</a> ::= <a href="#ExprSimple" class="new">ExprSimple</a> ";"
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(none).</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>
-                         After the evaluation of SimpleExpr, the
-                         pending update list returned by
-                         this expression is applied (by upd:applyUpdates).
-                         The XDM instance
-                         returned by this expression is discarded.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>
-                         SimpleExpr is evaluated exactly once before the semantics of the Apply Statement is applied.
-                       
-      </p>
-                  
-              <b>Example:</b>
-                  <pre>
+    <b>Composability Constraints:</b>
+    <p>(none).</p>
+    <b>Semantics:</b>
+    <p> After the evaluation of SimpleExpr, the pending update list returned by this expression is
+      applied (by upd:applyUpdates). The XDM instance returned by this expression is discarded. </p>
+    <b>Evaluation order:</b>
+    <p> SimpleExpr is evaluated exactly once before the semantics of the Apply Statement is applied. </p>
+    <b>Example:</b>
+    <pre>
 delete nodes ($user, $items, $bids);
             </pre>
-                
-              
-            
-            
-            <h2><a name="id-assignment"></a>4.2. Assignment Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-assignment"></a>4.2. Assignment Statement </h2>
+    <pre>
 7 - <a name="AssignStatement" class="new">AssignStatement</a> ::= "$" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-VarName"; class="un">VarName</a> ":=" <a href="#ExprSingle" class="ext">ExprSingle</a> ";"
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>The operand must be non-updating.</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The variable on the left-hand side of the assignment must be in scope and declared assignable, otherwise a
-                         static error  is raised. In particular, it must have been declared
-                         by a variable declaration, local or in the prolog.
-      </p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>Variables bound in FLWOR, typeswitch, or quantified expressions or statements, as well as function
-                           parameters, may not appear
-                           on the left-hand side of an assignment.
-      </p>
-                    
-      <hr>
-                    
-      <p>
-                         The expression on the right-hand side is evaluated,
-                         resulting in an XDM instance.
-                       
-      </p>
-                    
-      <p>If the XDM instance
-                         returned by the expression on the right-hand side does not match the declared type
-                         of the variable according to SequenceType matching rules,
-                         a type error is raised . 
-                         If the types match, the XDM instance
-                         returned by the expression is bound to the variable (added to variable values
-                         in the dynamic context.)
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>
-                         The operand expression is evaluated exactly once before the semantics of the Assignment Statement is applied.
-                       
-      </p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p>The operand must be non-updating.</p>
+    <b>Semantics:</b>
+    <p>The variable on the left-hand side of the assignment must be in scope and declared
+      assignable, otherwise a static error is raised. In particular, it must have been declared by a
+      variable declaration, local or in the prolog. </p>
+    <p><b>Note:</b></p>
+    <p>Variables bound in FLWOR, typeswitch, or quantified expressions or statements, as well as
+      function parameters, may not appear on the left-hand side of an assignment. </p>
+    <p> The expression on the right-hand side is evaluated, resulting in an XDM instance. </p>
+    <p>If the XDM instance returned by the expression on the right-hand side does not match the
+      declared type of the variable according to SequenceType matching rules, a type error is raised
+      . If the types match, the XDM instance returned by the expression is bound to the variable
+      (added to variable values in the dynamic context.) </p>
+    <b>Evaluation order:</b>
+    <p> The operand expression is evaluated exactly once before the semantics of the Assignment
+      Statement is applied. </p>
+    <b>Example:</b>
+    <pre>
 $result := "Bidding exceeded 60000";
               </pre>
-                  
-              
-            
-            
-      
-            
-            <h2><a name="id-break"></a>4.3. Break Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-break"></a>4.3. Break Statement </h2>
+    <pre>
 9 - <a name="BreakStatement" class="new">BreakStatement</a> ::= "break" "loop" ";"
     </pre>
-              
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>A break statement interrupts the execution of the innermost while or FLWOR statement. The execution
-                       of the program continues as if the execution of the while or FLWOR statement had properly finished.
-      </p>
-                    
-      <p>A static error is raised if there is no enclosing while or FLWOR statement.</p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>A break statement does not interfere with a FLWOR expression, only with FLWOR statements.</p>
-                    
-      <hr>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>A break statement interrupts the execution of the innermost while or FLWOR statement. The
+      execution of the program continues as if the execution of the while or FLWOR statement had
+      properly finished. </p>
+    <p>A static error is raised if there is no enclosing while or FLWOR statement.</p>
+    <p><b>Note:</b></p>
+    <p>A break statement does not interfere with a FLWOR expression, only with FLWOR statements.</p>
+    <b>Example:</b>
+    <pre>
 break loop;              </pre>
-                  
-              
-            
-            
-            
-            
-            <h2><a name="id-continue"></a>4.4. Continue Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-continue"></a>4.4. Continue Statement </h2>
+    <pre>
 10 - <a name="ContinueStatement" class="new">ContinueStatement</a> ::= "continue" "loop" ";"
     </pre>
-              
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>A continue statement interrupts the current execution of the operand or return statement of the
-                         innermost while or FLWOR statement.
-                         In the case of a while statement, the resumes with a new evaluation of the test expression and,
-                         possibly, of the inner statement. In the case of a FLWOR statement, the execution resumes with
-                         the next tuple.
-                       
-      </p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>A continue statement does not interfere with a FLWOR expression, only with FLWOR statements.</p>
-                    
-      <hr>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>A continue statement interrupts the current execution of the operand or return statement of
+      the innermost while or FLWOR statement. In the case of a while statement, the resumes with a
+      new evaluation of the test expression and, possibly, of the inner statement. In the case of a
+      FLWOR statement, the execution resumes with the next tuple. </p>
+    <p><b>Note:</b></p>
+    <p>A continue statement does not interfere with a FLWOR expression, only with FLWOR
+      statements.</p>
+    <b>Example:</b>
+    <pre>
 continue loop;              </pre>
-                  
-              
-            
-            
-            
-            
-            <h2><a name="id-exit"></a>4.5. Exit Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-exit"></a>4.5. Exit Statement </h2>
+    <pre>
 11 - <a name="ExitStatement" class="new">ExitStatement</a> ::= "exit" "returning" <a href="#ExprSingle" class="ext">ExprSingle</a> ";"
     </pre>
-              
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>An exit statement serves to define the result of the enclosing function or query body.</p>
-                    
-      <p>
-                         The operand expression of the exit expression is evaluated, resulting in an
-                         XDM instance
-                         and a pending update list.
-                       
-      </p>
-                    
-      <p>If an exit statement is evaluated within the body of a function,
-                         further evaluation of the function body is interrupted and the
-                         XDM instance and
-                         pending update list returned by
-                         the operand expression are returned as the result of the function call.
-      </p>
-                    
-      <p>If an exit statement is evaluated within a query body
-                         (i.e., not within the body of a function), further evaluation of the query
-                         is interrupted and the XDM instance and
-                         pending update list
-                         returned by the operand expression are returned as the result of the query.
-      </p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>An exit statement in a block terminates evaluation of the
-                           enclosing function body or program, not just the immediately enclosing block.
-      </p>
-                    
-      <hr>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>
-                         The operand expression is evaluated exactly once before the semantics of the Exit Statement is applied.
-                         Subsequent expressions or statements within the enclosing function body or query are not evaluated at all.
-                       
-      </p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>An exit statement serves to define the result of the enclosing function or query body.</p>
+    <p> The operand expression of the exit expression is evaluated, resulting in an XDM instance and
+      a pending update list. </p>
+    <p>If an exit statement is evaluated within the body of a function, further evaluation of the
+      function body is interrupted and the XDM instance and pending update list returned by the
+      operand expression are returned as the result of the function call. </p>
+    <p>If an exit statement is evaluated within a query body (i.e., not within the body of a
+      function), further evaluation of the query is interrupted and the XDM instance and pending
+      update list returned by the operand expression are returned as the result of the query. </p>
+    <p><b>Note:</b></p>
+    <p>An exit statement in a block terminates evaluation of the enclosing function body or program,
+      not just the immediately enclosing block. </p>
+    <b>Evaluation order:</b>
+    <p> The operand expression is evaluated exactly once before the semantics of the Exit Statement
+      is applied. Subsequent expressions or statements within the enclosing function body or query
+      are not evaluated at all. </p>
+    <b>Example:</b>
+    <pre>
 exit returning local:error(concat("You cannot use the ",
                                   $request/method,
                                   " method with this URL."));              </pre>
-                  
-              
-            
-      
-            <h2><a name="id-vardecl-statement"></a>4.6. Variable Declaration Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-vardecl-statement"></a>4.6. Variable Declaration Statement </h2>
+    <pre>
 20 - <a name="VarDeclStatement" class="new">VarDeclStatement</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Annotation"; class="un">Annotation</a>* "variable" "$" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-VarName"; class="un">VarName</a> <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-TypeDeclaration"; class="un">TypeDeclaration</a>? (":=" <a href="#ExprSingle" class="ext">ExprSingle</a>)?
     ("," "$" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-VarName"; class="un">VarName</a> <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-TypeDeclaration"; class="un">TypeDeclaration</a>? (":=" <a href="#ExprSingle" class="ext">ExprSingle</a>)?)* ";"
     </pre>
-              <p>
-         [The expression on
-                   the right-hand side of a variable declaration is called an
-                   <b>initializing expression</b>.]
-         
-      </p>
-              
-      <p>
-         [The <b>scope expression</b> of a variable declaration
-                   is the innermost block expression, control flow clause (then/else clause,
-                   Switch/Typeswitch/FLWOR return clause, while body clause), function body or program
-                   containing the variable declaration expression.]
-         
-      </p>
-              
-                <b>Composability Constraints:</b>
-                   
-      <p>The initializing expression must be non-updating.</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>A variable declaration defines a local variable whose scope
-                         is the remainder of its scope expression (not including its initializing expression). 
-                         The variable defined in a variable declaration occludes (hides)
-                         any variable of the same name that is in scope at the location where the innermost block appears.
-      </p>
-                    
-      <p>The variable may be annotated as assignable or as unassignable. By default, it is assignable.
-                         It may only be modified by assignment
-                         statements if it is assignable.
-      </p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>The default for local variable declarations is different from variables declared in the prolog.
-                         The latter are unassignable if there is no annotation.
-      </p>
-                    
-      <hr>
-                    
-      <p>It is a static error  if two or more variables declared in the same scope expression
-                         have the same expanded QName.
-      </p>
-                    
-      <p>The type of each declared variable is added to in-scope variables
-                         in the static context of subsequent expressions in the enclosing block, function body or program. 
-                         If a variable has both an explicit type declaration and an
-                         initializing expression,
-                         the value of the initializing expression must match
-                         the declared type according to SequenceType matching rules; otherwise a type error is raised .
-                         If no explicit type is declared and the variable is assignable, the type of the variable is item()*.
-                         If no explicit type is declared and the variable is unassignable, the type is statically inferred from the
-         initializing expression.
-      </p>
-                    
-      <p>The block variable declaration evaluates its initializing expression
-                         and binds the resulting XDM instance to the variable values in
-                         the dynamic context of subsequent expressions in the enclosing block, function body or program.
-                         If no initializing expression is present, the variable has no initial value. 
-                         A reference to a variable, other than on the left-hand side of an assignment expression,
-                         is an error if the variable has no value in variable values
-                         when the reference is evaluated .
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>
-                         The operand expression is evaluated exactly once before the semantics of the Declaration Statement is applied.
-                       
-      </p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <p> [The expression on the right-hand side of a variable declaration is called an
+        <b>initializing expression</b>.] </p>
+    <p> [The <b>scope expression</b> of a variable declaration is the innermost block expression,
+      control flow clause (then/else clause, Switch/Typeswitch/FLWOR return clause, while body
+      clause), function body or program containing the variable declaration expression.] </p>
+    <b>Composability Constraints:</b>
+    <p>The initializing expression must be non-updating.</p>
+    <b>Semantics:</b>
+    <p>A variable declaration defines a local variable whose scope is the remainder of its scope
+      expression (not including its initializing expression). The variable defined in a variable
+      declaration occludes (hides) any variable of the same name that is in scope at the location
+      where the innermost block appears. </p>
+    <p>The variable may be annotated as assignable or as unassignable. By default, it is assignable.
+      It may only be modified by assignment statements if it is assignable. </p>
+    <p><b>Note:</b></p>
+    <p>The default for local variable declarations is different from variables declared in the
+      prolog. The latter are unassignable if there is no annotation. </p>
+    <p>It is a static error if two or more variables declared in the same scope expression have the
+      same expanded QName. </p>
+    <p>The type of each declared variable is added to in-scope variables in the static context of
+      subsequent expressions in the enclosing block, function body or program. If a variable has
+      both an explicit type declaration and an initializing expression, the value of the
+      initializing expression must match the declared type according to SequenceType matching rules;
+      otherwise a type error is raised . If no explicit type is declared and the variable is
+      assignable, the type of the variable is item()*. If no explicit type is declared and the
+      variable is unassignable, the type is statically inferred from the initializing expression. </p>
+    <p>The block variable declaration evaluates its initializing expression and binds the resulting
+      XDM instance to the variable values in the dynamic context of subsequent expressions in the
+      enclosing block, function body or program. If no initializing expression is present, the
+      variable has no initial value. A reference to a variable, other than on the left-hand side of
+      an assignment expression, is an error if the variable has no value in variable values when the
+      reference is evaluated . </p>
+    <b>Evaluation order:</b>
+    <p> The operand expression is evaluated exactly once before the semantics of the Declaration
+      Statement is applied. </p>
+    <b>Example:</b>
+    <pre>
 variable $uid := doc("users.xml")/users/user_tuple
                  [name = "Roger Smith"]/userid;              </pre>
-                  
-              
-            
-            
-            
-            
-            <h2><a name="id-while-statement"></a>4.7. While Statement
-      </h2>
-              
-              <pre>
+    <h2><a name="id-while-statement"></a>4.7. While Statement </h2>
+    <pre>
 21 - <a name="WhileStatement" class="new">WhileStatement</a> ::= "while" "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a> ")" <a href="#Statement" class="new">Statement</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>
-         [The expression enclosed in the
-                         parentheses of a while expression is called a <b>test expression</b>.]
-         
-      </p>
-                      
-      <p>The test expression must be non-updating.</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The while statement is used for conditional iteration.  It is evaluated as follows:</p>
-                    
-      <p>
-                         The test expression is evaluated, resulting in an
-                         XDM instance.
-                       
-      </p>
-                    
-      <p>
-                         If the effective Boolean value of the test expression
-                         is false, the block is not evaluated. If the effective Boolean value of the
-                         test expression is true, the statement is evaluated repeatedly. 
-                         Each evaluation of the statement may cause side effects that affect the result of re-evaluating the
-                         test expression. 
-                         The test expression is re-evaluated after each evaluation of the statement. 
-                         This process continues until the effective Boolean value of the test expression
-                         is evaluated to be false.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>
-                         The test expression is evaluated once. Then if the EBV of the test expression is true, the statement is executed
-         exactly once and the test expression is evaluated again. These steps are repeated until the EBV of the test expression is
-         false.
-                       
-      </p>
-                  
-                <b>Example:</b>
-                    
-      <p>In the following query, a while statement is used to compute a sequence
-                         containing all the Fibonacci numbers that are less than 100.
-      </p>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p> [The expression enclosed in the parentheses of a while expression is called a <b>test
+        expression</b>.] </p>
+    <p>The test expression must be non-updating.</p>
+    <b>Semantics:</b>
+    <p>The while statement is used for conditional iteration. It is evaluated as follows:</p>
+    <p> The test expression is evaluated, resulting in an XDM instance. </p>
+    <p> If the effective Boolean value of the test expression is false, the block is not evaluated.
+      If the effective Boolean value of the test expression is true, the statement is evaluated
+      repeatedly. Each evaluation of the statement may cause side effects that affect the result of
+      re-evaluating the test expression. The test expression is re-evaluated after each evaluation
+      of the statement. This process continues until the effective Boolean value of the test
+      expression is evaluated to be false. </p>
+    <b>Evaluation order:</b>
+    <p> The test expression is evaluated once. Then if the EBV of the test expression is true, the
+      statement is executed exactly once and the test expression is evaluated again. These steps are
+      repeated until the EBV of the test expression is false. </p>
+    <b>Example:</b>
+    <p>In the following query, a while statement is used to compute a sequence containing all the
+      Fibonacci numbers that are less than 100. </p>
+    <pre>
 variable $a as xs:integer := 0;
 variable $b as xs:integer := 1;  
 variable $c as xs:integer := $a + $b;
@@ -1039,80 +602,41 @@
   $c := $a + $b;
 }
               </pre>
-                  
-              
-            
-      
-          <h1><a name="id-statements-expressions"></a>5. Statement counterparts of existing expressions
-      </h1>
-            
-            
-      <p>XQSX defines statement counterparts for control flow
-               expressions (FLWOR, IfThenElse, Switch, Typeswitch, Trycatch). It also defines an evaluation order
-               for statements and sequential expressions. An expression or statement following another according
-               to this evaluation order sees the side effects of this other expression or statement.
-      </p>
-      
-            
-      <p>Composability Contraints for updating expressions that are operands of any expressions defined in XQUF
-                 are extended to
-                 operand expressions of their statement counterparts (non-return expressions in FLWOR statements, test expressions
-         in
-                 conditional statements, switch statements and typeswitch statements).
-      </p>
-            
-            
-      <h2><a name="id-flwor-statement"></a>5.1. FLWOR Statements and Expressions
-      </h2>
-              
-                
-      <p>In addition to FLWOR Expressions, XQSX introduces FLWOR Statements,
-                     defined like FLWOR Expressions except that the final clause is
-                     a statement.
-      </p>
-                <pre>
+    <h1><a name="id-statements-expressions"></a>5. Statement counterparts of existing expressions </h1>
+    <p>XQSX defines statement counterparts for control flow expressions (FLWOR, IfThenElse, Switch,
+      Typeswitch, Trycatch). It also defines an evaluation order for statements and sequential
+      expressions. An expression or statement following another according to this evaluation order
+      sees the side effects of this other expression or statement. </p>
+    <p>Composability Contraints for updating expressions that are operands of any expressions
+      defined in XQUF are extended to operand expressions of their statement counterparts
+      (non-return expressions in FLWOR statements, test expressions in conditional statements,
+      switch statements and typeswitch statements). </p>
+    <h2><a name="id-flwor-statement"></a>5.1. FLWOR Statements and Expressions </h2>
+    <p>In addition to FLWOR Expressions, XQSX introduces FLWOR Statements, defined like FLWOR
+      Expressions except that the final clause is a statement. </p>
+    <pre>
 12 - <a name="FLWORStatement" class="new">FLWORStatement</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-InitialClause"; class="un">InitialClause</a> <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-IntermediateClause"; class="un">IntermediateClause</a>* <a href="#DoStatement" class="new">ReturnStatement</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>
-                           The XQUF specification currently forbids clauses other than return clauses of a FLWOR expression to be updating.
-                           Furthermore, it specifies that the category (updating or not) of a FLWOR expression is
-                           the same as that of its return clause.
-                         
-      </p>
-                    
-      <hr>
-                    
-      <p>The expressions in the window-start, window-end, order-by, group-by, where and count clauses must be
-                       non-sequential.
-      </p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics of FLWOR Expressions is unchanged.</p>
-                    
-      <p>For FLWOR Statements, the input tuple stream is generated as described in XQuery 3.0.
-                         The return statement is then executed for each tuple in its input tuple stream,
-                         using the variable bindings in the respective tuples.
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>Each FLWOR clause is evaluated exactly once, one after the other, from left to right.
-                         In the evaluation of the first clause, the operand expression is evaluated exactly once.
-                         In the evaluation of each other clause, the operand expression is evaluated exactly once for every tuple in
-         the input stream produced
-                         by the former clause, in the exact same order as in the stream.
-                         
-      </p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p><b>Note:</b></p>
+    <p> The XQUF specification currently forbids clauses other than return clauses of a FLWOR
+      expression to be updating. Furthermore, it specifies that the category (updating or not) of a
+      FLWOR expression is the same as that of its return clause. </p>
+    <p>The expressions in the window-start, window-end, order-by, group-by, where and count clauses
+      must be non-sequential. </p>
+    <b>Semantics:</b>
+    <p>The semantics of FLWOR Expressions is unchanged.</p>
+    <p>For FLWOR Statements, the input tuple stream is generated as described in XQuery 3.0. The
+      return statement is then executed for each tuple in its input tuple stream, using the variable
+      bindings in the respective tuples. </p>
+    <b>Evaluation order:</b>
+    <p>Each FLWOR clause is evaluated exactly once, one after the other, from left to right. In the
+      evaluation of the first clause, the operand expression is evaluated exactly once. In the
+      evaluation of each other clause, the operand expression is evaluated exactly once for every
+      tuple in the input stream produced by the former clause, in the exact same order as in the
+      stream. </p>
+    <b>Example:</b>
+    <pre>
 for $book in book:search($eventNode/preceding-sibling::xhtml:input[1])
 return 
 insert node
@@ -1123,8 +647,8 @@
 &lt;/xhtml:tr&gt;
 as last into $table;
               </pre>
-                    <p>The same with bulk updates:</p>
-                    <pre>
+    <p>The same with bulk updates:</p>
+    <pre>
 (for $book in book:search($eventNode/preceding-sibling::xhtml:input[1])
 return 
 insert node
@@ -1135,55 +659,26 @@
 &lt;/xhtml:tr&gt;
 as last into $table);
               </pre>
-                  
-              
-            
-            
-            <h2><a name="id-if-statement"></a>5.2. Conditional Statements and Expressions
-      </h2>
-              
-              
-      <p>In addition to Conditional Expressions, XQSX introduces Conditional Statements,
-                   defined like Conditional Expressions except that the then and the else clause are
-                   statements.
-      </p>
-              <pre>
+    <h2><a name="id-if-statement"></a>5.2. Conditional Statements and Expressions </h2>
+    <p>In addition to Conditional Expressions, XQSX introduces Conditional Statements, defined like
+      Conditional Expressions except that the then and the else clause are statements. </p>
+    <pre>
 14 - <a name="IfStatement" class="new">IfStatement</a> ::= "if" "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a> ")" "then" <a href="#Statement" class="new">Statement</a> "else" <a href="#Statement" class="new">Statement</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>
-                           The XQUF specification currently forbids the test expression to be updating.
-                         
-      </p>
-                    
-      <hr>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics of Conditional Expressions is unchanged.</p>
-                    
-      <p>For Conditional Statements, the test expression is evaluated.
-                         If the EBV of its returned XDM is true, then the then statement is executed,
-                         otherwise the else statement is executed.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The test expression is evaluated exactly once. Then, depending on the EBV of the test expression, either the then clause or
-         the
-                         else clause (but not both) is evaluated, exactly once.
-      </p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p><b>Note:</b></p>
+    <p> The XQUF specification currently forbids the test expression to be updating. </p>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>The semantics of Conditional Expressions is unchanged.</p>
+    <p>For Conditional Statements, the test expression is evaluated. If the EBV of its returned XDM
+      is true, then the then statement is executed, otherwise the else statement is executed. </p>
+    <b>Evaluation order:</b>
+    <p>The test expression is evaluated exactly once. Then, depending on the EBV of the test
+      expression, either the then clause or the else clause (but not both) is evaluated, exactly
+      once. </p>
+    <b>Example:</b>
+    <pre>
 if($newbid &lt;= 60000) then {
   insert nodes
   &lt;bid_tuple&gt;
@@ -1199,150 +694,69 @@
   $maximumExceeded := true();
 }
               </pre>
-                  
-              
-            
-      
-            <h2><a name="id-switch-statement"></a>5.3. Switch Statements and Expressions
-      </h2>
-              
-              
-      <p>In addition to Switch Expressions, XQSX introduces Switch Statements,
-                   defined like Switch Expressions except that the return clauses are
-                   statements.
-      </p>
-              <pre>
+    <h2><a name="id-switch-statement"></a>5.3. Switch Statements and Expressions </h2>
+    <p>In addition to Switch Expressions, XQSX introduces Switch Statements, defined like Switch
+      Expressions except that the return clauses are statements. </p>
+    <pre>
 15 - <a name="SwitchStatement" class="new">SwitchStatement</a> ::= "switch" "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a> ")" <a href="#SwitchCaseStatement" class="new">SwitchCaseStatement</a>+ "default" "return" <a href="#Statement" class="new">Statement</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>The XQUF specification does not yet take into account the switch expressions introduced in XQuery 3.0.
-                           It is outside of the scope of this XQuery Scripting specification to do so, but until the XQUF 3.0 specification
-                           is ready we consider that all operand expressions must be non-updating.
-      </p>
-                    
-      <hr>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics of Switch Expressions is unchanged.</p>
-                    
-      <p>For Switch Statements, the return statement in the effective
-                         case is executed.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The test expression is evaluated exactly once. Then, only the return clause in the effective case is evaluated, exactly once.</p>
-                  
-              
-            
-            
-            
-      <h2><a name="id-trycatch-statement"></a>5.4. Try-Catch Statements and Expressions
-      </h2>
-              
-              
-      <p>In addition to Try-Catch Expressions, XQSX introduces Try-Catch Statements,
-                   defined like Try-Catch Expressions except that the try and catch clauses are
-                   statements.
-      </p>
-              <pre>
+    <b>Composability Constraints:</b>
+    <p><b>Note:</b></p>
+    <p>The XQUF specification does not yet take into account the switch expressions introduced in
+      XQuery 3.0. It is outside of the scope of this XQuery Scripting specification to do so, but
+      until the XQUF 3.0 specification is ready we consider that all operand expressions must be
+      non-updating. </p>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>The semantics of Switch Expressions is unchanged.</p>
+    <p>For Switch Statements, the return statement in the effective case is executed. </p>
+    <b>Evaluation order:</b>
+    <p>The test expression is evaluated exactly once. Then, only the return clause in the effective
+      case is evaluated, exactly once.</p>
+    <h2><a name="id-trycatch-statement"></a>5.4. Try-Catch Statements and Expressions </h2>
+    <p>In addition to Try-Catch Expressions, XQSX introduces Try-Catch Statements, defined like
+      Try-Catch Expressions except that the try and catch clauses are statements. </p>
+    <pre>
 17 - <a name="TryCatchStatement" class="new">TryCatchStatement</a> ::= "try" <a href="#BlockStatement" class="new">BlockStatement</a> ("catch" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-CatchErrorList"; class="un">CatchErrorList</a> <a href="#BlockStatement" class="new">BlockStatement</a>)+
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>The XQUF specification does not yet take into account the try-catch expressions introduced in XQuery 3.0.
-                           It is outside of the scope of this XQuery Scripting specification to do so, but until XQUF 3.0 is ready
-                           we will consider that try and catch expressions must be either all updating or all non-updating.
-      </p>
-                    
-      <hr>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics of Try-Catch Expressions is unchanged.</p>
-                    
-      <p>For Try-Catch Statements, the try statement is executed.
-                         If this execution raises a dynamic error or a type error, the first catch statement
-                         that "matches" the error value is executed.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                   
-      <p>If no error is dynamic or type error is raised during the evaluation of the try clause,
-                      no catch clause gets executed. Otherwise, the execution of the try clause is interrupted when
-                      this error is raised, and only the first catch statement that "matches" the error value is executed,
-                      exactly once.
-      </p>
-                 
-              
-            
-            
-            
-      <h2><a name="id-typeswitch-statement"></a>5.5. Typeswitch Statements and Expressions
-      </h2>
-              
-              
-      <p>In addition to Typeswitch Expressions, XQSX introduces Typeswitch Statements,
-                   defined like Typeswitch Expressions except that the clauses are
-                   statements.
-      </p>
-              <pre>
+    <b>Composability Constraints:</b>
+    <p><b>Note:</b></p>
+    <p>The XQUF specification does not yet take into account the try-catch expressions introduced in
+      XQuery 3.0. It is outside of the scope of this XQuery Scripting specification to do so, but
+      until XQUF 3.0 is ready we will consider that try and catch expressions must be either all
+      updating or all non-updating. </p>
+    <b>Semantics:</b>
+    <p>The semantics of Try-Catch Expressions is unchanged.</p>
+    <p>For Try-Catch Statements, the try statement is executed. If this execution raises a dynamic
+      error or a type error, the first catch statement that "matches" the error value is executed. </p>
+    <b>Evaluation order:</b>
+    <p>If no error is dynamic or type error is raised during the evaluation of the try clause, no
+      catch clause gets executed. Otherwise, the execution of the try clause is interrupted when
+      this error is raised, and only the first catch statement that "matches" the error value is
+      executed, exactly once. </p>
+    <h2><a name="id-typeswitch-statement"></a>5.5. Typeswitch Statements and Expressions </h2>
+    <p>In addition to Typeswitch Expressions, XQSX introduces Typeswitch Statements, defined like
+      Typeswitch Expressions except that the clauses are statements. </p>
+    <pre>
 18 - <a name="TypeswitchStatement" class="new">TypeswitchStatement</a> ::= "typeswitch" "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a> ")" <a href="#CaseStatement" class="new">CaseStatement</a>+ "default" ("$" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-VarName"; class="un">VarName</a>)? "return" <a href="#Statement" class="new">Statement</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>
-                           The XQUF specification currently forbids the operand expressions of a typeswitch expression to be updating.
-                         
-      </p>
-                    
-      <hr>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics of Typeswitch Expressions is unchanged.</p>
-                    
-      <p>For Typeswitch Statements, the return statement in the effective
-                         case is executed.
-                       
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The test expression is evaluated exactly once. Then, only the return clause in the effective case is evaluated, exactly once.</p>
-                  
-              
-            
-            
-            
-      <h2><a name="id-block-statement"></a>5.6. Block Statements and Expressions
-      </h2>
-              
-              
-      <p>A block statement is a concatenation of zero, one or more statements, surrounded by curly braces.</p>
-              
-      <p>A block expression is a concatenation of zero, one or more statements and one expression, surrounded by curly braces.</p>
-              <pre>
+    <b>Composability Constraints:</b>
+    <p><b>Note:</b></p>
+    <p> The XQUF specification currently forbids the operand expressions of a typeswitch expression
+      to be updating. </p>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>The semantics of Typeswitch Expressions is unchanged.</p>
+    <p>For Typeswitch Statements, the return statement in the effective case is executed. </p>
+    <b>Evaluation order:</b>
+    <p>The test expression is evaluated exactly once. Then, only the return clause in the effective
+      case is evaluated, exactly once.</p>
+    <h2><a name="id-block-statement"></a>5.6. Block Statements and Expressions </h2>
+    <p>A block statement is a concatenation of zero, one or more statements, surrounded by curly
+      braces.</p>
+    <p>A block expression is a concatenation of zero, one or more statements and one expression,
+      surrounded by curly braces.</p>
+    <pre>
 31 - <a name="PrimaryExpr" class="ext">PrimaryExpr</a> ::=
       <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Literal"; class="un">Literal</a>
   |   <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-VarRef"; class="un">VarRef</a>
@@ -1363,25 +777,17 @@
     </pre><pre>
 8 - <a name="BlockStatement" class="new">BlockStatement</a> ::= "{" <a href="#Statements" class="new">Statements</a> "}"
     </pre>
-              
-                <b>Composability Constraints:</b>
-                      
-      <p>If the final expression is non-updating, the block expression is non-updating.
-                         If the final expression is updating, the block expression is updating.
-      </p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>Each statement, as well as the final expression if any, is evaluated.</p>
-                    
-      <p>The result of a block expression is the XDM and PUL returned by its final expression.</p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The statements (and the final expression for a Block Expression) are evaluated in the order they appear.</p>
-                  
-                <b>Example:</b>
-                    <pre>
+    <b>Composability Constraints:</b>
+    <p>If the final expression is non-updating, the block expression is non-updating. If the final
+      expression is updating, the block expression is updating. </p>
+    <b>Semantics:</b>
+    <p>Each statement, as well as the final expression if any, is evaluated.</p>
+    <p>The result of a block expression is the XDM and PUL returned by its final expression.</p>
+    <b>Evaluation order:</b>
+    <p>The statements (and the final expression for a Block Expression) are evaluated in the order
+      they appear.</p>
+    <b>Example:</b>
+    <pre>
 {
 variable $uid := doc("users.xml")/users/user_tuple[name = "Roger Smith"]/userid;
 variable $topbid := max(doc("bids.xml")/bids/bid_tuple[itemno = 1002]/bid);
@@ -1399,20 +805,10 @@
 &lt;new_bid&gt;{ $newbid }&lt;/new_bid&gt;
 }
               </pre>
-                  
-              
-            
-          <h1><a name="id-expr-changes"></a>6. Changes to existing expressions
-      </h1>
-            
-            
-            
-      <h2><a name="id-node-constructors-statements"></a>6.1. Direct and Computed Node Constructors
-      </h2>
-              
-              
-      <p>Node constructors are extended to allow statements in their content.</p>
-              <pre>
+    <h1><a name="id-expr-changes"></a>6. Changes to existing expressions </h1>
+    <h2><a name="id-node-constructors-statements"></a>6.1. Direct and Computed Node Constructors </h2>
+    <p>Node constructors are extended to allow statements in their content.</p>
+    <pre>
 24 - <a name="CommonContent" class="ext">CommonContent</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-PredefinedEntityRef"; class="un">PredefinedEntityRef</a> | <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-CharRef"; class="un">CharRef</a> | "{{" | "}}" | <a href="#BlockExpr" class="new">BlockExpr</a>
 </pre><pre>
 25 - <a name="ContentExpr" class="ext">ContentExpr</a> ::= <a href="#StatementsAndExpr" class="new">StatementsAndExpr</a>
@@ -1427,174 +823,80 @@
 
 30 - CompTextConstructor ::= "text" <a href="#BlockExpr" class="new">BlockExpr</a>
     </pre>
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(none)</p>
-                  
-                <b>Semantics:</b>
-                    
-      <p>The semantics are the same as in XQuery 3.0.</p>
-                    
-      <p>The block expression is evaluated as such and its results are used
-                       as specified in XQuery 3.0.
-      </p>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The operands are evaluated from left to right.</p>
-                  
-              
-            
-            
-      <h2><a name="id-predicate-quantified"></a>6.2. Filter and quantified expressions.
-      </h2>
-              
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>
-                         The expression in square brackets in a filter expression, as well as the conditional expression (second operand)
-         in a quantified expression, must be non-sequential.
-                       
-      </p>
-                    
-      <hr>
-      <p><b>Note:</b></p>
-                      
-      <p>
-                           The motivation behind this restriction is that their operands can be converted to where clauses in FLWOR
-         expressions in the query plan.
-                         
-      </p>
-                    
-      <hr>
-                  
-                <b>Evaluation order:</b>
-                    
-      <p>The base expression in a filter expression is evaluated exactly once.</p>
-                    
-      <p>The base expression (first operand) in a quantified expression is evaluated exactly once.</p>
-                  
-              
-            
-            
-      <h2><a name="id-other-expr"></a>6.3. Other Expressions
-      </h2>
-              
-              
-      <p>
-                   All expressions not listed above are extended as follows.
-                   This includes the following kinds of expressions:
-                 
-      </p>
-              
-      <ul>
-         <li>
-                        
-            <p>Path expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Concatenation expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Function calls</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Range expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Transform expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Union, intersect, and except expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Arithmetic, comparison, and logical expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Ordered and unordered expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Instance of, cast, castable, and treat expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Validate expressions</p>
-                      
-         </li>
-         <li>
-                        
-            <p>Extension expressions (pragmas)</p>
-                      
-         </li>
-      </ul>
-              
-                <b>Composability Constraints:</b>
-                    
-      <p>(node)</p>
-                  
-                <b>Evaluation Order:</b>
-                    
-      <p>
-                         Operand expressions are evaluated from left to right, bottom-up in the expression tree (i.e., in a function
-         call,
-                         the parameters are evaluated before the function body is evaluated).
-                       
-      </p>
-                  
-              
-              
-      <hr>
-      <p><b>Note:</b></p>
-                
-      <p>
-                     Since insert, delete, replace and rename are updating expressions, their operands must be non-effecting,
-                     such that the evaluation order is irrelevant
-                     for them.
-                   
-      </p>
-              
-      <hr>
-              
-      <hr>
-      <p><b>Note:</b></p>
-                
-      <p>
-                     In transform expressions, since the modify clause must be updating (or vacuous) according to XQUF,
-                     it must also be non-sequential. Furthermore, XQUF specifies that the return clause sees that the side-effect
-                     of applying the PUL returned by the modify expression is visible to the return expression.
-                   
-      </p>
-              
-      <hr>
-            
-          
-      <h1><a name="id-example"></a>7. Example
-      </h1>
-            
-            
-      <p>The following function returns true or false
-                  according to whether its parameter is a known user name, and logs the event:
-      </p>
-            <pre>declare %an:sequential function validate-and-log($username as xs:string)
+    <b>Composability Constraints:</b>
+    <p>(none)</p>
+    <b>Semantics:</b>
+    <p>The semantics are the same as in XQuery 3.0.</p>
+    <p>The block expression is evaluated as such and its results are used as specified in XQuery
+      3.0. </p>
+    <b>Evaluation order:</b>
+    <p>The operands are evaluated from left to right.</p>
+    <h2><a name="id-predicate-quantified"></a>6.2. Filter and quantified expressions. </h2>
+    <b>Composability Constraints:</b>
+    <p> The expression in square brackets in a filter expression, as well as the conditional
+      expression (second operand) in a quantified expression, must be non-sequential. </p>
+    <p><b>Note:</b></p>
+    <p> The motivation behind this restriction is that their operands can be converted to where
+      clauses in FLWOR expressions in the query plan. </p>
+    <b>Evaluation order:</b>
+    <p>The base expression in a filter expression is evaluated exactly once.</p>
+    <p>The base expression (first operand) in a quantified expression is evaluated exactly once.</p>
+    <h2><a name="id-other-expr"></a>6.3. Other Expressions </h2>
+    <p> All expressions not listed above are extended as follows. This includes the following kinds
+      of expressions: </p>
+    <ul>
+      <li>
+        <p>Path expressions</p>
+      </li>
+      <li>
+        <p>Concatenation expressions</p>
+      </li>
+      <li>
+        <p>Function calls</p>
+      </li>
+      <li>
+        <p>Range expressions</p>
+      </li>
+      <li>
+        <p>Transform expressions</p>
+      </li>
+      <li>
+        <p>Union, intersect, and except expressions</p>
+      </li>
+      <li>
+        <p>Arithmetic, comparison, and logical expressions</p>
+      </li>
+      <li>
+        <p>Ordered and unordered expressions</p>
+      </li>
+      <li>
+        <p>Instance of, cast, castable, and treat expressions</p>
+      </li>
+      <li>
+        <p>Validate expressions</p>
+      </li>
+      <li>
+        <p>Extension expressions (pragmas)</p>
+      </li>
+    </ul>
+    <b>Composability Constraints:</b>
+    <p>(node)</p>
+    <b>Evaluation Order:</b>
+    <p> Operand expressions are evaluated from left to right, bottom-up in the expression tree
+      (i.e., in a function call, the parameters are evaluated before the function body is
+      evaluated). </p>
+    <p><b>Note:</b></p>
+    <p> Since insert, delete, replace and rename are updating expressions, their operands must be
+      non-effecting, such that the evaluation order is irrelevant for them. </p>
+    <p><b>Note:</b></p>
+    <p> In transform expressions, since the modify clause must be updating (or vacuous) according to
+      XQUF, it must also be non-sequential. Furthermore, XQUF specifies that the return clause sees
+      that the side-effect of applying the PUL returned by the modify expression is visible to the
+      return expression. </p>
+    <h1><a name="id-example"></a>7. Example </h1>
+    <p>The following function returns true or false according to whether its parameter is a known
+      user name, and logs the event: </p>
+    <pre>declare %an:sequential function validate-and-log($username as xs:string)
     as xs:boolean {
   variable $log as document-node() := fn:doc("log.xml"); 
 
@@ -1623,29 +925,18 @@
   $result
 } 
 </pre>
-          <h1><a name="id-extra-grammatical"></a>8. Extra-Grammatical Constraints
-      </h1>
-            
-            
-      <p>Although the grammar allows syntactically an empty program, this is now allowed.</p>
-            
-      <p>A program must consist of at least one statement, or at least an expression.</p>
-          
-      <h1><a name="id-lookahead"></a>9. Alternative simplified grammar for LL-Parsers
-      </h1>
-          
-          
-      <p>For implementors using LL-parsers, the grammar described in this specification (which is LR(1)) needs
-               an arbitrary lookahead (as opposed to a lookahead of 1 for LR-parsers).
-               This arbitrary lookahead can be removed
-             by using a subset of this proposal specified by the following changes. This makes the grammar LL(2).
-      </p>
-          
-      <p>In a nutshell, block expressions are not available, and statements that could be mistaken for the beginning of
-               an expression (with a lookahead of 2) need to be put in block statements.
-               This happens in function bodies, node constructors and block expressions.
-      </p>
-          <pre>
+    <h1><a name="id-extra-grammatical"></a>8. Extra-Grammatical Constraints </h1>
+    <p>Although the grammar allows syntactically an empty program, this is now allowed.</p>
+    <p>A program must consist of at least one statement, or at least an expression.</p>
+    <h1><a name="id-lookahead"></a>9. Alternative simplified grammar for LL-Parsers </h1>
+    <p>For implementors using LL-parsers, the grammar described in this specification (which is
+      LR(1)) needs an arbitrary lookahead (as opposed to a lookahead of 1 for LR-parsers). This
+      arbitrary lookahead can be removed by using a subset of this proposal specified by the
+      following changes. This makes the grammar LL(2). </p>
+    <p>In a nutshell, block expressions are not available, and statements that could be mistaken for
+      the beginning of an expression (with a lookahead of 2) need to be put in block statements.
+      This happens in function bodies, node constructors and block expressions. </p>
+    <pre>
 [unchanged] PrimaryExpr ::= /* as in XQuery 3.0, no standalone BlockExpr */
       Literal
   |   VarRef
@@ -1681,16 +972,16 @@
 Statements1 := Statement1*
  
     </pre>
-        <hr>
-      <h1>Complete Grammar</h1>
-      <h2>Grammar Proposal</h2>
-      (Non-terminals without a rule correspond to those, unchanged, in XQuery 3.0/XQuery Update 1.0)
-      
-      <h3>New query body for main modules</h3><pre>
+    <h1>Complete Grammar</h1>
+    <h2>Grammar Proposal</h2> (Non-terminals without a rule correspond to those, unchanged, in
+    XQuery 3.0/XQuery Update 1.0) <h3>New query body for main
+      modules</h3><pre>
 0 - <a name="MainModule" class="ext">MainModule</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Prolog"; class="new">Prolog</a> <a href="Program" class="new">Program</a>
     
 1 - <a name="Program" class="ext">Program</a> ::= <a href="#StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a>
-    </pre><h3>Mixing Expressions and Statements</h3><pre xml:space="preserve">
+    </pre><h3>Mixing
+      Expressions and
+      Statements</h3><pre xml:space="preserve">
           
 2 - <a name="Statements" class="new">Statements</a> ::= <a href="#Statement" class="new">Statement</a>*
     
@@ -1780,8 +1071,8 @@
 21 - <a name="WhileStatement" class="new">WhileStatement</a> ::= "while" "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Expr"; class="un">Expr</a> ")" <a href="#Statement" class="new">Statement</a>
     
       </pre><h3>Expressions</h3>
-      (Separating control-flow expressions)
-      <pre>
+    (Separating control-flow expressions)
+    <pre>
 22 - <a name="ExprSingle" class="ext">ExprSingle</a> ::=
       <a href="#ExprSimple" class="new">ExprSimple</a>
   |   <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-FLWORExpr"; class="un">FLWORExpr</a>
@@ -1798,12 +1089,12 @@
   |   <a href="http://www.w3.org/TR/xquery-update-10/#prod-xquery-RenameExpr"; class="up">RenameExpr</a>
   |   <a href="http://www.w3.org/TR/xquery-update-10/#prod-xquery-ReplaceExpr"; class="up">ReplaceExpr</a>
   |   <a href="http://www.w3.org/TR/xquery-update-10/#prod-xquery-TransformExpr"; class="up">TransformExpr</a>    </pre>
-      (Direct element constructors)
-      <pre>
+    (Direct element constructors)
+    <pre>
 24 - <a name="CommonContent" class="ext">CommonContent</a> ::= <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-PredefinedEntityRef"; class="un">PredefinedEntityRef</a> | <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-CharRef"; class="un">CharRef</a> | "{{" | "}}" | <a href="#BlockExpr" class="new">BlockExpr</a>
 </pre>
-      (Computed element constructors)
-      <pre>
+    (Computed element constructors)
+    <pre>
 25 - <a name="ContentExpr" class="ext">ContentExpr</a> ::= <a href="#StatementsAndOptionalExpr" class="new">StatementsAndExpr</a>
 
 26 - CompDocConstructor ::= "document" <a href="#BlockExpr" class="new">BlockExpr</a>
@@ -1816,7 +1107,7 @@
 
 30 - CompTextConstructor ::= "text" <a href="#BlockExpr" class="new">BlockExpr</a>
     </pre>
-      (Block expression)
+    (Block expression)
       <pre>
 31 - <a name="PrimaryExpr" class="ext">PrimaryExpr</a> ::=
       <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-Literal"; class="un">Literal</a>
@@ -1831,8 +1122,9 @@
   |   <a href="#BlockExpr" class="new">BlockExpr</a>
     
 32 - <a name="BlockExpr" class="new">BlockExpr</a> ::= "{" <a href="#StatementsAndExpr" class="new">StatementsAndExpr</a> "}
-    </pre><h3>Function body</h3><pre>
+    </pre><h3>Function
+      body</h3><pre>
 33 - <a name="FunctionDecl" class="ext">FunctionDecl</a> ::= "function" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-EQName"; class="un">EQName</a> "(" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-ParamList"; class="un">ParamList</a>? ")"
                       ("as" <a href="http://www.w3.org/TR/xquery-30/#doc-xquery30-SequenceType"; class="un">SequenceType</a>)? ("{" <a href="#StatementsAndOptionalExpr" class="new">StatementsAndOptionalExpr</a> "}" | "external"))
     </pre></body>
-</html>
+</html>
\ No newline at end of file

=== modified file 'doc/zorba/xml_json.dox'
--- doc/zorba/xml_json.dox	2013-06-19 15:19:17 +0000
+++ doc/zorba/xml_json.dox	2013-09-17 13:34:04 +0000
@@ -2,25 +2,25 @@
 
 \section two_syntaxes One VM, two syntaxes
 
-In Zorba 2.6, we introduced JSON support with the new JSONiq language. JSONiq extends
+In Zorba 2.6, we introduced JSON support with the new <a href="http://www.jsoniq.org/";>JSONiq</a> language. <a href="http://www.jsoniq.org/";>JSONiq</a> extends
 XQuery with JSON support while leaving its XML functionality (almost) intact. This came at
 the cost of either circumvoluted syntax for JSON (like empty objects, or object lookup),
 or for breaking some XML corner-case functionality (like true, false and null that are
 recognized as literals rather than as XPath name tests).
 
 We have received a lot of feedback since then, and realized that, for those of you who
-would like to work primarily with JSON, it made sense to let the JSONiq syntax live its
+would like to work primarily with JSON, it made sense to let the <a href="http://www.jsoniq.org/";>JSONiq</a> syntax live its
 own life.
 
 Concretely, this means that:
 1. The "virtual machine" (abstract query language, compiler and runtime) stays the same
 and fully support both XML and JSON.
-2. But Zorba supports two syntaxes for it: XQuery and JSONiq, which are each tailored to
+2. But Zorba supports two syntaxes for it: XQuery and <a href="http://www.jsoniq.org/";>JSONiq</a>, which are each tailored to
 the aesthetics preferences of each community.
 
 \section share What they share
 
-XQuery and JSONiq share:
+XQuery and <a href="http://www.jsoniq.org/";>JSONiq</a> share:
 - the same type system: values are sequences of items, which can be XML nodes, JSON objects
 or arrays, atomic items or functions.
 - the same operations on atomic types.
@@ -28,16 +28,16 @@
 - the same abstract navigation mechanism for both XML (XPath) and JSON (object and array lookup).
 
 \section two_faces Two faces of the same language
-To put it boldly, in terms of syntax, XQuery and JSONiq can be seen as two faces of the same
+To put it boldly, in terms of syntax, XQuery and <a href="http://www.jsoniq.org/";>JSONiq</a> can be seen as two faces of the same
 language.
 
 The XQuery syntax provides first-class XML support (full W3C conformance), as well as
-second-class JSON support ("JSONiq extension to XQuery" : everything JSONiq that does not
+second-class JSON support ("JSONiq extension to XQuery" : everything <a href="http://www.jsoniq.org/";>JSONiq</a> that does not
 collide with XQuery).
 
-The JSONiq syntax provides first-class JSON support (nice JavaScript-like dot-based object lookup,
+The <a href="http://www.jsoniq.org/";>JSONiq</a> syntax provides first-class JSON support (nice JavaScript-like dot-based object lookup,
 full JSON copy-and-paste support, etc) and second-class XML support ("XQuery extension to JSONiq" :
-everything XQuery that does not collide with JSONiq).
+everything XQuery that does not collide with <a href="http://www.jsoniq.org/";>JSONiq</a>).
 
 \section contentious_points Syntactic contentious points
 
@@ -45,104 +45,120 @@
 
 Here is a more detailed description of the collisions between XML and JSON support.
 
-A. Dots in NCNames vs. Dot-based object lookup.
+A. <b>Dots in NCNames vs. Dot-based object lookup.</b>
 XML names can contain dots, but dots are also used for object lookup. In particular,
 $var.key can be interpreted as a variable named "var.key" or as a lookup in the object
 $var for the key "key".
 
-B. Context item syntax.
+B. <b>Context item syntax.</b>
 XQuery uses dots for the context item syntax. But combined with object lookup, it becomes
 hard to read: ..key for looking up the key "key" in the context item.
 
-C. String literals.
+C. <b>String literals.</b>
 XQuery supports both single-quoted and double-quoted literals. JSON only supports double-quoted
 literals. 
 
-D. Character escaping.
+D. <b>Character escaping.</b>
 XML uses apersand-based escaping, like &#a; or &amp;.
-JSOn uses backslash-based escaping, like \u0010 or \\.
+JSON uses backslash-based escaping, like \u0010 or \\.
 
-E. Object keys.
+E. <b>Object keys.</b>
 In some JSON languages, simple object keys (containing no spaces, etc) may be unquoted. This collides
 with XPath name tests.
 
-F. true, false and null literals vs. XPath name tests.
+F. <b>true, false and null literals vs. XPath name tests.</b>
 In XQuery, booleans can be constructed with the functions true() and false(), because true and false
 would be recognized as name tests. In JSON data, true and false appear as literals.
 
-G. Empty object vs. empty block syntax.
+G. <b>Empty object vs. empty block syntax.</b>
 In JSON, the empty object is denoted {}.
 In Zorba's scripting extension to XQuery, {} is used for the empty block.
 
-H. Type syntax.
+H. <b>Type syntax.</b>
 XQuery supports user-defined atomic types. To avoid collisions, XML node types use parentheses: node(),
 element(), etc as well as namespaces: xs:integer, xs:string, etc.
-JSONiq aims at a simpler syntax, with no parentheses: integer, string, object, array.
+<a href="http://www.jsoniq.org/";>JSONiq</a> aims at a simpler syntax, with no parentheses: integer, string, object, array.
 
-I. Update syntax.
+I. <b>Update syntax.</b>
 The XQuery update syntax collides with the JSON update syntax (insert, delete, replace, rename).
 
 \section xquery_syntax The XQuery Syntax
 
-This syntax is fully conformant and backwards compatible with XQuery 3.0.
+This syntax is fully conformant and backwards compatible with <a href="http://www.w3.org/TR/xquery-30/";>XQuery 3.0</a>.
 
 It is a superset of XQuery.
 It is not a superset of JSON.
 
 A. No dot-based object lookup - use $object("key") instead.
+
 B. No $$ for the context item - use . instead.
+
 D. XML, ampersand-based escaping in string literals (you can switch with an option).
+
 E. Object keys must be quoted.
+
 F. No true/false/null literals - use fn:true(), fn:false() and jn:null() instead.
+
 G. {} is the empty block. Use {| |} for the empty object.
+
 H. XQuery-style type syntax: (a) builtin atomic types must be prefixed with xs:,
                             (b) Non-atomic types must be followed by parentheses : object()...
                             (c) The empty-sequence() type must be written as such.
+
 I. "json" is mandatory in the JSON update syntax.
 
 \section jsoniq_syntax The JSONiq syntax
 
-This syntax fully supports JSONiq, as well as some aspects of the XQuery syntax.
+This syntax fully supports <a href="http://www.jsoniq.org/";>JSONiq</a>, as well as some aspects of the XQuery syntax.
 
-It is a superset of JSON (yes, you can copy-and-paste JSON data in a JSONiq query).
+It is a superset of JSON (yes, you can copy-and-paste JSON data in a <a href="http://www.jsoniq.org/";>JSONiq</a> query).
 It is not a superset of XQuery.
 
 A. No names containing dots.
+
 B. No . for the context item - use $$ instead.
+
 C. No single-quoted literals. Use double-quoted literals instead.
+
 D. JSON, baskslash-based escaping in string literals (you can switch with an option).
+
 F. No axis step allowed at the beginning of a relative path expression. Instead of using
 foo:bar, you must use $$/foo:bar.
+
 G. {} is for empty objects. Use {;} for empty blocks.
 
 \section how_to_specify How to specify which syntax your query is using
 
 In order to pick a parser, you can add a version declaration on top of your module:
 
+\code
 xquery version "3.0";
+\endcode
 
 will pick the XQuery parser.
 
+\code
 jsoniq version "1.0";
+\endcode
 
-will pick the JSONiq parser.
+will pick the <a href="http://www.jsoniq.org/";>JSONiq</a> parser.
 
 In the absence of any version declaration, the XQuery parser is taken by default.
 
 \section interlanguage Interlanguage Module Imports
 
 It is possible for a module written in XQuery syntax (xquery version declaration or no version
-declaration), to import another module written in JSONiq syntax (jsoniq version declaration), and
+declaration), to import another module written in <a href="http://www.jsoniq.org/";>JSONiq</a> syntax (jsoniq version declaration), and
 vice-versa.
 
 \section legacy_jsoniq Legacy JSONiq queries can still be parsed with the XQuery parser. 
 
-If you wrote JSONiq queries with a preceding version of Zorba, they should work with the
+If you wrote <a href="http://www.jsoniq.org/";>JSONiq</a> queries with a preceding version of Zorba, they should work with the
 XQuery parser. Since it is the default, you do not need to add any version declaration.
 In order to restore full W3C conformance though, true/false/null literals are deprecated
 in the XQuery parser. While they will still work in Zorba 2.9, a warning will be issued.
 They will be obsolete in Zorba 3.0 and considered XPath name tests again. Of course,
-the JSONiq syntax still fully supports these literals.
+the <a href="http://www.jsoniq.org/";>JSONiq</a> syntax still fully supports these literals.
 
 */
 

=== modified file 'doc/zorba/xqddf.dox'
--- doc/zorba/xqddf.dox	2013-08-30 07:13:43 +0000
+++ doc/zorba/xqddf.dox	2013-09-17 13:34:04 +0000
@@ -1,24 +1,25 @@
 /** \page xqddf Data Definition Facility
 
-Zorba has support for collections, indexes, and integrity constraints. This is accomplished via a combination of new prolog
-declarations, new kinds of expressions or extensions to existing expressions,
+Zorba has support for collections, indexes, and integrity constraints.
+This is accomplished via a combination of new prolog declarations, new kinds of 
+expressions or extensions to existing expressions,
 and new built-in functions. Furthermore, both the static and the dynamic
 contexts are extended with new components that store information about
 collections, indexes, and integrity constraints. Collectively, all these
 extensions are called the <strong>Data Definition Facility</strong>
 
-As part of the implementation, Zorba includes new "built-in" modules
-that contain the declarations of all the new built-in functions 
-to manage (ddl) and manipulate (dml) collections, indexes, and integrity constraints.
+\n \n As part of the implementation, Zorba includes new "built-in" modules
+that contain the declarations of all the new built-in functions to manage (ddl)
+and manipulate (dml) collections, indexes, and integrity constraints.
 
 
 <ul>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_collections_dml.html">http://www.zorba-xquery.com/modules/store/static/collections/dml</a> (prefix: cdml)</li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_collections_ddl.html">http://www.zorba-xquery.com/modules/store/static/collections/ddl</a> (prefix: cddl)</li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_indexes_dml.html">http://www.zorba-xquery.com/modules/store/static/indexes/dml</a> (prefix: idml)</li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_indexes_ddl.html">http://www.zorba-xquery.com/modules/store/static/indexes/ddl</a> (prefix: iddl)</li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_integrity_constraints_dml.html">http://www.zorba-xquery.com/modules/store/static/integrity_constraints/dml</a> (prefix: icdml)</li>
-  <li><a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_static_integrity_constraints_ddl.html">http://www.zorba-xquery.com/modules/store/static/integrity_constraints/ddl</a> (prefix: icddl)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_collections_dml.html">http://www.zorba-xquery.com/modules/store/static/collections/dml</a> (prefix: cdml)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_collections_ddl.html">http://www.zorba-xquery.com/modules/store/static/collections/ddl</a> (prefix: cddl)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_indexes_dml.html">http://www.zorba-xquery.com/modules/store/static/indexes/dml</a> (prefix: idml)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_indexes_ddl.html">http://www.zorba-xquery.com/modules/store/static/indexes/ddl</a> (prefix: iddl)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_integrity_constraints_dml.html">http://www.zorba-xquery.com/modules/store/static/integrity_constraints/dml</a> (prefix: icdml)</li>
+  <li><a href="../modules/www.zorba-xquery.com_modules_store_static_integrity_constraints_ddl.html">http://www.zorba-xquery.com/modules/store/static/integrity_constraints/ddl</a> (prefix: icddl)</li>
 </ul>
 
 As usual, these modules must be imported by any other module that wants to invoke any of the functions.
@@ -33,7 +34,7 @@
 within the collection. We will say that a node belongs to a collection if it is
 inside a document that belongs to that collection.
 
-Like a W3C collection, an <a href="#collection">collection</a> can be
+\n \n Like a W3C collection, an <a href="#collection">collection</a> can be
 viewed as a sequence of nodes: it is the sequence containing the root nodes of
 the documents that belong to the collection (and as we will see later, the
 function <a href="#cdml_collection"
@@ -54,7 +55,7 @@
 For brevity, in the remaining of this document we will use the term "collection" to
 mean <a href="#collection">collection</a>. For backward compatibility with
 the W3C XQuery specification, Zorba retains some basic support for W3C
-collections (see <a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_dynamic_collections_w3c_dml.html">http://www.zorba-xquery.com/modules/store/dynamic/collections/w3c/dml</a> and <a href="../xqdoc/xhtml/www.zorba-xquery.com_modules_store_dynamic_collections_w3c_ddl.html">http://www.zorba-xquery.com/modules/store/dynamic/collections/w3c/ddl</a>).
+collections (see <a href="../modules/www.zorba-xquery.com_modules_store_dynamic_collections_w3c_dml.html">http://www.zorba-xquery.com/modules/store/dynamic/collections/w3c/dml</a> and <a href="../modules/www.zorba-xquery.com_modules_store_dynamic_collections_w3c_ddl.html">http://www.zorba-xquery.com/modules/store/dynamic/collections/w3c/ddl</a>).
 However, users are encouraged to use <a href="#collection">collections</a> instead.
 
 Zorba supports five kinds of operations on collections: <a
@@ -68,21 +69,21 @@
 
 \subsection collections_in_action Collections in action - A simple example
 
-Let us assume an application that models a news organization. The application
+\n Let us assume an application that models a news organization. The application
 models its data as XML documents grouped into collections of logically related
 entities. In this example, we show how three such collections may be created and
 used; the first collection contains employee data, the second contains news
 articles, and the third contains information about the months of the year (e.g.,
 the name, number of days, and fixed holidays for each month).
 
-Before a collection can be created, it must be declared. A <strong>collection
+\n \n Before a collection can be created, it must be declared. A <strong>collection
 declaration</strong> describes the collection by providing a unique name for it
 and specifying certain properties (using XQuery Annotations) for the collection itself and for the
 documents in the collection. As explained in \ref collection_declaration,
 collections must be declared inside library modules. In terms of the XQuery
 language, collection declarations become part of a module's static context.
 
-In this example, the declarations are placed inside the <a
+\n \n In this example, the declarations are placed inside the <a
 href="#lib_module_news_data_collections" title="news-data">"news-data"</a>
 library module (shown below). The declarations assign the names
 news-data:employees, news-data:articles, and news-data:months to the three
@@ -187,7 +188,7 @@
 is the reason why the "news-schema" must be imported, even though no type
 defined by the schema is referenced explicitly in the query.
 
-In this example, the employees collection is populated by a single call to the
+\n \n In this example, the employees collection is populated by a single call to the
 cdml:insert-nodes function, whose source expression is a concatenation of
 explicitly constructed documents. The articles collection is populated using the
 cdml:insert-nodes function as well, but in a slightly different fashion: The
@@ -204,13 +205,13 @@
 an updating primitive that becomes part of a pending updates list (PUL), which
 is applied atomically when the next ";" appears in the program.
 
-After populating the two collections, "user-script-1" runs a query expression
+\n \n After populating the two collections, "user-script-1" runs a query expression
 that uses the <a href="#cdml_collection"
 title="cdml:collection">cdmlcdml:collection</a> function to access their root
 nodes. The expression returns, for each journalist, the articles authored by
 that journalist ordered by their date.
 
-Finally, "user-script-1" uses the cdml:remove-nodes function to remove from the
+\n \n Finally, "user-script-1" uses the cdml:remove-nodes function to remove from the
 articles collection all articles that were published before 2000. Like
 cdml:insert-nodes, cdml:remove-nodes takes as input the QName of a collection
 and a node-producing source expression. The source nodes must be parent-less
@@ -296,7 +297,7 @@
 of a system administrator who makes sure that queries see the data that they
 must see, and no data inconsistencies or leaks can arise.
 
-To accommodate collection declarations, Zorba extends the static context with a
+\n \n To accommodate collection declarations, Zorba extends the static context with a
 component called the <strong>statically known collections</strong>. This is a
 map whose entries associate an expanded QName with an implementation-dependent
 representation of the information contained in a collection declaration with the
@@ -323,13 +324,13 @@
 If not specified, the default values for update and ordering mode are '%an:mutable' and '%an:unordered', respectively.
 The default value for the document update mode is '%an:mutable-nodes'.
 
-It is a static error [err::XQST0106] if a collection declaration contains more than one value for the same property.
+\n \n It is a static error [err::XQST0106] if a collection declaration contains more than one value for the same property.
 An <strong>ordered collection</strong> is a collection into which the ordering of documents is assumed to be meaningful for the application, and as a result, programmers can explicitly control the placement of documents via appropriate updating functions.
 In contrast, the ordering of documents inside <strong>unordered collections</strong> is implementation dependent, but stable (see \ref accessing_collections for details).
 A <strong>constant collection</strong> is one that is created with an initial set of documents and
 does not allow any subsequent insertions to or deletions from this initial set.
 
-An '%an:append-only' collection does not allow any deletions at all and restricts insertions to take place at the "end" only, i.e., all new documents must be inserted after all existing ones.
+\n \n An '%an:append-only' collection does not allow any deletions at all and restricts insertions to take place at the "end" only, i.e., all new documents must be inserted after all existing ones.
 This implies a user-visible document ordering, and as a result, an '%an:append-only' collection must also be declared as '%an:ordered' [err:XQST0106].
 A '%an:queue' collection forbids both insertions and deletions in/from the "middle"; only documents at
 the front of the collection may be deleted, and new documents can be inserted only at the end of a collection.
@@ -347,7 +348,7 @@
 
 \subsection creating_collections Creating Collections
 
-As explained already, collections are just sets of parent-less XML trees (called
+\n As explained already, collections are just sets of parent-less XML trees (called
 "documents"). In terms of the language, these sets
 "live" in the dynamic context. In particular, the dynamic context is extended
 with a component called the <strong>available collections</strong>. This is a
@@ -355,7 +356,7 @@
 collection's d

References