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

Proposed by Sorin Marian Nasoi
Status: Merged
Merged at revision: 11644
Proposed branch: lp:~zorba-coders/zorba/zorba-documentation-merge-proposal
Merge into: lp:zorba
Diff against target: 22696 lines (+7918/-11362)
88 files modified
doc/CMakeLists.txt (+22/-0)
doc/c/doxy.config.in (+8/-10)
doc/c/manual/indexpage.dox (+19/-3)
doc/csharp/manual/indexpage.dox (+14/-13)
doc/cxx/manual/indexpage.dox (+58/-2)
doc/java/doxy.config.in (+1/-1)
doc/java/manual/indexpage.dox (+19/-6)
doc/php/manual/indexpage.dox (+18/-8)
doc/python/manual/indexpage.dox (+21/-14)
doc/ruby/manual/indexpage.dox (+20/-14)
doc/xqj/manual/indexpage.dox (+14/-11)
doc/zorba/JSONforXQuery.dox (+4/-0)
doc/zorba/JSONforXQuery.html (+1/-1)
doc/zorba/XQueryforJSON.dox (+4/-0)
doc/zorba/XQueryforJSON.html (+1/-1)
doc/zorba/build_and_install.dox (+8/-10)
doc/zorba/build_configure.dox (+4/-4)
doc/zorba/build_macos.dox (+1/-1)
doc/zorba/build_prepare.dox (+12/-11)
doc/zorba/build_prerequisites.dox (+13/-13)
doc/zorba/commandline.dox (+3/-3)
doc/zorba/conformance.dox (+147/-179)
doc/zorba/conformanceXQFTTS.dox (+5/-8)
doc/zorba/conformanceXQUTS.dox (+11/-11)
doc/zorba/conformance_XQ10.dox (+1513/-3017)
doc/zorba/conformance_XQ30.dox (+1517/-2985)
doc/zorba/data_converters.dox (+6/-5)
doc/zorba/data_lifecycle.dox (+3/-3)
doc/zorba/doxy.config.in (+5/-4)
doc/zorba/errors_warnings.dox (+3/-3)
doc/zorba/ft_intro.dox (+1/-1)
doc/zorba/impl_dep_features.dox (+1/-1)
doc/zorba/indexpage.dox.in (+11/-11)
doc/zorba/memory_leaks.dox (+2/-2)
doc/zorba/modules_top.dox (+7/-7)
doc/zorba/overview.dox (+2/-2)
doc/zorba/scripting_spec.dox (+4/-0)
doc/zorba/scripting_spec.html (+760/-1468)
doc/zorba/tut_image.dox (+12/-14)
doc/zorba/xml_json.dox (+42/-26)
doc/zorba/xqddf.dox (+148/-144)
doc/zorba/xqdoc/images/modules.svg (+1692/-1605)
doc/zorba/xqdoc/images/modules_new.svg (+1575/-1611)
doc/zorba/xqdoc/src/xqdoc-html.xq (+40/-7)
doc/zorba/xqdoc/src/zorba_module_dependencies.xqy (+8/-1)
modules/atomic/math.xq (+1/-1)
modules/atomic/random.xq (+1/-1)
modules/atomic/string.xq (+1/-1)
modules/com/zorba-xquery/www/modules/datetime.xq (+1/-1)
modules/com/zorba-xquery/www/modules/debugger/dbgp-message-handler.xq (+1/-1)
modules/com/zorba-xquery/www/modules/fetch.xq (+7/-7)
modules/com/zorba-xquery/www/modules/reflection.xq (+1/-1)
modules/com/zorba-xquery/www/modules/store/documents/dynamic.xq (+3/-3)
modules/com/zorba-xquery/www/modules/store/dynamic/collections/ddl.xq (+3/-3)
modules/com/zorba-xquery/www/modules/store/dynamic/collections/dml.xq (+3/-3)
modules/com/zorba-xquery/www/modules/store/dynamic/collections/w3c/ddl.xq (+3/-3)
modules/com/zorba-xquery/www/modules/store/dynamic/collections/w3c/dml.xq (+3/-3)
modules/com/zorba-xquery/www/modules/store/static/collections/ddl.xq (+5/-5)
modules/com/zorba-xquery/www/modules/store/static/collections/dml.xq (+5/-5)
modules/com/zorba-xquery/www/modules/store/static/indexes/ddl.xq (+5/-5)
modules/com/zorba-xquery/www/modules/store/static/indexes/dml.xq (+5/-5)
modules/com/zorba-xquery/www/modules/store/static/integrity_constraints/ddl.xq (+5/-5)
modules/com/zorba-xquery/www/modules/store/static/integrity_constraints/dml.xq (+5/-5)
modules/com/zorba-xquery/www/modules/uri.xq (+5/-5)
modules/com/zorba-xquery/www/modules/xqdoc/html.xq (+1/-1)
modules/full-text/full-text.xq (+3/-3)
modules/http-client/json/http-client.xq (+7/-7)
modules/http-client/xml/http-client.xq (+6/-6)
modules/item/item.xq (+1/-1)
modules/json/json-csv.jq (+1/-1)
modules/json/json-xml.xq (+4/-4)
modules/org/jsoniq/www/function-library.xq (+4/-7)
modules/pregenerated/jsoniq-errors.xq (+1/-0)
modules/pregenerated/zorba-errors.xq (+1/-0)
modules/pregenerated/zorba-warnings.xq (+1/-0)
modules/schema/schema.xq (+1/-1)
modules/store/unordered-maps.xq (+1/-0)
modules/structured-items/node-position.xq (+1/-1)
modules/structured-items/node.xq (+1/-1)
modules/structured-items/reference.xq (+3/-3)
modules/w3c/pregenerated/xqt-errors.xq (+1/-0)
modules/xml/xml.xq (+3/-3)
modules/zorba-query/zorba-query.xq (+6/-6)
src/compiler/parsetree/parsenode_print_xqdoc_visitor.cpp (+11/-7)
src/diagnostics/diagnostic_list_xq.xq (+7/-0)
test/rbkt/ExpQueryResults/zorba/xqdoc/basic.xml.res (+3/-2)
test/rbkt/ExpQueryResults/zorba/xqdoc/content.xml.res (+3/-2)
test/rbkt/Queries/zorba/xqdoc/moduleDocumentation.xq (+4/-2)
To merge this branch: bzr merge lp:~zorba-coders/zorba/zorba-documentation-merge-proposal
Reviewer Review Type Date Requested Status
Sorin Marian Nasoi Approve
Chris Hillery Approve
Review via email: mp+186036@code.launchpad.net

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

To post a comment you must log in.
11617. By sorin.marian.nasoi <email address hidden>

- fixed conformance XQDoc pages by using \htmlonly Doxygen tag. Please note that the code inside \htmlonly and \endhtmlonly has to be valid XHTML

11618. By sorin.marian.nasoi <email address hidden>

- fixed JSONforXQuery and XQueryforJSON by using \htmlinclude Doxygen tag

11619. By sorin.marian.nasoi <email address hidden>

- corrected DDL spec and added some line breaks in order to improve lisibility
- corrected XQuery Scripting Extension Proposal by using \htmlinclude Doxygen tag

11620. By sorin.marian.nasoi <email address hidden>

- removed line from HTML page

11621. By sorin.marian.nasoi <email address hidden>

- fixed language API links

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Voting criteria failed for the following merge proposals:

https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036 :
Votes: {'Pending': 1}

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue result for https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036

Stage "CommitZorba" failed.

Check console output at http://jenkins.lambda.nu/job/CommitZorba/183/console to view the results.

11622. By sorin.marian.nasoi <email address hidden>

- fixed images tutorial

11623. By sorin.marian.nasoi <email address hidden>

- updated @project tag for:
  - pregenerated modules
  - HTTP Client module

11624. By sorin.marian.nasoi <email address hidden>

- updated @project TAG

11625. By sorin.marian.nasoi <email address hidden>

- merged lp:zorba trunk.

11626. By sorin.marian.nasoi <email address hidden>

- merged lp:zorba trunk

11627. By sorin.marian.nasoi <email address hidden>

- fixed the language declaration in XQDoc (XQuery of JSONiq)

11628. By sorin.marian.nasoi <email address hidden>

- XQDoc Examples as copied in a location that is later on picked up by the new-website branch
- XQDoc Schemas and actual code for the modules is generated as XML and is also picked up by the new-website branch

11629. By sorin.marian.nasoi <email address hidden>

- XQDoc fixes

11630. By sorin.marian.nasoi <email address hidden>

- merged lp:zorba trunk

Revision history for this message
Chris Hillery (ceejatec) :
review: Approve
11631. By sorin.marian.nasoi <email address hidden>

- examples are also added as XML files

11632. By sorin.marian.nasoi <email address hidden>

- updated @project tag according to zorba.io/modules

11633. By sorin.marian.nasoi <email address hidden>

- updated @project tags according to zorba.io
- updated code snippets with ACE syntax highlighting
- updated links to Doxygen documentation and to other modules
- updated module dependency graph

Revision history for this message
Sorin Marian Nasoi (sorin.marian.nasoi) :
review: Approve
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue result for https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036

Stage "ZorbaVQ" failed.

Check console output at http://jenkins.lambda.nu/job/ZorbaVQ/426/console to view the results.

11634. By Chris Hillery

Fix compilation error.

11635. By Chris Hillery

Merge from trunk.

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue result for https://code.launchpad.net/~zorba-coders/zorba/zorba-documentation-merge-proposal/+merge/186036

Stage "TestZorbaUbuntu" failed.
3 tests failed (8550 total tests run).

Check test results at http://jenkins.lambda.nu/job/TestZorbaUbuntu/338/testReport/ to view the results.

11636. By Chris Hillery

Fix test failures caused by changes in XQDoc output for query language.

Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue succeeded - proposal merged!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'doc/CMakeLists.txt'
2--- doc/CMakeLists.txt 2013-07-30 23:42:44 +0000
3+++ doc/CMakeLists.txt 2013-09-30 21:53:02 +0000
4@@ -57,6 +57,28 @@
5 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/c/html)
6 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/code/html)
7
8+# copy all needed images into 'images' folder
9+FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/images)
10+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/xquery_jsoniq_venn.png
11+ ${CMAKE_CURRENT_BINARY_DIR}/images/xquery_jsoniq_venn.png COPYONLY)
12+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/store_concepts.png
13+ ${CMAKE_CURRENT_BINARY_DIR}/images/store_concepts.png COPYONLY)
14+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/data_lifecycle.png
15+ ${CMAKE_CURRENT_BINARY_DIR}/images/data_lifecycle.png COPYONLY)
16+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/data-in-out.png
17+ ${CMAKE_CURRENT_BINARY_DIR}/images/data-in-out.png COPYONLY)
18+#copy tutorial images
19+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/tutorialimages/animated.gif
20+ ${CMAKE_CURRENT_BINARY_DIR}/images/animated.gif COPYONLY)
21+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/tutorialimages/charcoaled.gif
22+ ${CMAKE_CURRENT_BINARY_DIR}/images/charcoaled.gif COPYONLY)
23+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/tutorialimages/exif.jpg
24+ ${CMAKE_CURRENT_BINARY_DIR}/images/exif.jpg COPYONLY)
25+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/tutorialimages/extended.gif
26+ ${CMAKE_CURRENT_BINARY_DIR}/images/extended.gif COPYONLY)
27+CONFIGURE_FILE (${CMAKE_CURRENT_SOURCE_DIR}/zorba/tutorialimages/painted.png
28+ ${CMAKE_CURRENT_BINARY_DIR}/images/painted.png COPYONLY)
29+
30 IF (SWIG_FOUND)
31 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/python/html)
32 FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/java/html)
33
34=== modified file 'doc/c/doxy.config.in'
35--- doc/c/doxy.config.in 2013-07-31 00:34:49 +0000
36+++ doc/c/doxy.config.in 2013-09-30 21:53:02 +0000
37@@ -202,7 +202,7 @@
38 # For instance, some of the names that are used will be different. The list
39 # of all members will be omitted, etc.
40
41-OPTIMIZE_OUTPUT_FOR_C = YES
42+OPTIMIZE_OUTPUT_FOR_C = NO
43
44 # Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java
45 # sources only. Doxygen will then generate output that is more tailored for
46@@ -631,11 +631,7 @@
47 # directories like "/usr/src/myproject". Separate the files or directories
48 # with spaces.
49
50-INPUT = @CMAKE_SOURCE_DIR@/include/zorba/zorbac.h \
51- @CMAKE_SOURCE_DIR@/include/zorba/error.h \
52- @CMAKE_SOURCE_DIR@/include/zorba/static_context_consts.h \
53- @CMAKE_SOURCE_DIR@/include/zorba/options.h \
54- @CMAKE_CURRENT_SOURCE_DIR@/manual
55+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/manual
56
57 # This tag can be used to specify the character encoding of the source files
58 # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is
59@@ -653,8 +649,9 @@
60 # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py
61 # *.f90 *.f *.for *.vhd *.vhdl
62
63-FILE_PATTERNS = *.h \
64- *.dox
65+FILE_PATTERNS = *.c \
66+ *.h \
67+ *.dox
68
69 # The RECURSIVE tag can be used to turn specify whether or not subdirectories
70 # should be searched for input files as well. Possible values are YES and NO.
71@@ -703,7 +700,8 @@
72 # and *.h) to filter out the source-files in the directories. If left
73 # blank all files are included.
74
75-EXAMPLE_PATTERNS = *.c
76+EXAMPLE_PATTERNS = *.c \
77+ *.h
78
79 # If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
80 # searched for input files to be used with the \include or \dontinclude
81@@ -1179,7 +1177,7 @@
82 # typically be disabled. For large projects the javascript based search engine
83 # can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
84
85-SEARCHENGINE = NO
86+SEARCHENGINE = YES
87
88 # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
89 # implemented using a PHP enabled web server instead of at the web client
90
91=== modified file 'doc/c/manual/indexpage.dox'
92--- doc/c/manual/indexpage.dox 2013-08-23 11:15:04 +0000
93+++ doc/c/manual/indexpage.dox 2013-09-30 21:53:02 +0000
94@@ -23,7 +23,23 @@
95 written in C.
96 </ul>
97
98- To start with, this documentation provides a <a class="el" href="examples.html">set of examples</a> that demonstrate
99- some features.
100- */
101+ To start with, this documentation provides a set of examples that demonstrate some features:
102+ <ul>
103+ <li><a class="el" href="ccontext_8c-example.html">ccontext.c</a>
104+ <li><a class="el" href="cerror_8c-example.html">cerror.c</a>
105+ <li><a class="el" href="cexternal_functions_8c-example.html">cexternal_functions.c</a>
106+ <li><a class="el" href="cparsing_8c-example.html">cparsing.c</a>
107+ <li><a class="el" href="csequences_8c-example.html">csequences.c</a>
108+ <li><a class="el" href="cserialization_8c-example.html">cserialization.c</a>
109+ <li><a class="el" href="csimple_8c-example.html">csimple.c</a>
110+ </ul>
111+
112+ \example ccontext.c
113+ \example cerror.c
114+ \example cexternal_functions.c
115+ \example cparsing.c
116+ \example csequences.c
117+ \example cserialization.c
118+ \example csimple.c
119+*/
120
121
122=== modified file 'doc/csharp/manual/indexpage.dox'
123--- doc/csharp/manual/indexpage.dox 2012-07-20 21:21:21 +0000
124+++ doc/csharp/manual/indexpage.dox 2013-09-30 21:53:02 +0000
125@@ -1,15 +1,16 @@
126 /*! \mainpage C# API Documentation
127
128- Zorba ships with a C# language binding that provides several features in order to prepare and execute queries
129- with Zorba.
130-
131- \section note Note for garbage collected languages
132- Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
133- the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
134- is destroyed.
135-
136- \section note Note for non-C++ language bindings
137- 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.
138-
139- */
140-
141+ %Zorba ships with a C# language binding that provides several features
142+ in order to prepare and execute queries with %Zorba.
143+
144+ \section note1 Note for garbage collected languages
145+ %Zorba requires that objects must be deleted in a certain order, which Garbage
146+ Collectors are not aware of. For that reason, the Iterators created with
147+ XQuery.iterator() must be explicitly destroyed with iterator.destroy() before
148+ the %XQuery object is destroyed.
149+
150+ \section note2 Note for non-C++ language bindings
151+ %Zorba's current API documentation is generated from the C++ source.
152+ The C# language API is derived directly from this. The information contained
153+ in this documentation is accurate for C#, although it will look somewhat odd.
154+*/
155
156=== modified file 'doc/cxx/manual/indexpage.dox'
157--- doc/cxx/manual/indexpage.dox 2013-02-07 17:24:36 +0000
158+++ doc/cxx/manual/indexpage.dox 2013-09-30 21:53:02 +0000
159@@ -10,6 +10,62 @@
160 <li>Writing external XQuery functions in C++.
161 </ul>
162
163- To start with, this documentation provides a <a class="el" href="examples.html">set of examples</a> that demonstrate all of the above
164- features.
165+ \section Examples
166+ To start with, this documentation provides a set of examples that demonstrate some features:
167+ <ul>
168+ <li><a href="simple_8cpp-example.html">simple.cpp</a>
169+ <li><a href="sax2_8cpp-example.html">sax2.cpp</a>
170+ <li><a href="errors_8cpp-example.html">errors.cpp</a>
171+ <li><a href="context_8cpp-example.html">context.cpp</a>
172+ <li><a href="serialization_8cpp-example.html">serialization.cpp</a>
173+ <li><a href="chaining_8cpp-example.html">chaining.cpp</a>
174+ <li><a href="external_functions_8cpp-example.html">external_functions.cpp</a>
175+ <li><a href="datamanager_8cpp-example.html">datamanager.cpp</a>
176+ <li><a href="uri_resolvers_8cpp-example.html">uri_resolvers.cpp</a>
177+ <li><a href="execution_plans_8cpp-example.html">execution_plans.cpp</a>
178+ <li><a href="item_handler_8cpp-example.html">item_handler.cpp</a>
179+ <li><a href="callback_8cpp-example.html">callback.cpp</a>
180+ <li><a href="binary_8cpp-example.html">binary.cpp</a>
181+ <li><a href="module_import_check_8cpp-example.html">module_import_check.cpp</a>
182+ <li><a href="jsoniq_8cpp-example.html">jsoniq.cpp</a>
183+ </ul>
184+
185+ \example simple.cpp
186+ This is a simple example that demonstrate how to create, compile, and execute
187+ queries.
188+
189+ \example sax2.cpp
190+ An example showing XML serialization that is performed using SAX2.
191+
192+ \example errors.cpp
193+ This file demonstrates how error management and handling is done in Zorba.
194+
195+ \example context.cpp
196+ This file demonstrates how the ItemFactory can be used to create new Items and
197+ bind the Items to external variables in the dynamic context of a query.
198+
199+ \example serialization.cpp
200+ This file shows examples of how to serialize query results, for example as XML.
201+
202+ \example chaining.cpp
203+ Example to show query chaining at work. In this example, we will execute
204+ query 1 and chain the results of that query as in input to
205+ another query (query 2) by means of an external variable.
206+
207+ \example external_functions.cpp
208+ This file shows some simple examples of external functions.
209+
210+ \example datamanager.cpp
211+ This file contains some examples that demonstrate how the XmlDataManager
212+ can be used to load files, create collection, etc.
213+
214+ \example uri_resolvers.cpp
215+ \example execution_plans.cpp
216+ \example item_handler.cpp
217+ This is a example that demonstrates how one can use item handlers.
218+
219+ \example callback.cpp
220+ \example binary.cpp
221+ \example module_import_check.cpp
222+ \example jsoniq.cpp
223 */
224
225=== modified file 'doc/java/doxy.config.in'
226--- doc/java/doxy.config.in 2013-07-31 00:34:49 +0000
227+++ doc/java/doxy.config.in 2013-09-30 21:53:02 +0000
228@@ -694,7 +694,7 @@
229 # directories that contain example code fragments that are included (see
230 # the \include command).
231
232-EXAMPLE_PATH = @CMAKE_CURRENT_BINARY_DIR@/examples
233+EXAMPLE_PATH = @CMAKE_CURRENT_SOURCE_DIR@/examples
234
235 # If the value of the EXAMPLE_PATH tag contains directories, you can use the
236 # EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
237
238=== modified file 'doc/java/manual/indexpage.dox'
239--- doc/java/manual/indexpage.dox 2013-02-07 17:24:36 +0000
240+++ doc/java/manual/indexpage.dox 2013-09-30 21:53:02 +0000
241@@ -1,13 +1,26 @@
242 /*! \mainpage Java API Documentation
243
244- 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>.
245-
246- 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.
247-
248+ %Zorba provides two Java language bindings:
249+ <ul>
250+ <li>a language binding generated using SWIG that is similar to the bindings for Ruby or Python
251+ <li>a binding that implements the <a href="http://jcp.org/en/jsr/detail?id=225">XQuery API for Java (XQJ)</a>
252+ </ul>
253+
254+ Although, the XQJ binding is currently implemented entirely on top of the SWIG
255+ binding, we encourage people to only use the XQJ binding. The SWIG generated
256+ binding might be deprecated in the future.
257+
258 \section note Note for non-C++ language bindings
259- 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.
260+ %Zorba's current API documentation is generated from the C++ source. The Java
261+ language API is derived directly from this. The information contained in this
262+ documentation is accurate for Java, although it will look somewhat odd.
263+
264+ To start with, this is a simple example that demonstrate how to use the SWIG
265+ generated binding to create, compile, and execute queries:
266+ <ul>
267+ <li><a class="el" href="Test_Zorba_8java-example.html">Test_Zorba.java</a>
268+ </ul>
269
270 \example Test_Zorba.java
271- This is a simple example that demonstrate how to use the SWIG generated binding to create, compile, and execute queries.
272 */
273
274
275=== modified file 'doc/php/manual/indexpage.dox'
276--- doc/php/manual/indexpage.dox 2013-02-07 17:24:36 +0000
277+++ doc/php/manual/indexpage.dox 2013-09-30 21:53:02 +0000
278@@ -1,16 +1,26 @@
279 /*! \mainpage PHP API Documentation
280
281- Zorba ships with a PHP language binding that provides some basic features in order to prepare and execute queries
282- with Zorba.
283-
284- 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.
285- 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.
286+ %Zorba ships with a PHP language binding that provides some basic features in
287+ order to prepare and execute queries with %Zorba.
288+
289+ The <a href="http://www.zorba-xquery.com/html/entry/2011/12/27/PHP_Meets_XQuery">following tutorial</a>
290+ provides an overview on how to leverage %Zorba into PHP applications.
291+ We also provide the following set of examples that show how the %Zorba PHP API
292+ can be used:
293+ <ul>
294+ <li><a class="el" href="test_8php-example.html">test.php</a>
295+ <li><a class="el" href="simple_8php-example.html">simple.php</a>
296+ </ul>
297
298 \section note Note for non-C++ language bindings
299- 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.
300+ %Zorba's current API documentation is generated from the C++ source. The PHP
301+ language API is derived directly from this. The information contained in this
302+ documentation is accurate for PHP, although it will look somewhat odd.
303
304 \example test.php
305- This is a simple example that demonstrate how to use the Zorba XQuery Engine to
306- create, compile, and execute queries.
307+ This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
308+ to create, compile, and execute queries.
309+
310+ \example simple.php
311 */
312
313
314=== modified file 'doc/python/manual/indexpage.dox'
315--- doc/python/manual/indexpage.dox 2013-02-07 17:24:36 +0000
316+++ doc/python/manual/indexpage.dox 2013-09-30 21:53:02 +0000
317@@ -1,20 +1,27 @@
318 /*! \mainpage Python API Documentation
319
320- Zorba ships with a Python language binding that provides some basic features in order to prepare and execute queries
321- with Zorba.
322-
323- We also provide a <a class="en" href="examples.html">set of examples</a> that show how this language binding can be used.
324-
325- \section note Note for garbage collected languages
326- Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
327- the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
328- is destroyed.
329-
330- \section note Note for non-C++ language bindings
331- 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.
332+ %Zorba ships with a Python language binding that provides some basic features
333+ in order to prepare and execute queries with %Zorba.
334+
335+ We also provide a set of examples that show how this language binding can
336+ be used:
337+ <ul>
338+ <li><a class="el" href="python_test_8py-example.html">python_test.py</a>
339+ </ul>
340+
341+ \section note1 Note for garbage collected languages
342+ %Zorba requires that objects must be deleted in a certain order, which Garbage
343+ Collectors are not aware of. For that reason, the Iterators created with
344+ XQuery.iterator() must be explicitly destroyed with iterator.destroy() before
345+ the %XQuery object is destroyed.
346+
347+ \section note2 Note for non-C++ language bindings
348+ %Zorba's current API documentation is generated from the C++ source. The Python
349+ language API is derived directly from this. The information contained in this
350+ documentation is accurate for Python, although it will look somewhat odd.
351
352 \example python_test.py
353- This is a simple example that demonstrate how to use the Zorba XQuery Engine to
354- create, compile, and execute queries.
355+ This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
356+ to create, compile, and execute queries.
357 */
358
359
360=== modified file 'doc/ruby/manual/indexpage.dox'
361--- doc/ruby/manual/indexpage.dox 2013-02-07 17:24:36 +0000
362+++ doc/ruby/manual/indexpage.dox 2013-09-30 21:53:02 +0000
363@@ -1,20 +1,26 @@
364 /*! \mainpage Ruby API Documentation
365
366- Zorba ships with a Ruby language binding that provides some basic features in order to prepare and execute queries
367- with Zorba.
368-
369- We also provide a <a class="en" href="examples.html">set of examples</a> that show how this language binding can be used.
370-
371- \section note Note for garbage collected languages
372- Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
373- the Iterators created with XQuery.iterator() must be explicitly destroyed with iterator.destroy() before the XQuery object
374- is destroyed.
375-
376- \section note Note for non-C++ language bindings
377- 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.
378+ %Zorba ships with a Ruby language binding that provides some basic features in
379+ order to prepare and execute queries with %Zorba.
380+
381+ We also provide some examples that show how this language binding can be used:
382+ <ul>
383+ <li><a class="el" href="ruby_test_8rb-example.html">ruby_test.rb</a>
384+ </ul>
385+
386+ \section note1 Note for garbage collected languages
387+ %Zorba requires that objects must be deleted in a certain order, which Garbage
388+ Collectors are not aware of. For that reason,the Iterators created with
389+ XQuery.iterator() must be explicitly destroyed with iterator.destroy()
390+ before the %XQuery object is destroyed.
391+
392+ \section note2 Note for non-C++ language bindings
393+ %Zorba's current API documentation is generated from the C++ source. The Ruby
394+ language API is derived directly from this. The information contained in this
395+ documentation is accurate for Ruby, although it will look somewhat odd.
396
397 \example ruby_test.rb
398- This is a simple example that demonstrate how to use the Zorba XQuery Engine to
399- create, compile, and execute queries.
400+ This is a simple example that demonstrate how to use the %Zorba %XQuery
401+ Engine to create, compile, and execute queries.
402 */
403
404
405=== modified file 'doc/xqj/manual/indexpage.dox'
406--- doc/xqj/manual/indexpage.dox 2012-03-26 23:06:10 +0000
407+++ doc/xqj/manual/indexpage.dox 2013-09-30 21:53:02 +0000
408@@ -1,18 +1,21 @@
409 /*! \mainpage XQJ API Documentation
410
411- Zorba ships with a XQJ binding that provides basic features in order to prepare and execute queries
412- with Zorba.
413-
414- For the moment, we provide a <a class="en" href="examples.html">TCK set</a> that show how this language binding can be used.
415-
416+ %Zorba ships with a XQJ binding that provides basic features in order to
417+ prepare and execute queries with %Zorba.
418+
419+ For the moment, we provide a TCK set that show how this language binding can be used:
420+ <ul>
421+ <li><a class="el" href="Test_Zorba_8java-example.html">Test_Zorba.java</a>
422+ </ul>
423+
424 \section note Note for garbage collected languages
425- Zorba requires that objects must be deleted in a certain order, which Garbage Collectors are not aware of. For that reason,
426- the Iterators created with XQuery.iterator() must be explicitly deleted with iterator.delete() before the XQuery
427- object is deleted.
428-
429+ %Zorba requires that objects must be deleted in a certain order, which Garbage
430+ Collectors are not aware of. For that reason, the Iterators created with
431+ XQuery.iterator() must be explicitly deleted with iterator.delete() before
432+ the %XQuery object is deleted.
433
434 \example Test_Zorba.java
435- This is a simple example that demonstrate how to use the Zorba XQuery Engine to
436- create, compile, and execute queries.
437+ This is a simple example that demonstrate how to use the %Zorba %XQuery Engine
438+ to create, compile, and execute queries.
439 */
440
441
442=== added file 'doc/zorba/JSONforXQuery.dox'
443--- doc/zorba/JSONforXQuery.dox 1970-01-01 00:00:00 +0000
444+++ doc/zorba/JSONforXQuery.dox 2013-09-30 21:53:02 +0000
445@@ -0,0 +1,4 @@
446+/** \page JSON_for_XQuery JSONiq for XQuery users tutorial
447+
448+\htmlinclude JSONforXQuery.html
449+*/
450
451=== modified file 'doc/zorba/JSONforXQuery.html'
452--- doc/zorba/JSONforXQuery.html 2013-02-07 17:24:36 +0000
453+++ doc/zorba/JSONforXQuery.html 2013-09-30 21:53:02 +0000
454@@ -1,1 +1,1 @@
455-<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>
456\ No newline at end of file
457+<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>
458\ No newline at end of file
459
460=== added file 'doc/zorba/XQueryforJSON.dox'
461--- doc/zorba/XQueryforJSON.dox 1970-01-01 00:00:00 +0000
462+++ doc/zorba/XQueryforJSON.dox 2013-09-30 21:53:02 +0000
463@@ -0,0 +1,4 @@
464+/** \page XQuery_for_JSON JSONiq for JSON users tutorial
465+
466+\htmlinclude XQueryforJSON.html
467+*/
468
469=== modified file 'doc/zorba/XQueryforJSON.html'
470--- doc/zorba/XQueryforJSON.html 2013-02-07 17:24:36 +0000
471+++ doc/zorba/XQueryforJSON.html 2013-09-30 21:53:02 +0000
472@@ -1,1 +1,1 @@
473-<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>
474\ No newline at end of file
475+<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>
476
477=== modified file 'doc/zorba/build_and_install.dox'
478--- doc/zorba/build_and_install.dox 2013-02-07 17:24:36 +0000
479+++ doc/zorba/build_and_install.dox 2013-09-30 21:53:02 +0000
480@@ -5,22 +5,22 @@
481 Once you have successfully configured your Zorba build (as described
482 in \ref configure_zorba), you should now be able to build the project.
483
484-- For Makefile-based builds, just type \c make (or <tt>make j2</tt> to
485+- For Makefile-based builds, just type \c make (or \code make j2 \endcode to
486 do a parallel build on a multi-core machine) from inside the \c
487 {ZORBABUILD} directory.
488
489 - For IDE-based builds, open the project created in the previous step
490- and build the \c ALL target.
491+ and build the <b>ALL</b> target.
492
493 The build will take some time. If it finishes successfully, you're
494 ready to install and run Zorba.
495
496 \section install_zorba Installing Zorba
497
498-- For Makefile-based builds, just type <tt>make install</tt>. There
499-is also a <tt>make uninstall</tt> target.
500+- For Makefile-based builds, just type \code make install \endcode. There
501+is also a \code make uninstall \endcode target.
502
503-- For IDE-based builds, invoke the \c INSTALL project.
504+- For IDE-based builds, invoke the <b>INSTALL</b> project.
505
506 In either case, Zorba will be installed into the location specified by
507 the CMake configuration parameter \c CMAKE_INSTALL_PREFIX, as
508@@ -28,7 +28,7 @@
509
510 \section install_paths Setting the PATH
511
512-In order for users on your system to use Zorba, the \c bin/ subdirectory
513+In order for users on your system to use Zorba, the <b>bin/</b> subdirectory
514 of your installation directory must be on their path.
515
516 \section testing_install Testing your Zorba Installation
517@@ -50,10 +50,8 @@
518
519 \section build_help Help!
520
521-If you have any problems building or running Zorba, contact the \c
522-zorba-users mailing list. Sign up and see other instructions at
523+If you have any problems building or running Zorba, contact the <b>zorba-users<b>
524+mailing list. Sign up and see other instructions at
525 https://groups.google.com/forum/?hl=en&fromgroups#!forum/zorba-users .
526
527-
528 */
529-
530
531=== modified file 'doc/zorba/build_configure.dox'
532--- doc/zorba/build_configure.dox 2012-05-02 10:40:42 +0000
533+++ doc/zorba/build_configure.dox 2013-09-30 21:53:02 +0000
534@@ -10,10 +10,10 @@
535 The instructions in this section are based on executing commands at
536 the command line. It is also possible configure Zorba using CMake's
537 GUI configuration utility if you prefer. On Linux distributions, this
538-is often a separate package named \"\c cmake-gui\". On Windows, the
539+is often a separate package named <b>"cmake-gui"</b>. On Windows, the
540 GUI is installed by default and can be started via the Start menu. On
541-MacOS, it is available as the \"\c gui\" variant of the \c cmake
542-package.
543+MacOS, it is available as the <b>"gui"</b> variant of the
544+<a href="http://www.cmake.org/">CMake</a> package.
545
546 \note
547 The important configuration parameters - source and build directory;
548@@ -61,7 +61,7 @@
549 cmake -G "Visual Studio 10" {ZORBASRC} \endcode
550
551 The list of available Generators for your CMake installation
552-can be seen by typing \" <tt>cmake --help</tt> \".
553+can be seen by typing \code cmake --help \endcode.
554
555 \section configure_parameters Configuration Parameters (the -D arguments)
556
557
558=== modified file 'doc/zorba/build_macos.dox'
559--- doc/zorba/build_macos.dox 2012-05-02 10:40:42 +0000
560+++ doc/zorba/build_macos.dox 2013-09-30 21:53:02 +0000
561@@ -14,7 +14,7 @@
562 CMake on Mac OS X uses the Makefile generator.
563 Alternatively,
564 you can specify different generators (e.g., Xcode)
565-by starting CMake using the \c -G option (e.g., <tt>-G Xcode</tt>).
566+by starting CMake using the <b>-G</b> option (e.g., <b>-G Xcode</b>).
567
568 \section macos_swig Swig Version
569
570
571=== modified file 'doc/zorba/build_prepare.dox'
572--- doc/zorba/build_prepare.dox 2013-06-19 19:51:53 +0000
573+++ doc/zorba/build_prepare.dox 2013-09-30 21:53:02 +0000
574@@ -13,8 +13,8 @@
575
576 \subsection download_source Getting a Source Code Release
577
578-You may download the latest Zorba release source code as either a \c
579-.zip or \c .tar.gz file from Launchpad:
580+You may download the latest Zorba release source code as either a
581+<b>.zip</b> or <b>.tar.gz</b> file from Launchpad:
582 https://launchpad.net/zorba/+download .
583
584 \subsection checkout_source Getting the Latest Code from Launchpad
585@@ -77,15 +77,16 @@
586
587 \note
588 Please note that some of these modules depend on other modules. Most
589-notably, the EXPath http-client module (in the \c http-client module
590-package) depends on the \c html module, which is in the \c
591-data-converters module package. So, if you download the \c http-client
592-package, you must also download the \c data-converters package (and
593-ensure that \c libtidy is installed; see \ref noncore_requirements).
594+notably, the EXPath http-client module (in the
595+<a href="../modules/expath.org_ns_http-client.html">http-client</a> module
596+package) depends on the
597+<a href="../modules//www.zorba-xquery.com_modules_converters_html">html</a>
598+module, which is in the <b>data-converters</b> module package. So, if you
599+download the <b>http-client</b> package, you must also download the
600+<b>data-converters</b> package (and ensure that
601+<a href="http://tidy.sourceforge.net/">libtidy</a> is installed; see \ref noncore_requirements).
602 \note
603-Please see our <a
604-href="/img/documentation/2.9/zorba/modules.svg">module-interdependency
605-graph</a> for details.
606+Please see our <a href="../modules/images/modules.svg">module-interdependency graph</a> for details.
607
608 \section create_build_dir Creating a Build Directory
609
610@@ -93,7 +94,7 @@
611 href="http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F"
612 target="_blank">out-of-source build</a>, which means you need to
613 create a separate (empty) build directory. A common convention is to
614-create a directory named \"\c build\" in the Zorba source directory,
615+create a directory named <b>"build"</b> in the Zorba source directory,
616 but you may name it and place it anywhere you like. We refer to this
617 directory as \c {ZORBABUILD} in the following steps.
618
619
620=== modified file 'doc/zorba/build_prerequisites.dox'
621--- doc/zorba/build_prerequisites.dox 2013-06-19 15:19:17 +0000
622+++ doc/zorba/build_prerequisites.dox 2013-09-30 21:53:02 +0000
623@@ -45,7 +45,7 @@
624 (http://xerces.apache.org/xerces-c/). This package is required to
625 enable XML schema support. This feature is enabled by default. In
626 order to disable XML schema support, you need to provide the CMake
627- configuration parameter \c ZORBA_NO_XMLSCHEMA=ON. Note that the Zorba
628+ configuration parameter <b>ZORBA_NO_XMLSCHEMA=ON</b>. Note that the Zorba
629 team tests with Xerces-C 3.1.1. Xerces-C 2.8.0 in particular is known
630 to cause a few bugs with schema handling.
631
632@@ -53,7 +53,7 @@
633 required to enable Unicode support as well as some other
634 internationalization features. This feature is enabled by
635 default. To build without ICU, you need to provide the CMake
636- configuration parameter \c ZORBA_NO_ICU=ON.
637+ configuration parameter <b>ZORBA_NO_ICU=ON</b>.
638
639 \subsection optional_core_zorba Optional for Core Zorba
640
641@@ -63,14 +63,13 @@
642 by CMake.
643
644 - CURL (libcurl) 7.12 or later (http://curl.haxx.se/). This package is
645- required if <a
646- href="../xqdoc/xhtml/www.zorba-xquery.com_modules_http-client.html">Zorba's built-in
647+ required if <a href="../modules/www.zorba-xquery.com_modules_http-client.html">Zorba's built-in
648 HTTP module</a> should be available. Zorba will automatically be
649 built with this module if the curl packages are installed.
650 \note Please note that other modules depend on the http-client module
651 (i.e., import it). Hence, those dependent modules will not work if
652 the http module is not available. Please see our <a
653- href="../xqdoc/xhtml/images/modules.svg">module
654+ href="../modules/images/modules.svg">module
655 dependency graph</a> for the module inter-dependencies.
656 \note Also note that Zorba internally uses this module when resolving
657 http: URIs in queries, module/schema imports, and so on. If this
658@@ -78,12 +77,12 @@
659 URIs from the web.
660 \note If you happen to have libcurl installed but would like to build
661 Zorba without HTTP support, you may set the CMake configuration
662- parameter \c ZORBA_SUPPRESS_CURL=ON.
663+ parameter <b>ZORBA_SUPPRESS_CURL=ON</b>.
664
665 - LibXslt version 1.1.24 or later (http://xmlsoft.org/XSLT/). The
666 LibXslt package is required for XQueryX support. This feature is
667 not enabled by default. To enable XQueryX support, you need to
668- provide the CMake configuration parameter \c ZORBA_XQUERYX=ON.
669+ provide the CMake configuration parameter <b>ZORBA_XQUERYX=ON</b>.
670
671 - Flex 2.5.33 or later (http://flex.sourceforge.net/) and
672 Bison 2.4 or later (http://www.gnu.org/software/bison/) are
673@@ -101,9 +100,7 @@
674 that affects a small number of platforms, including at least
675 FreeBSD. If you get compilation errors that look similar to this:
676
677-\code
678- build/swig/php/zorba_apiPHP5_wrap.cxx:953: error: invalid conversion from 'const char*' to 'char*'
679-\endcode
680+ <b>build/swig/php/zorba_apiPHP5_wrap.cxx:953: error: invalid conversion from 'const char*' to 'char*'</b>
681
682 then you may have run into this bug. Our experience is that Swig
683 version at least 2.0.7 has corrected this bug, so please try upgrading
684@@ -123,14 +120,14 @@
685 All such modules are not built if the library (and development headers) they require are not available.
686 Here is a list of the libraries required by the current non-core modules packages:
687
688-- data-converters (CSV, HTML)
689+- data-converters (HTML module)
690 - Tidy (http://tidy.sourceforge.net)
691 - data-formatting (XSL-FO)
692 - Java (http://java.sun.com/javase/downloads/index.jsp)
693 - Apache FOP (http://xmlgraphics.apache.org/fop/download.html)
694-- email
695+- email (SMTP module)
696 - IMAP CClient (http://www.washington.edu/imap/)
697-- geo
698+- geo (GEO module)
699 - GEOS version 3.2.2 or later (http://trac.osgeo.org/geos/)
700 - EXPath http-client
701 - CURL 7.12 or later (http://curl.haxx.se/)
702@@ -139,6 +136,9 @@
703 - languages (XSLT)
704 - LibXslt version 1.1.24 or later (http://xmlsoft.org/XSLT/)
705
706+For a more up to date list please see section "External C++ Library dependencies"
707+in the <a href="../modules/images/modules.svg">module dependency graph</a>.
708+
709 In many cases you can find binary packages for these dependencies, which
710 will be the quickest and easiest way to meet the requirements. We have
711 provided links or instructions for downloading binary packages for some
712
713=== modified file 'doc/zorba/commandline.dox'
714--- doc/zorba/commandline.dox 2013-08-23 11:15:04 +0000
715+++ doc/zorba/commandline.dox 2013-09-30 21:53:02 +0000
716@@ -193,15 +193,15 @@
717 These are the files used in this example and their meaning:
718 <table border="0">
719 <tr>
720- <td><tt> works-mod.xml</tt></td>
721+ <td><tt>works-mod.xml</tt></td>
722 <td>File that will be used as external variable.</td>
723 </tr>
724 <tr>
725- <td><tt> comandline_doc_example_2.xq</tt></td>
726+ <td><tt>comandline_doc_example_2.xq</tt></td>
727 <td>This is an update query. For details please see below.</td>
728 </tr>
729 <tr>
730- <td><tt> comandline_doc_example_2-test.xq</tt></td>
731+ <td><tt>comandline_doc_example_2-test.xq</tt></td>
732 <td>Query used to see the results of the update query. For details please see below.</td>
733 </tr>
734 </table>
735
736=== modified file 'doc/zorba/conformance.dox'
737--- doc/zorba/conformance.dox 2013-06-19 22:47:21 +0000
738+++ doc/zorba/conformance.dox 2013-09-30 21:53:02 +0000
739@@ -14,33 +14,35 @@
740
741
742 \section summary_XQ10 Summary conformance W3C XQuery 1.0
743-<table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="4">
744+
745+\htmlonly
746+<table border="1" cellpadding="4">
747 <tr>
748- <td bgcolor="paleturquoise">
749+ <td bgcolor="lightcyan">
750 Product
751 </td>
752- <td bgcolor="paleturquoise">
753+ <td bgcolor="lightcyan">
754 Version
755 </td>
756- <td bgcolor="paleturquoise">
757+ <td bgcolor="lightcyan">
758 Tests passed
759 </td>
760- <td bgcolor="paleturquoise">
761+ <td bgcolor="lightcyan">
762 Tests failed
763 </td>
764- <td bgcolor="paleturquoise">
765+ <td bgcolor="lightcyan">
766 Tests run
767 </td>
768- <td bgcolor="paleturquoise">
769+ <td bgcolor="lightcyan">
770 % passed
771 </td>
772 </tr>
773 <tr>
774- <td bgcolor="paleturquoise">
775+ <td bgcolor="lightcyan">
776 Zorba
777 </td>
778- <td bgcolor="paleturquoise">
779- 2.9.1
780+ <td bgcolor="lightcyan">
781+ 1.9.1
782 </td>
783 <td>
784 21581
785@@ -56,36 +58,38 @@
786 </td>
787 </tr>
788 </table>
789+\endhtmlonly
790
791 \section summary_XQ30 Summary conformance W3C XQuery 3.0
792
793-<table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="4">
794+\htmlonly
795+<table border="1" cellpadding="4">
796 <tr>
797- <td bgcolor="paleturquoise">
798+ <td bgcolor="lightcyan">
799 Product
800 </td>
801- <td bgcolor="paleturquoise">
802+ <td bgcolor="lightcyan">
803 Version
804 </td>
805- <td bgcolor="paleturquoise">
806+ <td bgcolor="lightcyan">
807 Tests passed
808 </td>
809- <td bgcolor="paleturquoise">
810+ <td bgcolor="lightcyan">
811 Tests failed
812 </td>
813- <td bgcolor="paleturquoise">
814+ <td bgcolor="lightcyan">
815 Tests run
816 </td>
817- <td bgcolor="paleturquoise">
818+ <td bgcolor="lightcyan">
819 % passed
820 </td>
821 </tr>
822 <tr>
823- <td bgcolor="paleturquoise">
824+ <td bgcolor="lightcyan">
825 Zorba
826 </td>
827- <td bgcolor="paleturquoise">
828- 2.9.1
829+ <td bgcolor="lightcyan">
830+ 1.9.1
831 </td>
832 <td>
833 25897
834@@ -101,215 +105,179 @@
835 </td>
836 </tr>
837 </table>
838+\endhtmlonly
839
840 \section summaryXQUTS Summary conformance W3C XQuery Update Facility 1.0
841
842 The following table shows the supported features:
843-<table bgcolor="lightcyan">
844- <tr>
845- <td>W3C XQuery Update Facility 1.0 feature</td>
846- <td>supported</td>
847- </tr>
848- <tr>
849- <td></td>
850- <td></td>
851- </tr>
852- <tr>
853- <td>Minimal Conformance</td>
854+\htmlonly
855+<table border="1">
856+ <tr>
857+ <td bgcolor="lightcyan">W3C XQuery Update Facility 1.0 feature</td>
858+ <td bgcolor="lightcyan">supported</td>
859+ </tr>
860+ <tr>
861+ <td bgcolor="lightcyan">Minimal Conformance</td>
862 <td bgcolor="mediumseagreen">true</td>
863 </tr>
864 <tr>
865- <td>Update Facility Static Typing Feature</td>
866+ <td bgcolor="lightcyan">Update Facility Static Typing Feature</td>
867 <td bgcolor="white">false</td>
868 </tr>
869 </table>
870+\endhtmlonly
871
872 This is the W3C XQuery Update Facility 1.0 conformance summary:
873 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).
874-<table bgcolor="lightcyan">
875- <tr>
876- <td>W3C XQuery Update Facility 1.0 feature</td>
877- <td>supported</td>
878- </tr>
879- <tr>
880- <td></td>
881- <td></td>
882- </tr>
883- <tr>
884- <td>Minimal Conformance</td>
885- <td bgcolor="mediumseagreen">true</td>
886- </tr>
887- <tr>
888- <td>Update Facility Static Typing Feature</td>
889- <td bgcolor="white">false</td>
890- </tr>
891-</table>
892-<table bgcolor="lightcyan">
893- <tr>
894- <td>W3C XQuery Update Facility 1.0 features</td>
895- <td>XQuery</td>
896- <td>XQueryX</td>
897- </tr>
898- <tr>
899- <td></td>
900- <td></td>
901- <td></td>
902- </tr>
903- <tr bgcolor="lightcyan">
904+\htmlonly
905+<table border="1">
906+ <tr>
907+ <td bgcolor="lightcyan">W3C XQuery Update Facility 1.0 features</td>
908+ <td bgcolor="lightcyan">XQuery</td>
909+ <td bgcolor="lightcyan">XQueryX</td>
910+ </tr>
911+ <tr>
912 <td bgcolor="lightcyan">Minimal Conformance</td>
913- <td align="center" bgcolor="mediumseagreen">667/667<br />100%</td>
914- <td align="center" bgcolor="mediumseagreen">667/667<br />100%</td>
915+ <td align="center" bgcolor="mediumseagreen">667/667 100%</td>
916+ <td align="center" bgcolor="mediumseagreen">667/667 100%</td>
917 </tr>
918 <tr bgcolor="lightcyan">
919 <td bgcolor="lightcyan">Optional Features</td>
920- <td align="center" bgcolor="palegreen">97/126<br />76.98%</td>
921- <td align="center" bgcolor="palegreen">97/126<br />76.98%</td>
922+ <td align="center" bgcolor="palegreen">97/126 76.98%</td>
923+ <td align="center" bgcolor="palegreen">97/126 76.98%</td>
924 </tr>
925 <tr bgcolor="lightcyan">
926 <td bgcolor="lightcyan">  Revalidation</td>
927- <td align="center" bgcolor="palegreen">76/77<br />
928- </td>
929- <td align="center" bgcolor="palegreen">76/77<br />
930- </td>
931+ <td align="center" bgcolor="palegreen">76/77 </td>
932+ <td align="center" bgcolor="palegreen">76/77 </td>
933 </tr>
934 <tr bgcolor="lightcyan">
935 <td bgcolor="lightcyan">  Update Facility Static Typing Feature</td>
936- <td align="center" bgcolor="white">0/27<br />
937- </td>
938- <td align="center" bgcolor="white">0/27<br />
939- </td>
940+ <td align="center" bgcolor="white">0/27 </td>
941+ <td align="center" bgcolor="white">0/27 </td>
942 </tr>
943 <tr bgcolor="lightcyan">
944 <td bgcolor="lightcyan">  Tests that need the Full Axis Feature</td>
945- <td align="center" bgcolor="mediumseagreen">14/14<br />
946- </td>
947- <td align="center" bgcolor="mediumseagreen">14/14<br />
948- </td>
949+ <td align="center" bgcolor="mediumseagreen">14/14 </td>
950+ <td align="center" bgcolor="mediumseagreen">14/14 </td>
951 </tr>
952 <tr bgcolor="lightcyan">
953 <td bgcolor="lightcyan">  fn:put applied to nodes other than document and element nodes</td>
954- <td align="center" bgcolor="palegreen">7/8<br />
955- </td>
956- <td align="center" bgcolor="palegreen">7/8<br />
957- </td>
958+ <td align="center" bgcolor="palegreen">7/8 </td>
959+ <td align="center" bgcolor="palegreen">7/8 </td>
960 </tr>
961 <tr bgcolor="lightcyan">
962 <td bgcolor="lightcyan">Use Cases</td>
963- <td align="center" bgcolor="mediumseagreen">22/22<br />100%</td>
964- <td align="center" bgcolor="mediumseagreen">22/22<br />100%</td>
965+ <td align="center" bgcolor="mediumseagreen">22/22 100%</td>
966+ <td align="center" bgcolor="mediumseagreen">22/22 100%</td>
967 </tr>
968 </table>
969+\endhtmlonly
970
971 \section summaryXQFTTS Summary conformance W3C XQuery and XPath Full Text 1.0
972 The following table shows the supported features:
973-<table bgcolor="lightcyan">
974- <tr>
975- <td>W3C XQuery and XPath Full Text 1.0 features</td>
976- <td>supported</td>
977- </tr>
978- <tr>
979- <td></td>
980- <td></td>
981- </tr>
982- <tr>
983- <td>Minimal Conformance</td>
984- <td bgcolor="mediumseagreen">true</td>
985- </tr>
986- <tr>
987- <td>FTMildNot Operator</td>
988- <td bgcolor="mediumseagreen">true</td>
989- </tr>
990- <tr>
991- <td>FTUnaryNot Operator</td>
992- <td bgcolor="mediumseagreen">true</td>
993- </tr>
994- <tr>
995- <td>FTUnit and FTBigUnit</td>
996- <td bgcolor="mediumseagreen">true</td>
997- </tr>
998- <tr>
999- <td>FTOrder Operator</td>
1000- <td bgcolor="mediumseagreen">true</td>
1001- </tr>
1002- <tr>
1003- <td>FTScope Operator</td>
1004- <td bgcolor="mediumseagreen">true</td>
1005- </tr>
1006- <tr>
1007- <td>FTWindow Operator</td>
1008- <td bgcolor="mediumseagreen">true</td>
1009- </tr>
1010- <tr>
1011- <td>FTDistance Operator</td>
1012- <td bgcolor="mediumseagreen">true</td>
1013- </tr>
1014- <tr>
1015- <td>FTTimes Operator</td>
1016- <td bgcolor="mediumseagreen">true</td>
1017- </tr>
1018- <tr>
1019- <td>FTContent Operator</td>
1020- <td bgcolor="mediumseagreen">true</td>
1021- </tr>
1022- <tr>
1023- <td>FTCaseOption</td>
1024- <td bgcolor="mediumseagreen">true</td>
1025- </tr>
1026- <tr>
1027- <td>FTStopwordOption</td>
1028- <td bgcolor="mediumseagreen">true</td>
1029- </tr>
1030- <tr>
1031- <td>FTLanguageOption</td>
1032- <td bgcolor="mediumseagreen">true</td>
1033- </tr>
1034- <tr>
1035- <td>FTIgnoreOption</td>
1036- <td bgcolor="white">false</td>
1037- </tr>
1038- <tr>
1039- <td>Scoring</td>
1040- <td bgcolor="white">false</td>
1041- </tr>
1042- <tr>
1043- <td>Weights</td>
1044+\htmlonly
1045+<table border="1">
1046+ <tr>
1047+ <td bgcolor="lightcyan">W3C XQuery and XPath Full Text 1.0 features</td>
1048+ <td bgcolor="lightcyan">supported</td>
1049+ </tr>
1050+ <tr>
1051+ <td bgcolor="lightcyan">Minimal Conformance</td>
1052+ <td bgcolor="mediumseagreen">true</td>
1053+ </tr>
1054+ <tr>
1055+ <td bgcolor="lightcyan">FTMildNot Operator</td>
1056+ <td bgcolor="mediumseagreen">true</td>
1057+ </tr>
1058+ <tr>
1059+ <td bgcolor="lightcyan">FTUnaryNot Operator</td>
1060+ <td bgcolor="mediumseagreen">true</td>
1061+ </tr>
1062+ <tr>
1063+ <td bgcolor="lightcyan">FTUnit and FTBigUnit</td>
1064+ <td bgcolor="mediumseagreen">true</td>
1065+ </tr>
1066+ <tr>
1067+ <td bgcolor="lightcyan">FTOrder Operator</td>
1068+ <td bgcolor="mediumseagreen">true</td>
1069+ </tr>
1070+ <tr>
1071+ <td bgcolor="lightcyan">FTScope Operator</td>
1072+ <td bgcolor="mediumseagreen">true</td>
1073+ </tr>
1074+ <tr>
1075+ <td bgcolor="lightcyan">FTWindow Operator</td>
1076+ <td bgcolor="mediumseagreen">true</td>
1077+ </tr>
1078+ <tr>
1079+ <td bgcolor="lightcyan">FTDistance Operator</td>
1080+ <td bgcolor="mediumseagreen">true</td>
1081+ </tr>
1082+ <tr>
1083+ <td bgcolor="lightcyan">FTTimes Operator</td>
1084+ <td bgcolor="mediumseagreen">true</td>
1085+ </tr>
1086+ <tr>
1087+ <td bgcolor="lightcyan">FTContent Operator</td>
1088+ <td bgcolor="mediumseagreen">true</td>
1089+ </tr>
1090+ <tr>
1091+ <td bgcolor="lightcyan">FTCaseOption</td>
1092+ <td bgcolor="mediumseagreen">true</td>
1093+ </tr>
1094+ <tr>
1095+ <td bgcolor="lightcyan">FTStopwordOption</td>
1096+ <td bgcolor="mediumseagreen">true</td>
1097+ </tr>
1098+ <tr>
1099+ <td bgcolor="lightcyan">FTLanguageOption</td>
1100+ <td bgcolor="mediumseagreen">true</td>
1101+ </tr>
1102+ <tr>
1103+ <td bgcolor="lightcyan">FTIgnoreOption</td>
1104+ <td bgcolor="white">false</td>
1105+ </tr>
1106+ <tr>
1107+ <td bgcolor="lightcyan">Scoring</td>
1108+ <td bgcolor="white">false</td>
1109+ </tr>
1110+ <tr>
1111+ <td bgcolor="lightcyan">Weights</td>
1112 <td bgcolor="white">false</td>
1113 </tr>
1114 </table>
1115+\endhtmlonly
1116
1117 This is the W3C XQuery and XPath Full Text 1.0 conformance summary:
1118 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).
1119-
1120-<table bgcolor="lightcyan">
1121- <tr>
1122- <td>W3C XQuery and XPath Full Text 1.0 features</td>
1123- <td>XQuery</td>
1124- <td>XQueryX</td>
1125- </tr>
1126- <tr>
1127- <td></td>
1128- <td></td>
1129- <td></td>
1130- </tr>
1131- <tr bgcolor="lightcyan">
1132+\htmlonly
1133+<table border="1">
1134+ <tr>
1135+ <td bgcolor="lightcyan">W3C XQuery and XPath Full Text 1.0 features</td>
1136+ <td bgcolor="lightcyan">XQuery</td>
1137+ <td bgcolor="lightcyan">XQueryX</td>
1138+ </tr>
1139+ <tr>
1140 <td bgcolor="lightcyan">Minimal Conformance</td>
1141- <td align="center" bgcolor="palegreen">384/429<br />89.51%</td>
1142- <td align="center" bgcolor="palegreen">374/429<br />87.18%</td>
1143+ <td align="center" bgcolor="palegreen">384/429 89.51%</td>
1144+ <td align="center" bgcolor="palegreen">374/429 87.18%</td>
1145 </tr>
1146- <tr bgcolor="lightcyan">
1147+ <tr>
1148 <td bgcolor="lightcyan">Optional Features</td>
1149- <td align="center" bgcolor="palegreen">106/125<br />84.8%</td>
1150- <td align="center" bgcolor="palegreen">97/125<br />77.6%</td>
1151+ <td align="center" bgcolor="palegreen">106/125 84.8%</td>
1152+ <td align="center" bgcolor="palegreen">97/125 77.6%</td>
1153 </tr>
1154- <tr bgcolor="lightcyan">
1155+ <tr>
1156 <td bgcolor="lightcyan">Use Cases</td>
1157- <td align="center" bgcolor="palegreen">120/135<br />88.89%</td>
1158- <td align="center" bgcolor="palegreen">102/135<br />75.56%</td>
1159+ <td align="center" bgcolor="palegreen">120/135 88.89%</td>
1160+ <td align="center" bgcolor="palegreen">102/135 75.56%</td>
1161 </tr>
1162- <tr bgcolor="lightcyan">
1163+ <tr>
1164 <td bgcolor="lightcyan">Consistency in XQFTTS Catalog</td>
1165- <td align="center" bgcolor="mediumseagreen">3/3<br />100%</td>
1166- <td align="center" bgcolor="mediumseagreen">3/3<br />100%</td>
1167+ <td align="center" bgcolor="mediumseagreen">3/3 100%</td>
1168+ <td align="center" bgcolor="mediumseagreen">3/3 100%</td>
1169 </tr>
1170 </table>
1171+\endhtmlonly
1172 */
1173
1174=== modified file 'doc/zorba/conformanceXQFTTS.dox'
1175--- doc/zorba/conformanceXQFTTS.dox 2013-02-07 17:24:36 +0000
1176+++ doc/zorba/conformanceXQFTTS.dox 2013-09-30 21:53:02 +0000
1177@@ -2,19 +2,15 @@
1178
1179 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).
1180 Zorba achieves 89.51% on minimal conformance (and 84.8% on Optional Features) for the W3C XPath Full Text 1.0 Test Suite.
1181-
1182-Please see the table below for more details.
1183-<table bgcolor="lightcyan">
1184+
1185+Please see the table below for more details.
1186+\htmlonly
1187+<table border="1" bgcolor="lightcyan">
1188 <tr>
1189 <td>W3C XQuery and XPath Full Text 1.0 features</td>
1190 <td>XQuery</td>
1191 <td>XQueryX</td>
1192 </tr>
1193- <tr>
1194- <td></td>
1195- <td></td>
1196- <td></td>
1197- </tr>
1198 <tr bgcolor="lightcyan">
1199 <td bgcolor="paleturquoise">Minimal Conformance</td>
1200 <td align="center" bgcolor="paleturquoise"></td>
1201@@ -486,4 +482,5 @@
1202 <td align="center" bgcolor="mediumseagreen">3/3</td>
1203 </tr>
1204 </table>
1205+\endhtmlonly
1206 */
1207\ No newline at end of file
1208
1209=== modified file 'doc/zorba/conformanceXQUTS.dox'
1210--- doc/zorba/conformanceXQUTS.dox 2013-02-07 17:24:36 +0000
1211+++ doc/zorba/conformanceXQUTS.dox 2013-09-30 21:53:02 +0000
1212@@ -2,19 +2,15 @@
1213
1214 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).
1215 Zorba achieves 100% on minimal conformance (and 76.98% on Optional Features) for the W3C XQuery Update Facility Test Suite.
1216-
1217-Please see the table below for more details.
1218-<table bgcolor="lightcyan">
1219+
1220+Please see the table below for more details.
1221+\htmlonly
1222+<table border="1" bgcolor="lightcyan">
1223 <tr>
1224 <td>W3C XQuery Update Facility 1.0 features</td>
1225 <td>XQuery</td>
1226 <td>XQueryX</td>
1227 </tr>
1228- <tr>
1229- <td></td>
1230- <td></td>
1231- <td></td>
1232- </tr>
1233 <tr bgcolor="lightcyan">
1234 <td bgcolor="paleturquoise">Minimal Conformance</td>
1235 <td align="center" bgcolor="paleturquoise"></td>
1236@@ -251,7 +247,8 @@
1237 <td align="center" bgcolor="mediumseagreen">14/14</td>
1238 </tr>
1239 <tr bgcolor="lightcyan">
1240- <td bgcolor="paleturquoise">  fn:put applied to nodes other than document and element nodes</td>
1241+ <td bgcolor="paleturquoise">  fn:put applied to nodes other than document and element
1242+ nodes</td>
1243 <td align="center" bgcolor="paleturquoise"></td>
1244 <td align="center" bgcolor="paleturquoise"></td>
1245 </tr>
1246@@ -271,7 +268,8 @@
1247 <td align="center" bgcolor="mediumseagreen">1/1</td>
1248 </tr>
1249 <tr bgcolor="lightcyan">
1250- <td bgcolor="lightcyan">    fn:put() applied to processing-instruction nodes - unsupported</td>
1251+ <td bgcolor="lightcyan">    fn:put() applied to processing-instruction nodes -
1252+ unsupported</td>
1253 <td align="center" bgcolor="mediumseagreen">1/1</td>
1254 <td align="center" bgcolor="mediumseagreen">1/1</td>
1255 </tr>
1256@@ -316,7 +314,8 @@
1257 <td align="center" bgcolor="mediumseagreen">1/1</td>
1258 </tr>
1259 <tr bgcolor="lightcyan">
1260- <td bgcolor="lightcyan">  Use Cases "Namespaces" - moving elements from one namespace to another</td>
1261+ <td bgcolor="lightcyan">  Use Cases "Namespaces" - moving elements from one namespace to
1262+ another</td>
1263 <td align="center" bgcolor="mediumseagreen">1/1</td>
1264 <td align="center" bgcolor="mediumseagreen">1/1</td>
1265 </tr>
1266@@ -331,4 +330,5 @@
1267 <td align="center" bgcolor="mediumseagreen">1/1</td>
1268 </tr>
1269 </table>
1270+\endhtmlonly
1271 */
1272\ No newline at end of file
1273
1274=== modified file 'doc/zorba/conformance_XQ10.dox'
1275--- doc/zorba/conformance_XQ10.dox 2013-06-19 22:47:21 +0000
1276+++ doc/zorba/conformance_XQ10.dox 2013-09-30 21:53:02 +0000
1277@@ -9,3041 +9,1537 @@
1278 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>.
1279
1280 Please see the table below for more details.
1281-
1282+\htmlonly
1283 <table border="1" width="100%">
1284 <th>
1285- <b>
1286- Summary of results for XQuery 1.0
1287- </b>
1288+ <b> Summary of results for XQuery 1.0 </b>
1289 </th>
1290 <tr>
1291 <td>
1292 <table>
1293 <tr>
1294- <td>
1295- Legend:&nbsp;&nbsp;&nbsp;&nbsp;
1296- </td>
1297+ <td> Legend:&nbsp;&nbsp;&nbsp;&nbsp; </td>
1298 <td>
1299 <table>
1300 <tr>
1301- <td bgcolor="mediumseagreen">
1302- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1303+ <td bgcolor="mediumseagreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1304 </td>
1305 </tr>
1306 </table>
1307 </td>
1308- <td>
1309- passed
1310- </td>
1311- <td>
1312- &nbsp;&nbsp;&nbsp;&nbsp;
1313- </td>
1314- <td>
1315- <table>
1316- <tr>
1317- <td bgcolor="palegreen">
1318- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1319- </td>
1320- </tr>
1321- </table>
1322- </td>
1323- <td>
1324- almost passed<br>(≥ 98%)
1325- </td>
1326- <td>
1327- &nbsp;&nbsp;&nbsp;&nbsp;
1328- </td>
1329- <td>
1330- <table>
1331- <tr>
1332- <td bgcolor="coral">
1333- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1334- </td>
1335- </tr>
1336- </table>
1337- </td>
1338- <td>
1339- failed
1340- </td>
1341- <td>
1342- &nbsp;&nbsp;&nbsp;&nbsp;
1343- </td>
1344- <td>
1345- <table>
1346- <tr>
1347- <td bgcolor="white">
1348- &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
1349- </td>
1350- </tr>
1351- </table>
1352- </td>
1353- <td>
1354- untested
1355- </td>
1356+ <td> passed </td>
1357+ <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
1358+ <td>
1359+ <table>
1360+ <tr>
1361+ <td bgcolor="palegreen"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
1362+ </tr>
1363+ </table>
1364+ </td>
1365+ <td> almost passed (≥ 98%) </td>
1366+ <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
1367+ <td>
1368+ <table>
1369+ <tr>
1370+ <td bgcolor="coral"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
1371+ </tr>
1372+ </table>
1373+ </td>
1374+ <td> failed </td>
1375+ <td> &nbsp;&nbsp;&nbsp;&nbsp; </td>
1376+ <td>
1377+ <table>
1378+ <tr>
1379+ <td bgcolor="white"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </td>
1380+ </tr>
1381+ </table>
1382+ </td>
1383+ <td> untested </td>
1384 </tr>
1385 </table>
1386- </td>
1387- </tr>
1388- </table>
1389+ </td>
1390+ </tr>
1391+</table>
1392+\endhtmlonly
1393+
1394+\htmlonly
1395 <table border="1" bordercolor="black" bgcolor="lightcyan" cellpadding="2">
1396 <tr>
1397- <th>
1398- Tests
1399- </th>
1400- <th>
1401- Zorba 2.9.1
1402- <br>
1403- XQ30
1404- <br>
1405- (QT3 vCVS)
1406- </th>
1407- </tr>
1408- <tr>
1409- <td valign="top">
1410- fn-abs
1411- </td>
1412- <td align="center" bgcolor="mediumseagreen">
1413- 183/183
1414- </td>
1415- </tr>
1416- <tr>
1417- <td valign="top">
1418- fn-adjust-date-to-timezone
1419- </td>
1420- <td align="center" bgcolor="mediumseagreen">
1421- 40/40
1422- </td>
1423- </tr>
1424- <tr>
1425- <td valign="top">
1426- fn-adjust-dateTime-to-timezone
1427- </td>
1428- <td align="center" bgcolor="mediumseagreen">
1429- 47/47
1430- </td>
1431- </tr>
1432- <tr>
1433- <td valign="top">
1434- fn-adjust-time-to-timezone
1435- </td>
1436- <td align="center" bgcolor="mediumseagreen">
1437- 41/41
1438- </td>
1439- </tr>
1440- <tr>
1441- <td valign="top">
1442- fn-analyze-string
1443- </td>
1444- <td align="center" bgcolor="white">
1445- 0/0
1446- </td>
1447- </tr>
1448- <tr>
1449- <td valign="top">
1450- fn-available-environment-variables
1451- </td>
1452- <td align="center" bgcolor="mediumseagreen">
1453- 1/1
1454- </td>
1455- </tr>
1456- <tr>
1457- <td valign="top">
1458- fn-avg
1459- </td>
1460- <td align="center" bgcolor="mediumseagreen">
1461- 237/237
1462- </td>
1463- </tr>
1464- <tr>
1465- <td valign="top">
1466- fn-base-uri
1467- </td>
1468- <td align="center" bgcolor="mediumseagreen">
1469- 62/62
1470- </td>
1471- </tr>
1472- <tr>
1473- <td valign="top">
1474- fn-boolean
1475- </td>
1476- <td align="center" bgcolor="mediumseagreen">
1477- 136/136
1478- </td>
1479- </tr>
1480- <tr>
1481- <td valign="top">
1482- fn-ceiling
1483- </td>
1484- <td align="center" bgcolor="mediumseagreen">
1485- 87/87
1486- </td>
1487- </tr>
1488- <tr>
1489- <td valign="top">
1490- fn-codepoint-equal
1491- </td>
1492- <td align="center" bgcolor="mediumseagreen">
1493- 36/36
1494- </td>
1495- </tr>
1496- <tr>
1497- <td valign="top">
1498- fn-codepoints-to-string
1499- </td>
1500- <td align="center" bgcolor="mediumseagreen">
1501- 76/76
1502- </td>
1503- </tr>
1504- <tr>
1505- <td valign="top">
1506- fn-collection
1507- </td>
1508- <td align="center" bgcolor="coral">
1509- 18/29
1510- </td>
1511- </tr>
1512- <tr>
1513- <td valign="top">
1514- fn-compare
1515- </td>
1516- <td align="center" bgcolor="palegreen">
1517- 63/64
1518- </td>
1519- </tr>
1520- <tr>
1521- <td valign="top">
1522- fn-concat
1523- </td>
1524- <td align="center" bgcolor="mediumseagreen">
1525- 95/95
1526- </td>
1527- </tr>
1528- <tr>
1529- <td valign="top">
1530- fn-contains
1531- </td>
1532- <td align="center" bgcolor="mediumseagreen">
1533- 41/41
1534- </td>
1535- </tr>
1536- <tr>
1537- <td valign="top">
1538- fn-count
1539- </td>
1540- <td align="center" bgcolor="mediumseagreen">
1541- 316/316
1542- </td>
1543- </tr>
1544- <tr>
1545- <td valign="top">
1546- fn-current-date
1547- </td>
1548- <td align="center" bgcolor="mediumseagreen">
1549- 26/26
1550- </td>
1551- </tr>
1552- <tr>
1553- <td valign="top">
1554- fn-current-dateTime
1555- </td>
1556- <td align="center" bgcolor="mediumseagreen">
1557- 27/27
1558- </td>
1559- </tr>
1560- <tr>
1561- <td valign="top">
1562- fn-current-time
1563- </td>
1564- <td align="center" bgcolor="mediumseagreen">
1565- 24/24
1566- </td>
1567- </tr>
1568- <tr>
1569- <td valign="top">
1570- fn-data
1571- </td>
1572- <td align="center" bgcolor="mediumseagreen">
1573- 53/53
1574- </td>
1575- </tr>
1576- <tr>
1577- <td valign="top">
1578- fn-dateTime
1579- </td>
1580- <td align="center" bgcolor="mediumseagreen">
1581- 52/52
1582- </td>
1583- </tr>
1584- <tr>
1585- <td valign="top">
1586- fn-day-from-date
1587- </td>
1588- <td align="center" bgcolor="mediumseagreen">
1589- 27/27
1590- </td>
1591- </tr>
1592- <tr>
1593- <td valign="top">
1594- fn-day-from-dateTime
1595- </td>
1596- <td align="center" bgcolor="mediumseagreen">
1597- 27/27
1598- </td>
1599- </tr>
1600- <tr>
1601- <td valign="top">
1602- fn-days-from-duration
1603- </td>
1604- <td align="center" bgcolor="mediumseagreen">
1605- 31/31
1606- </td>
1607- </tr>
1608- <tr>
1609- <td valign="top">
1610- fn-deep-equal
1611- </td>
1612- <td align="center" bgcolor="coral">
1613- 204/210
1614- </td>
1615- </tr>
1616- <tr>
1617- <td valign="top">
1618- fn-default-collation
1619- </td>
1620- <td align="center" bgcolor="mediumseagreen">
1621- 7/7
1622- </td>
1623- </tr>
1624- <tr>
1625- <td valign="top">
1626- fn-distinct-values
1627- </td>
1628- <td align="center" bgcolor="mediumseagreen">
1629- 104/104
1630- </td>
1631- </tr>
1632- <tr>
1633- <td valign="top">
1634- fn-doc
1635- </td>
1636- <td align="center" bgcolor="mediumseagreen">
1637- 43/43
1638- </td>
1639- </tr>
1640- <tr>
1641- <td valign="top">
1642- fn-doc-available
1643- </td>
1644- <td align="center" bgcolor="mediumseagreen">
1645- 13/13
1646- </td>
1647- </tr>
1648- <tr>
1649- <td valign="top">
1650- fn-document-uri
1651- </td>
1652- <td align="center" bgcolor="mediumseagreen">
1653- 35/35
1654- </td>
1655- </tr>
1656- <tr>
1657- <td valign="top">
1658- fn-element-with-id
1659- </td>
1660- <td align="center" bgcolor="mediumseagreen">
1661- 5/5
1662- </td>
1663- </tr>
1664- <tr>
1665- <td valign="top">
1666- fn-empty
1667- </td>
1668- <td align="center" bgcolor="mediumseagreen">
1669- 54/54
1670- </td>
1671- </tr>
1672- <tr>
1673- <td valign="top">
1674- fn-encode-for-uri
1675- </td>
1676- <td align="center" bgcolor="mediumseagreen">
1677- 29/29
1678- </td>
1679- </tr>
1680- <tr>
1681- <td valign="top">
1682- fn-ends-with
1683- </td>
1684- <td align="center" bgcolor="mediumseagreen">
1685- 38/38
1686- </td>
1687- </tr>
1688- <tr>
1689- <td valign="top">
1690- fn-environment-variable
1691- </td>
1692- <td align="center" bgcolor="mediumseagreen">
1693- 3/3
1694- </td>
1695- </tr>
1696- <tr>
1697- <td valign="top">
1698- fn-error
1699- </td>
1700- <td align="center" bgcolor="mediumseagreen">
1701- 97/97
1702- </td>
1703- </tr>
1704- <tr>
1705- <td valign="top">
1706- fn-escape-html-uri
1707- </td>
1708- <td align="center" bgcolor="mediumseagreen">
1709- 34/34
1710- </td>
1711- </tr>
1712- <tr>
1713- <td valign="top">
1714- fn-exactly-one
1715- </td>
1716- <td align="center" bgcolor="mediumseagreen">
1717- 54/54
1718- </td>
1719- </tr>
1720- <tr>
1721- <td valign="top">
1722- fn-exists
1723- </td>
1724- <td align="center" bgcolor="mediumseagreen">
1725- 58/58
1726- </td>
1727- </tr>
1728- <tr>
1729- <td valign="top">
1730- fn-false
1731- </td>
1732- <td align="center" bgcolor="mediumseagreen">
1733- 24/24
1734- </td>
1735- </tr>
1736- <tr>
1737- <td valign="top">
1738- fn-filter
1739- </td>
1740- <td align="center" bgcolor="white">
1741- 0/0
1742- </td>
1743- </tr>
1744- <tr>
1745- <td valign="top">
1746- fn-floor
1747- </td>
1748- <td align="center" bgcolor="mediumseagreen">
1749- 88/88
1750- </td>
1751- </tr>
1752- <tr>
1753- <td valign="top">
1754- fn-fold-left
1755- </td>
1756- <td align="center" bgcolor="white">
1757- 0/0
1758- </td>
1759- </tr>
1760- <tr>
1761- <td valign="top">
1762- fn-fold-right
1763- </td>
1764- <td align="center" bgcolor="white">
1765- 0/0
1766- </td>
1767- </tr>
1768- <tr>
1769- <td valign="top">
1770- fn-format-date
1771- </td>
1772- <td align="center" bgcolor="white">
1773- 0/0
1774- </td>
1775- </tr>
1776- <tr>
1777- <td valign="top">
1778- fn-format-dateTime
1779- </td>
1780- <td align="center" bgcolor="white">
1781- 0/0
1782- </td>
1783- </tr>
1784- <tr>
1785- <td valign="top">
1786- fn-format-integer
1787- </td>
1788- <td align="center" bgcolor="white">
1789- 0/0
1790- </td>
1791- </tr>
1792- <tr>
1793- <td valign="top">
1794- fn-format-number
1795- </td>
1796- <td align="center" bgcolor="white">
1797- 0/0
1798- </td>
1799- </tr>
1800- <tr>
1801- <td valign="top">
1802- fn-format-time
1803- </td>
1804- <td align="center" bgcolor="white">
1805- 0/0
1806- </td>
1807- </tr>
1808- <tr>
1809- <td valign="top">
1810- fn-function-lookup
1811- </td>
1812- <td align="center" bgcolor="white">
1813- 0/0
1814- </td>
1815- </tr>
1816- <tr>
1817- <td valign="top">
1818- fn-function-arity
1819- </td>
1820- <td align="center" bgcolor="white">
1821- 0/0
1822- </td>
1823- </tr>
1824- <tr>
1825- <td valign="top">
1826- fn-function-name
1827- </td>
1828- <td align="center" bgcolor="white">
1829- 0/0
1830- </td>
1831- </tr>
1832- <tr>
1833- <td valign="top">
1834- fn-generate-id
1835- </td>
1836- <td align="center" bgcolor="white">
1837- 0/0
1838- </td>
1839- </tr>
1840- <tr>
1841- <td valign="top">
1842- fn-has-children
1843- </td>
1844- <td align="center" bgcolor="white">
1845- 0/0
1846- </td>
1847- </tr>
1848- <tr>
1849- <td valign="top">
1850- fn-head
1851- </td>
1852- <td align="center" bgcolor="white">
1853- 0/0
1854- </td>
1855- </tr>
1856- <tr>
1857- <td valign="top">
1858- fn-hours-from-dateTime
1859- </td>
1860- <td align="center" bgcolor="mediumseagreen">
1861- 27/27
1862- </td>
1863- </tr>
1864- <tr>
1865- <td valign="top">
1866- fn-hours-from-duration
1867- </td>
1868- <td align="center" bgcolor="mediumseagreen">
1869- 31/31
1870- </td>
1871- </tr>
1872- <tr>
1873- <td valign="top">
1874- fn-hours-from-time
1875- </td>
1876- <td align="center" bgcolor="mediumseagreen">
1877- 27/27
1878- </td>
1879- </tr>
1880- <tr>
1881- <td valign="top">
1882- fn-id
1883- </td>
1884- <td align="center" bgcolor="coral">
1885- 39/41
1886- </td>
1887- </tr>
1888- <tr>
1889- <td valign="top">
1890- fn-idref
1891- </td>
1892- <td align="center" bgcolor="mediumseagreen">
1893- 30/30
1894- </td>
1895- </tr>
1896- <tr>
1897- <td valign="top">
1898- fn-implicit-timezone
1899- </td>
1900- <td align="center" bgcolor="mediumseagreen">
1901- 27/27
1902- </td>
1903- </tr>
1904- <tr>
1905- <td valign="top">
1906- fn-innermost
1907- </td>
1908- <td align="center" bgcolor="white">
1909- 0/0
1910- </td>
1911- </tr>
1912- <tr>
1913- <td valign="top">
1914- fn-index-of
1915- </td>
1916- <td align="center" bgcolor="mediumseagreen">
1917- 53/53
1918- </td>
1919- </tr>
1920- <tr>
1921- <td valign="top">
1922- fn-insert-before
1923- </td>
1924- <td align="center" bgcolor="mediumseagreen">
1925- 43/43
1926- </td>
1927- </tr>
1928- <tr>
1929- <td valign="top">
1930- fn-in-scope-prefixes
1931- </td>
1932- <td align="center" bgcolor="mediumseagreen">
1933- 58/58
1934- </td>
1935- </tr>
1936- <tr>
1937- <td valign="top">
1938- fn-iri-to-uri
1939- </td>
1940- <td align="center" bgcolor="mediumseagreen">
1941- 46/46
1942- </td>
1943- </tr>
1944- <tr>
1945- <td valign="top">
1946- fn-lang
1947- </td>
1948- <td align="center" bgcolor="mediumseagreen">
1949- 36/36
1950- </td>
1951- </tr>
1952- <tr>
1953- <td valign="top">
1954- fn-last
1955- </td>
1956- <td align="center" bgcolor="mediumseagreen">
1957- 65/65
1958- </td>
1959- </tr>
1960- <tr>
1961- <td valign="top">
1962- fn-local-name
1963- </td>
1964- <td align="center" bgcolor="mediumseagreen">
1965- 59/59
1966- </td>
1967- </tr>
1968- <tr>
1969- <td valign="top">
1970- fn-local-name-from-QName
1971- </td>
1972- <td align="center" bgcolor="mediumseagreen">
1973- 24/24
1974- </td>
1975- </tr>
1976- <tr>
1977- <td valign="top">
1978- fn-lower-case
1979- </td>
1980- <td align="center" bgcolor="mediumseagreen">
1981- 24/24
1982- </td>
1983- </tr>
1984- <tr>
1985- <td valign="top">
1986- fn-map
1987- </td>
1988- <td align="center" bgcolor="white">
1989- 0/0
1990- </td>
1991- </tr>
1992- <tr>
1993- <td valign="top">
1994- fn-max
1995- </td>
1996- <td align="center" bgcolor="mediumseagreen">
1997- 201/201
1998- </td>
1999- </tr>
2000- <tr>
2001- <td valign="top">
2002- fn-map-pairs
2003- </td>
2004- <td align="center" bgcolor="white">
2005- 0/0
2006- </td>
2007- </tr>
2008- <tr>
2009- <td valign="top">
2010- fn-matches
2011- </td>
2012- <td align="center" bgcolor="palegreen">
2013- 145/146
2014- </td>
2015- </tr>
2016- <tr>
2017- <td valign="top">
2018- fn-matches.re
2019- </td>
2020- <td align="center" bgcolor="mediumseagreen">
2021- 1/1
2022- </td>
2023- </tr>
2024- <tr>
2025- <td valign="top">
2026- fn-min
2027- </td>
2028- <td align="center" bgcolor="mediumseagreen">
2029- 200/200
2030- </td>
2031- </tr>
2032- <tr>
2033- <td valign="top">
2034- fn-minutes-from-dateTime
2035- </td>
2036- <td align="center" bgcolor="mediumseagreen">
2037- 27/27
2038- </td>
2039- </tr>
2040- <tr>
2041- <td valign="top">
2042- fn-minutes-from-duration
2043- </td>
2044- <td align="center" bgcolor="mediumseagreen">
2045- 32/32
2046- </td>
2047- </tr>
2048- <tr>
2049- <td valign="top">
2050- fn-minutes-from-time
2051- </td>
2052- <td align="center" bgcolor="mediumseagreen">
2053- 27/27
2054- </td>
2055- </tr>
2056- <tr>
2057- <td valign="top">
2058- fn-month-from-date
2059- </td>
2060- <td align="center" bgcolor="mediumseagreen">
2061- 27/27
2062- </td>
2063- </tr>
2064- <tr>
2065- <td valign="top">
2066- fn-months-from-duration
2067- </td>
2068- <td align="center" bgcolor="mediumseagreen">
2069- 31/31
2070- </td>
2071- </tr>
2072- <tr>
2073- <td valign="top">
2074- fn-month-from-dateTime
2075- </td>
2076- <td align="center" bgcolor="mediumseagreen">
2077- 27/27
2078- </td>
2079- </tr>
2080- <tr>
2081- <td valign="top">
2082- fn-name
2083- </td>
2084- <td align="center" bgcolor="mediumseagreen">
2085- 33/33
2086- </td>
2087- </tr>
2088- <tr>
2089- <td valign="top">
2090- fn-namespace-uri
2091- </td>
2092- <td align="center" bgcolor="mediumseagreen">
2093- 33/33
2094- </td>
2095- </tr>
2096- <tr>
2097- <td valign="top">
2098- fn-namespace-uri-for-prefix
2099- </td>
2100- <td align="center" bgcolor="mediumseagreen">
2101- 29/29
2102- </td>
2103- </tr>
2104- <tr>
2105- <td valign="top">
2106- fn-namespace-uri-from-QName
2107- </td>
2108- <td align="center" bgcolor="mediumseagreen">
2109- 29/29
2110- </td>
2111- </tr>
2112- <tr>
2113- <td valign="top">
2114- fn-nilled
2115- </td>
2116- <td align="center" bgcolor="mediumseagreen">
2117- 54/54
2118- </td>
2119- </tr>
2120- <tr>
2121- <td valign="top">
2122- fn-node-name
2123- </td>
2124- <td align="center" bgcolor="mediumseagreen">
2125- 35/35
2126- </td>
2127- </tr>
2128- <tr>
2129- <td valign="top">
2130- fn-normalize-space
2131- </td>
2132- <td align="center" bgcolor="coral">
2133- 37/39
2134- </td>
2135- </tr>
2136- <tr>
2137- <td valign="top">
2138- fn-normalize-unicode
2139- </td>
2140- <td align="center" bgcolor="coral">
2141- 41/44
2142- </td>
2143- </tr>
2144- <tr>
2145- <td valign="top">
2146- fn-not
2147- </td>
2148- <td align="center" bgcolor="mediumseagreen">
2149- 83/83
2150- </td>
2151- </tr>
2152- <tr>
2153- <td valign="top">
2154- fn-number
2155- </td>
2156- <td align="center" bgcolor="mediumseagreen">
2157- 66/66
2158- </td>
2159- </tr>
2160- <tr>
2161- <td valign="top">
2162- fn-one-or-more
2163- </td>
2164- <td align="center" bgcolor="mediumseagreen">
2165- 56/56
2166- </td>
2167- </tr>
2168- <tr>
2169- <td valign="top">
2170- fn-outermost
2171- </td>
2172- <td align="center" bgcolor="white">
2173- 0/0
2174- </td>
2175- </tr>
2176- <tr>
2177- <td valign="top">
2178- fn-parse-json
2179- </td>
2180- <td align="center" bgcolor="white">
2181- 0/0
2182- </td>
2183- </tr>
2184- <tr>
2185- <td valign="top">
2186- fn-parse-xml
2187- </td>
2188- <td align="center" bgcolor="white">
2189- 0/0
2190- </td>
2191- </tr>
2192- <tr>
2193- <td valign="top">
2194- fn-parse-xml-fragment
2195- </td>
2196- <td align="center" bgcolor="white">
2197- 0/0
2198- </td>
2199- </tr>
2200- <tr>
2201- <td valign="top">
2202- fn-path
2203- </td>
2204- <td align="center" bgcolor="white">
2205- 0/0
2206- </td>
2207- </tr>
2208- <tr>
2209- <td valign="top">
2210- fn-position
2211- </td>
2212- <td align="center" bgcolor="mediumseagreen">
2213- 66/66
2214- </td>
2215- </tr>
2216- <tr>
2217- <td valign="top">
2218- fn-prefix-from-QName
2219- </td>
2220- <td align="center" bgcolor="mediumseagreen">
2221- 24/24
2222- </td>
2223- </tr>
2224- <tr>
2225- <td valign="top">
2226- fn-QName
2227- </td>
2228- <td align="center" bgcolor="mediumseagreen">
2229- 34/34
2230- </td>
2231- </tr>
2232- <tr>
2233- <td valign="top">
2234- fn-remove
2235- </td>
2236- <td align="center" bgcolor="mediumseagreen">
2237- 48/48
2238- </td>
2239- </tr>
2240- <tr>
2241- <td valign="top">
2242- fn-replace
2243- </td>
2244- <td align="center" bgcolor="palegreen">
2245- 72/73
2246- </td>
2247- </tr>
2248- <tr>
2249- <td valign="top">
2250- fn-resolve-QName
2251- </td>
2252- <td align="center" bgcolor="mediumseagreen">
2253- 27/27
2254- </td>
2255- </tr>
2256- <tr>
2257- <td valign="top">
2258- fn-resolve-uri
2259- </td>
2260- <td align="center" bgcolor="coral">
2261- 36/38
2262- </td>
2263- </tr>
2264- <tr>
2265- <td valign="top">
2266- fn-reverse
2267- </td>
2268- <td align="center" bgcolor="mediumseagreen">
2269- 70/70
2270- </td>
2271- </tr>
2272- <tr>
2273- <td valign="top">
2274- fn-root
2275- </td>
2276- <td align="center" bgcolor="mediumseagreen">
2277- 36/36
2278- </td>
2279- </tr>
2280- <tr>
2281- <td valign="top">
2282- fn-round
2283- </td>
2284- <td align="center" bgcolor="mediumseagreen">
2285- 245/245
2286- </td>
2287- </tr>
2288- <tr>
2289- <td valign="top">
2290- fn-round-half-to-even
2291- </td>
2292- <td align="center" bgcolor="mediumseagreen">
2293- 128/128
2294- </td>
2295- </tr>
2296- <tr>
2297- <td valign="top">
2298- fn-seconds-from-dateTime
2299- </td>
2300- <td align="center" bgcolor="mediumseagreen">
2301- 27/27
2302- </td>
2303- </tr>
2304- <tr>
2305- <td valign="top">
2306- fn-seconds-from-duration
2307- </td>
2308- <td align="center" bgcolor="mediumseagreen">
2309- 32/32
2310- </td>
2311- </tr>
2312- <tr>
2313- <td valign="top">
2314- fn-seconds-from-time
2315- </td>
2316- <td align="center" bgcolor="mediumseagreen">
2317- 27/27
2318- </td>
2319- </tr>
2320- <tr>
2321- <td valign="top">
2322- fn-serialize
2323- </td>
2324- <td align="center" bgcolor="white">
2325- 0/0
2326- </td>
2327- </tr>
2328- <tr>
2329- <td valign="top">
2330- fn-serialize-json
2331- </td>
2332- <td align="center" bgcolor="white">
2333- 0/0
2334- </td>
2335- </tr>
2336- <tr>
2337- <td valign="top">
2338- fn-starts-with
2339- </td>
2340- <td align="center" bgcolor="mediumseagreen">
2341- 39/39
2342- </td>
2343- </tr>
2344- <tr>
2345- <td valign="top">
2346- fn-static-base-uri
2347- </td>
2348- <td align="center" bgcolor="mediumseagreen">
2349- 18/18
2350- </td>
2351- </tr>
2352- <tr>
2353- <td valign="top">
2354- fn-string
2355- </td>
2356- <td align="center" bgcolor="mediumseagreen">
2357- 62/62
2358- </td>
2359- </tr>
2360- <tr>
2361- <td valign="top">
2362- fn-string-join
2363- </td>
2364- <td align="center" bgcolor="mediumseagreen">
2365- 34/34
2366- </td>
2367- </tr>
2368- <tr>
2369- <td valign="top">
2370- fn-string-length
2371- </td>
2372- <td align="center" bgcolor="coral">
2373- 33/35
2374- </td>
2375- </tr>
2376- <tr>
2377- <td valign="top">
2378- fn-string-to-codepoints
2379- </td>
2380- <td align="center" bgcolor="mediumseagreen">
2381- 44/44
2382- </td>
2383- </tr>
2384- <tr>
2385- <td valign="top">
2386- fn-subsequence
2387- </td>
2388- <td align="center" bgcolor="mediumseagreen">
2389- 103/103
2390- </td>
2391- </tr>
2392- <tr>
2393- <td valign="top">
2394- fn-substring
2395- </td>
2396- <td align="center" bgcolor="mediumseagreen">
2397- 48/48
2398- </td>
2399- </tr>
2400- <tr>
2401- <td valign="top">
2402- fn-substring-after
2403- </td>
2404- <td align="center" bgcolor="coral">
2405- 36/37
2406- </td>
2407- </tr>
2408- <tr>
2409- <td valign="top">
2410- fn-substring-before
2411- </td>
2412- <td align="center" bgcolor="coral">
2413- 35/36
2414- </td>
2415- </tr>
2416- <tr>
2417- <td valign="top">
2418- fn-sum
2419- </td>
2420- <td align="center" bgcolor="mediumseagreen">
2421- 218/218
2422- </td>
2423- </tr>
2424- <tr>
2425- <td valign="top">
2426- fn-tail
2427- </td>
2428- <td align="center" bgcolor="white">
2429- 0/0
2430- </td>
2431- </tr>
2432- <tr>
2433- <td valign="top">
2434- fn-timezone-from-date
2435- </td>
2436- <td align="center" bgcolor="mediumseagreen">
2437- 34/34
2438- </td>
2439- </tr>
2440- <tr>
2441- <td valign="top">
2442- fn-timezone-from-dateTime
2443- </td>
2444- <td align="center" bgcolor="mediumseagreen">
2445- 27/27
2446- </td>
2447- </tr>
2448- <tr>
2449- <td valign="top">
2450- fn-timezone-from-time
2451- </td>
2452- <td align="center" bgcolor="mediumseagreen">
2453- 27/27
2454- </td>
2455- </tr>
2456- <tr>
2457- <td valign="top">
2458- fn-tokenize
2459- </td>
2460- <td align="center" bgcolor="mediumseagreen">
2461- 50/50
2462- </td>
2463- </tr>
2464- <tr>
2465- <td valign="top">
2466- fn-trace
2467- </td>
2468- <td align="center" bgcolor="mediumseagreen">
2469- 27/27
2470- </td>
2471- </tr>
2472- <tr>
2473- <td valign="top">
2474- fn-translate
2475- </td>
2476- <td align="center" bgcolor="mediumseagreen">
2477- 42/42
2478- </td>
2479- </tr>
2480- <tr>
2481- <td valign="top">
2482- fn-true
2483- </td>
2484- <td align="center" bgcolor="mediumseagreen">
2485- 24/24
2486- </td>
2487- </tr>
2488- <tr>
2489- <td valign="top">
2490- fn-unordered
2491- </td>
2492- <td align="center" bgcolor="mediumseagreen">
2493- 34/34
2494- </td>
2495- </tr>
2496- <tr>
2497- <td valign="top">
2498- fn-unparsed-text
2499- </td>
2500- <td align="center" bgcolor="white">
2501- 0/0
2502- </td>
2503- </tr>
2504- <tr>
2505- <td valign="top">
2506- fn-unparsed-text-available
2507- </td>
2508- <td align="center" bgcolor="white">
2509- 0/0
2510- </td>
2511- </tr>
2512- <tr>
2513- <td valign="top">
2514- fn-unparsed-text-lines
2515- </td>
2516- <td align="center" bgcolor="white">
2517- 0/0
2518- </td>
2519- </tr>
2520- <tr>
2521- <td valign="top">
2522- fn-upper-case
2523- </td>
2524- <td align="center" bgcolor="mediumseagreen">
2525- 24/24
2526- </td>
2527- </tr>
2528- <tr>
2529- <td valign="top">
2530- fn-uri-collection
2531- </td>
2532- <td align="center" bgcolor="white">
2533- 0/0
2534- </td>
2535- </tr>
2536- <tr>
2537- <td valign="top">
2538- fn-year-from-date
2539- </td>
2540- <td align="center" bgcolor="mediumseagreen">
2541- 27/27
2542- </td>
2543- </tr>
2544- <tr>
2545- <td valign="top">
2546- fn-years-from-duration
2547- </td>
2548- <td align="center" bgcolor="mediumseagreen">
2549- 31/31
2550- </td>
2551- </tr>
2552- <tr>
2553- <td valign="top">
2554- fn-year-from-dateTime
2555- </td>
2556- <td align="center" bgcolor="mediumseagreen">
2557- 27/27
2558- </td>
2559- </tr>
2560- <tr>
2561- <td valign="top">
2562- fn-zero-or-one
2563- </td>
2564- <td align="center" bgcolor="mediumseagreen">
2565- 51/51
2566- </td>
2567- </tr>
2568- <tr>
2569- <td valign="top">
2570- math-acos
2571- </td>
2572- <td align="center" bgcolor="white">
2573- 0/0
2574- </td>
2575- </tr>
2576- <tr>
2577- <td valign="top">
2578- math-asin
2579- </td>
2580- <td align="center" bgcolor="white">
2581- 0/0
2582- </td>
2583- </tr>
2584- <tr>
2585- <td valign="top">
2586- math-atan
2587- </td>
2588- <td align="center" bgcolor="white">
2589- 0/0
2590- </td>
2591- </tr>
2592- <tr>
2593- <td valign="top">
2594- math-atan2
2595- </td>
2596- <td align="center" bgcolor="white">
2597- 0/0
2598- </td>
2599- </tr>
2600- <tr>
2601- <td valign="top">
2602- math-cos
2603- </td>
2604- <td align="center" bgcolor="white">
2605- 0/0
2606- </td>
2607- </tr>
2608- <tr>
2609- <td valign="top">
2610- math-exp
2611- </td>
2612- <td align="center" bgcolor="white">
2613- 0/0
2614- </td>
2615- </tr>
2616- <tr>
2617- <td valign="top">
2618- math-exp10
2619- </td>
2620- <td align="center" bgcolor="white">
2621- 0/0
2622- </td>
2623- </tr>
2624- <tr>
2625- <td valign="top">
2626- math-log
2627- </td>
2628- <td align="center" bgcolor="white">
2629- 0/0
2630- </td>
2631- </tr>
2632- <tr>
2633- <td valign="top">
2634- math-log10
2635- </td>
2636- <td align="center" bgcolor="white">
2637- 0/0
2638- </td>
2639- </tr>
2640- <tr>
2641- <td valign="top">
2642- math-pi
2643- </td>
2644- <td align="center" bgcolor="white">
2645- 0/0
2646- </td>
2647- </tr>
2648- <tr>
2649- <td valign="top">
2650- math-pow
2651- </td>
2652- <td align="center" bgcolor="white">
2653- 0/0
2654- </td>
2655- </tr>
2656- <tr>
2657- <td valign="top">
2658- math-sin
2659- </td>
2660- <td align="center" bgcolor="white">
2661- 0/0
2662- </td>
2663- </tr>
2664- <tr>
2665- <td valign="top">
2666- math-sqrt
2667- </td>
2668- <td align="center" bgcolor="white">
2669- 0/0
2670- </td>
2671- </tr>
2672- <tr>
2673- <td valign="top">
2674- math-tan
2675- </td>
2676- <td align="center" bgcolor="white">
2677- 0/0
2678- </td>
2679- </tr>
2680- <tr>
2681- <td valign="top">
2682- map-new
2683- </td>
2684- <td align="center" bgcolor="white">
2685- 0/0
2686- </td>
2687- </tr>
2688- <tr>
2689- <td valign="top">
2690- map-contains
2691- </td>
2692- <td align="center" bgcolor="white">
2693- 0/0
2694- </td>
2695- </tr>
2696- <tr>
2697- <td valign="top">
2698- map-get
2699- </td>
2700- <td align="center" bgcolor="white">
2701- 0/0
2702- </td>
2703- </tr>
2704- <tr>
2705- <td valign="top">
2706- map-entry
2707- </td>
2708- <td align="center" bgcolor="white">
2709- 0/0
2710- </td>
2711- </tr>
2712- <tr>
2713- <td valign="top">
2714- map-size
2715- </td>
2716- <td align="center" bgcolor="white">
2717- 0/0
2718- </td>
2719- </tr>
2720- <tr>
2721- <td valign="top">
2722- map-keys
2723- </td>
2724- <td align="center" bgcolor="white">
2725- 0/0
2726- </td>
2727- </tr>
2728- <tr>
2729- <td valign="top">
2730- map-remove
2731- </td>
2732- <td align="center" bgcolor="white">
2733- 0/0
2734- </td>
2735- </tr>
2736- <tr>
2737- <td valign="top">
2738- map-collation
2739- </td>
2740- <td align="center" bgcolor="white">
2741- 0/0
2742- </td>
2743- </tr>
2744- <tr>
2745- <td valign="top">
2746- xs-anyURI
2747- </td>
2748- <td align="center" bgcolor="coral">
2749- 11/13
2750- </td>
2751- </tr>
2752- <tr>
2753- <td valign="top">
2754- xs-base64Binary
2755- </td>
2756- <td align="center" bgcolor="coral">
2757- 36/37
2758- </td>
2759- </tr>
2760- <tr>
2761- <td valign="top">
2762- xs-dateTimeStamp
2763- </td>
2764- <td align="center" bgcolor="mediumseagreen">
2765- 6/6
2766- </td>
2767- </tr>
2768- <tr>
2769- <td valign="top">
2770- xs-double
2771- </td>
2772- <td align="center" bgcolor="mediumseagreen">
2773- 3/3
2774- </td>
2775- </tr>
2776- <tr>
2777- <td valign="top">
2778- xs-error
2779- </td>
2780- <td align="center" bgcolor="white">
2781- 0/0
2782- </td>
2783- </tr>
2784- <tr>
2785- <td valign="top">
2786- xs-float
2787- </td>
2788- <td align="center" bgcolor="mediumseagreen">
2789- 5/5
2790- </td>
2791- </tr>
2792- <tr>
2793- <td valign="top">
2794- xs-hexBinary
2795- </td>
2796- <td align="center" bgcolor="mediumseagreen">
2797- 1/1
2798- </td>
2799- </tr>
2800- <tr>
2801- <td valign="top">
2802- xs-normalizedString
2803- </td>
2804- <td align="center" bgcolor="mediumseagreen">
2805- 6/6
2806- </td>
2807- </tr>
2808- <tr>
2809- <td valign="top">
2810- xs-token
2811- </td>
2812- <td align="center" bgcolor="mediumseagreen">
2813- 6/6
2814- </td>
2815- </tr>
2816- <tr>
2817- <td valign="top">
2818- op-add-dayTimeDurations
2819- </td>
2820- <td align="center" bgcolor="mediumseagreen">
2821- 61/61
2822- </td>
2823- </tr>
2824- <tr>
2825- <td valign="top">
2826- op-add-dayTimeDuration-to-date
2827- </td>
2828- <td align="center" bgcolor="mediumseagreen">
2829- 25/25
2830- </td>
2831- </tr>
2832- <tr>
2833- <td valign="top">
2834- op-add-dayTimeDuration-to-dateTime
2835- </td>
2836- <td align="center" bgcolor="mediumseagreen">
2837- 27/27
2838- </td>
2839- </tr>
2840- <tr>
2841- <td valign="top">
2842- op-add-dayTimeDuration-to-time
2843- </td>
2844- <td align="center" bgcolor="mediumseagreen">
2845- 26/26
2846- </td>
2847- </tr>
2848- <tr>
2849- <td valign="top">
2850- op-add-yearMonthDurations
2851- </td>
2852- <td align="center" bgcolor="mediumseagreen">
2853- 27/27
2854- </td>
2855- </tr>
2856- <tr>
2857- <td valign="top">
2858- op-add-yearMonthDuration-to-date
2859- </td>
2860- <td align="center" bgcolor="mediumseagreen">
2861- 27/27
2862- </td>
2863- </tr>
2864- <tr>
2865- <td valign="top">
2866- op-add-yearMonthDuration-to-dateTime
2867- </td>
2868- <td align="center" bgcolor="mediumseagreen">
2869- 29/29
2870- </td>
2871- </tr>
2872- <tr>
2873- <td valign="top">
2874- op-anyURI-equal
2875- </td>
2876- <td align="center" bgcolor="mediumseagreen">
2877- 22/22
2878- </td>
2879- </tr>
2880- <tr>
2881- <td valign="top">
2882- op-anyURI-greater-than
2883- </td>
2884- <td align="center" bgcolor="mediumseagreen">
2885- 10/10
2886- </td>
2887- </tr>
2888- <tr>
2889- <td valign="top">
2890- op-anyURI-less-than
2891- </td>
2892- <td align="center" bgcolor="mediumseagreen">
2893- 8/8
2894- </td>
2895- </tr>
2896- <tr>
2897- <td valign="top">
2898- op-bang
2899- </td>
2900- <td align="center" bgcolor="white">
2901- 0/0
2902- </td>
2903- </tr>
2904- <tr>
2905- <td valign="top">
2906- op-base64Binary-equal
2907- </td>
2908- <td align="center" bgcolor="mediumseagreen">
2909- 30/30
2910- </td>
2911- </tr>
2912- <tr>
2913- <td valign="top">
2914- op-boolean-equal
2915- </td>
2916- <td align="center" bgcolor="mediumseagreen">
2917- 55/55
2918- </td>
2919- </tr>
2920- <tr>
2921- <td valign="top">
2922- op-boolean-greater-than
2923- </td>
2924- <td align="center" bgcolor="mediumseagreen">
2925- 49/49
2926- </td>
2927- </tr>
2928- <tr>
2929- <td valign="top">
2930- op-boolean-less-than
2931- </td>
2932- <td align="center" bgcolor="mediumseagreen">
2933- 49/49
2934- </td>
2935- </tr>
2936- <tr>
2937- <td valign="top">
2938- op-concat
2939- </td>
2940- <td align="center" bgcolor="white">
2941- 0/0
2942- </td>
2943- </tr>
2944- <tr>
2945- <td valign="top">
2946- op-concatenate
2947- </td>
2948- <td align="center" bgcolor="mediumseagreen">
2949- 54/54
2950- </td>
2951- </tr>
2952- <tr>
2953- <td valign="top">
2954- op-date-equal
2955- </td>
2956- <td align="center" bgcolor="mediumseagreen">
2957- 47/47
2958- </td>
2959- </tr>
2960- <tr>
2961- <td valign="top">
2962- op-date-greater-than
2963- </td>
2964- <td align="center" bgcolor="mediumseagreen">
2965- 48/48
2966- </td>
2967- </tr>
2968- <tr>
2969- <td valign="top">
2970- op-date-less-than
2971- </td>
2972- <td align="center" bgcolor="mediumseagreen">
2973- 48/48
2974- </td>
2975- </tr>
2976- <tr>
2977- <td valign="top">
2978- op-dateTime-equal
2979- </td>
2980- <td align="center" bgcolor="mediumseagreen">
2981- 71/71
2982- </td>
2983- </tr>
2984- <tr>
2985- <td valign="top">
2986- op-dateTime-greater-than
2987- </td>
2988- <td align="center" bgcolor="mediumseagreen">
2989- 44/44
2990- </td>
2991- </tr>
2992- <tr>
2993- <td valign="top">
2994- op-dateTime-less-than
2995- </td>
2996- <td align="center" bgcolor="mediumseagreen">
2997- 44/44
2998- </td>
2999- </tr>
3000- <tr>
3001- <td valign="top">
3002- op-dayTimeDuration-greater-than
3003- </td>
3004- <td align="center" bgcolor="mediumseagreen">
3005- 58/58
3006- </td>
3007- </tr>
3008- <tr>
3009- <td valign="top">
3010- op-dayTimeDuration-less-than
3011- </td>
3012- <td align="center" bgcolor="mediumseagreen">
3013- 46/46
3014- </td>
3015- </tr>
3016- <tr>
3017- <td valign="top">
3018- op-divide-dayTimeDuration
3019- </td>
3020- <td align="center" bgcolor="mediumseagreen">
3021- 55/55
3022- </td>
3023- </tr>
3024- <tr>
3025- <td valign="top">
3026- op-divide-dayTimeDuration-by-dayTimeDuration
3027- </td>
3028- <td align="center" bgcolor="mediumseagreen">
3029- 25/25
3030- </td>
3031- </tr>
3032- <tr>
3033- <td valign="top">
3034- op-divide-yearMonthDuration
3035- </td>
3036- <td align="center" bgcolor="mediumseagreen">
3037- 31/31
3038- </td>
3039- </tr>
3040- <tr>
3041- <td valign="top">
3042- op-divide-yearMonthDuration-by-yearMonthDuration
3043- </td>
3044- <td align="center" bgcolor="mediumseagreen">
3045- 23/23
3046- </td>
3047- </tr>
3048- <tr>
3049- <td valign="top">
3050- op-duration-equal
3051- </td>
3052- <td align="center" bgcolor="mediumseagreen">
3053- 158/158
3054- </td>
3055- </tr>
3056- <tr>
3057- <td valign="top">
3058- op-except
3059- </td>
3060- <td align="center" bgcolor="mediumseagreen">
3061- 71/71
3062- </td>
3063- </tr>
3064- <tr>
3065- <td valign="top">
3066- op-gDay-equal
3067- </td>
3068- <td align="center" bgcolor="mediumseagreen">
3069- 51/51
3070- </td>
3071- </tr>
3072- <tr>
3073- <td valign="top">
3074- op-gMonth-equal
3075- </td>
3076- <td align="center" bgcolor="mediumseagreen">
3077- 45/45
3078- </td>
3079- </tr>
3080- <tr>
3081- <td valign="top">
3082- op-gMonthDay-equal
3083- </td>
3084- <td align="center" bgcolor="mediumseagreen">
3085- 51/51
3086- </td>
3087- </tr>
3088- <tr>
3089- <td valign="top">
3090- op-gYear-equal
3091- </td>
3092- <td align="center" bgcolor="mediumseagreen">
3093- 46/46
3094- </td>
3095- </tr>
3096- <tr>
3097- <td valign="top">
3098- op-gYearMonth-equal
3099- </td>
3100- <td align="center" bgcolor="mediumseagreen">
3101- 46/46
3102- </td>
3103- </tr>
3104- <tr>
3105- <td valign="top">
3106- op-hexBinary-equal
3107- </td>
3108- <td align="center" bgcolor="mediumseagreen">
3109- 32/32
3110- </td>
3111- </tr>
3112- <tr>
3113- <td valign="top">
3114- op-intersect
3115- </td>
3116- <td align="center" bgcolor="mediumseagreen">
3117- 71/71
3118- </td>
3119- </tr>
3120- <tr>
3121- <td valign="top">
3122- op-is-same-node
3123- </td>
3124- <td align="center" bgcolor="mediumseagreen">
3125- 37/37
3126- </td>
3127- </tr>
3128- <tr>
3129- <td valign="top">
3130- op-multiply-dayTimeDuration
3131- </td>
3132- <td align="center" bgcolor="mediumseagreen">
3133- 46/46
3134- </td>
3135- </tr>
3136- <tr>
3137- <td valign="top">
3138- op-multiply-yearMonthDuration
3139- </td>
3140- <td align="center" bgcolor="mediumseagreen">
3141- 44/44
3142- </td>
3143- </tr>
3144- <tr>
3145- <td valign="top">
3146- op-node-after
3147- </td>
3148- <td align="center" bgcolor="mediumseagreen">
3149- 35/35
3150- </td>
3151- </tr>
3152- <tr>
3153- <td valign="top">
3154- op-node-before
3155- </td>
3156- <td align="center" bgcolor="mediumseagreen">
3157- 35/35
3158- </td>
3159- </tr>
3160- <tr>
3161- <td valign="top">
3162- op-NOTATION-equal
3163- </td>
3164- <td align="center" bgcolor="mediumseagreen">
3165- 22/22
3166- </td>
3167- </tr>
3168- <tr>
3169- <td valign="top">
3170- op-numeric-add
3171- </td>
3172- <td align="center" bgcolor="mediumseagreen">
3173- 140/140
3174- </td>
3175- </tr>
3176- <tr>
3177- <td valign="top">
3178- op-numeric-equal
3179- </td>
3180- <td align="center" bgcolor="mediumseagreen">
3181- 202/202
3182- </td>
3183- </tr>
3184- <tr>
3185- <td valign="top">
3186- op-numeric-divide
3187- </td>
3188- <td align="center" bgcolor="mediumseagreen">
3189- 140/140
3190- </td>
3191- </tr>
3192- <tr>
3193- <td valign="top">
3194- op-numeric-greater-than
3195- </td>
3196- <td align="center" bgcolor="mediumseagreen">
3197- 116/116
3198- </td>
3199- </tr>
3200- <tr>
3201- <td valign="top">
3202- op-numeric-integer-divide
3203- </td>
3204- <td align="center" bgcolor="mediumseagreen">
3205- 136/136
3206- </td>
3207- </tr>
3208- <tr>
3209- <td valign="top">
3210- op-numeric-less-than
3211- </td>
3212- <td align="center" bgcolor="mediumseagreen">
3213- 183/183
3214- </td>
3215- </tr>
3216- <tr>
3217- <td valign="top">
3218- op-numeric-mod
3219- </td>
3220- <td align="center" bgcolor="mediumseagreen">
3221- 124/124
3222- </td>
3223- </tr>
3224- <tr>
3225- <td valign="top">
3226- op-numeric-multiply
3227- </td>
3228- <td align="center" bgcolor="mediumseagreen">
3229- 107/107
3230- </td>
3231- </tr>
3232- <tr>
3233- <td valign="top">
3234- op-numeric-subtract
3235- </td>
3236- <td align="center" bgcolor="mediumseagreen">
3237- 119/119
3238- </td>
3239- </tr>
3240- <tr>
3241- <td valign="top">
3242- op-numeric-unary-minus
3243- </td>
3244- <td align="center" bgcolor="mediumseagreen">
3245- 64/64
3246- </td>
3247- </tr>
3248- <tr>
3249- <td valign="top">
3250- op-numeric-unary-plus
3251- </td>
3252- <td align="center" bgcolor="mediumseagreen">
3253- 55/55
3254- </td>
3255- </tr>
3256- <tr>
3257- <td valign="top">
3258- op-QName-equal
3259- </td>
3260- <td align="center" bgcolor="mediumseagreen">
3261- 38/38
3262- </td>
3263- </tr>
3264- <tr>
3265- <td valign="top">
3266- op-string-equal
3267- </td>
3268- <td align="center" bgcolor="mediumseagreen">
3269- 15/15
3270- </td>
3271- </tr>
3272- <tr>
3273- <td valign="top">
3274- op-string-greater-than
3275- </td>
3276- <td align="center" bgcolor="mediumseagreen">
3277- 9/9
3278- </td>
3279- </tr>
3280- <tr>
3281- <td valign="top">
3282- op-string-less-than
3283- </td>
3284- <td align="center" bgcolor="mediumseagreen">
3285- 10/10
3286- </td>
3287- </tr>
3288- <tr>
3289- <td valign="top">
3290- op-subtract-dates
3291- </td>
3292- <td align="center" bgcolor="mediumseagreen">
3293- 30/30
3294- </td>
3295- </tr>
3296- <tr>
3297- <td valign="top">
3298- op-subtract-dateTimes
3299- </td>
3300- <td align="center" bgcolor="mediumseagreen">
3301- 30/30
3302- </td>
3303- </tr>
3304- <tr>
3305- <td valign="top">
3306- op-subtract-dayTimeDuration-from-date
3307- </td>
3308- <td align="center" bgcolor="mediumseagreen">
3309- 23/23
3310- </td>
3311- </tr>
3312- <tr>
3313- <td valign="top">
3314- op-subtract-dayTimeDuration-from-dateTime
3315- </td>
3316- <td align="center" bgcolor="mediumseagreen">
3317- 22/22
3318- </td>
3319- </tr>
3320- <tr>
3321- <td valign="top">
3322- op-subtract-dayTimeDuration-from-time
3323- </td>
3324- <td align="center" bgcolor="mediumseagreen">
3325- 27/27
3326- </td>
3327- </tr>
3328- <tr>
3329- <td valign="top">
3330- op-subtract-dayTimeDurations
3331- </td>
3332- <td align="center" bgcolor="mediumseagreen">
3333- 69/69
3334- </td>
3335- </tr>
3336- <tr>
3337- <td valign="top">
3338- op-subtract-times
3339- </td>
3340- <td align="center" bgcolor="mediumseagreen">
3341- 33/33
3342- </td>
3343- </tr>
3344- <tr>
3345- <td valign="top">
3346- op-subtract-yearMonthDuration-from-date
3347- </td>
3348- <td align="center" bgcolor="mediumseagreen">
3349- 25/25
3350- </td>
3351- </tr>
3352- <tr>
3353- <td valign="top">
3354- op-subtract-yearMonthDuration-from-dateTime
3355- </td>
3356- <td align="center" bgcolor="mediumseagreen">
3357- 23/23
3358- </td>
3359- </tr>
3360- <tr>
3361- <td valign="top">
3362- op-subtract-yearMonthDurations
3363- </td>
3364- <td align="center" bgcolor="mediumseagreen">
3365- 33/33
3366- </td>
3367- </tr>
3368- <tr>
3369- <td valign="top">
3370- op-time-equal
3371- </td>
3372- <td align="center" bgcolor="mediumseagreen">
3373- 58/58
3374- </td>
3375- </tr>
3376- <tr>
3377- <td valign="top">
3378- op-time-greater-than
3379- </td>
3380- <td align="center" bgcolor="mediumseagreen">
3381- 44/44
3382- </td>
3383- </tr>
3384- <tr>
3385- <td valign="top">
3386- op-time-less-than
3387- </td>
3388- <td align="center" bgcolor="mediumseagreen">
3389- 44/44
3390- </td>
3391- </tr>
3392- <tr>
3393- <td valign="top">
3394- op-to
3395- </td>
3396- <td align="center" bgcolor="mediumseagreen">
3397- 69/69
3398- </td>
3399- </tr>
3400- <tr>
3401- <td valign="top">
3402- op-union
3403- </td>
3404- <td align="center" bgcolor="mediumseagreen">
3405- 82/82
3406- </td>
3407- </tr>
3408- <tr>
3409- <td valign="top">
3410- op-yearMonthDuration-greater-than
3411- </td>
3412- <td align="center" bgcolor="mediumseagreen">
3413- 34/34
3414- </td>
3415- </tr>
3416- <tr>
3417- <td valign="top">
3418- op-yearMonthDuration-less-than
3419- </td>
3420- <td align="center" bgcolor="mediumseagreen">
3421- 34/34
3422- </td>
3423- </tr>
3424- <tr>
3425- <td valign="top">
3426- prod-AllowingEmpty
3427- </td>
3428- <td align="center" bgcolor="white">
3429- 0/0
3430- </td>
3431- </tr>
3432- <tr>
3433- <td valign="top">
3434- prod-Annotation
3435- </td>
3436- <td align="center" bgcolor="white">
3437- 0/0
3438- </td>
3439- </tr>
3440- <tr>
3441- <td valign="top">
3442- prod-AxisStep
3443- </td>
3444- <td align="center" bgcolor="mediumseagreen">
3445- 330/330
3446- </td>
3447- </tr>
3448- <tr>
3449- <td valign="top">
3450- prod-AxisStep.abbr
3451- </td>
3452- <td align="center" bgcolor="mediumseagreen">
3453- 23/23
3454- </td>
3455- </tr>
3456- <tr>
3457- <td valign="top">
3458- prod-AxisStep.ancestor
3459- </td>
3460- <td align="center" bgcolor="mediumseagreen">
3461- 43/43
3462- </td>
3463- </tr>
3464- <tr>
3465- <td valign="top">
3466- prod-AxisStep.ancestor-or-self
3467- </td>
3468- <td align="center" bgcolor="mediumseagreen">
3469- 31/31
3470- </td>
3471- </tr>
3472- <tr>
3473- <td valign="top">
3474- prod-AxisStep.following
3475- </td>
3476- <td align="center" bgcolor="mediumseagreen">
3477- 25/25
3478- </td>
3479- </tr>
3480- <tr>
3481- <td valign="top">
3482- prod-AxisStep.following-sibling
3483- </td>
3484- <td align="center" bgcolor="mediumseagreen">
3485- 33/33
3486- </td>
3487- </tr>
3488- <tr>
3489- <td valign="top">
3490- prod-AxisStep.preceding
3491- </td>
3492- <td align="center" bgcolor="mediumseagreen">
3493- 31/31
3494- </td>
3495- </tr>
3496- <tr>
3497- <td valign="top">
3498- prod-AxisStep.preceding-sibling
3499- </td>
3500- <td align="center" bgcolor="mediumseagreen">
3501- 28/28
3502- </td>
3503- </tr>
3504- <tr>
3505- <td valign="top">
3506- prod-AxisStep.static-typing
3507- </td>
3508- <td align="center" bgcolor="white">
3509- 0/0
3510- </td>
3511- </tr>
3512- <tr>
3513- <td valign="top">
3514- prod-AxisStep.unabbr
3515- </td>
3516- <td align="center" bgcolor="mediumseagreen">
3517- 26/26
3518- </td>
3519- </tr>
3520- <tr>
3521- <td valign="top">
3522- prod-BaseURIDecl
3523- </td>
3524- <td align="center" bgcolor="coral">
3525- 37/38
3526- </td>
3527- </tr>
3528- <tr>
3529- <td valign="top">
3530- prod-BoundarySpaceDecl
3531- </td>
3532- <td align="center" bgcolor="mediumseagreen">
3533- 28/28
3534- </td>
3535- </tr>
3536- <tr>
3537- <td valign="top">
3538- prod-CastableExpr
3539- </td>
3540- <td align="center" bgcolor="mediumseagreen">
3541- 799/799
3542- </td>
3543- </tr>
3544- <tr>
3545- <td valign="top">
3546- prod-CastExpr
3547- </td>
3548- <td align="center" bgcolor="mediumseagreen">
3549- 2732/2732
3550- </td>
3551- </tr>
3552- <tr>
3553- <td valign="top">
3554- prod-CastExpr.derived
3555- </td>
3556- <td align="center" bgcolor="palegreen">
3557- 154/155
3558- </td>
3559- </tr>
3560- <tr>
3561- <td valign="top">
3562- prod-CastExpr.schema
3563- </td>
3564- <td align="center" bgcolor="mediumseagreen">
3565- 58/58
3566- </td>
3567- </tr>
3568- <tr>
3569- <td valign="top">
3570- prod-Comment
3571- </td>
3572- <td align="center" bgcolor="mediumseagreen">
3573- 45/45
3574- </td>
3575- </tr>
3576- <tr>
3577- <td valign="top">
3578- prod-CompAttrConstructor
3579- </td>
3580- <td align="center" bgcolor="mediumseagreen">
3581- 109/109
3582- </td>
3583- </tr>
3584- <tr>
3585- <td valign="top">
3586- prod-CompDocConstructor
3587- </td>
3588- <td align="center" bgcolor="palegreen">
3589- 57/58
3590- </td>
3591- </tr>
3592- <tr>
3593- <td valign="top">
3594- prod-CompCommentConstructor
3595- </td>
3596- <td align="center" bgcolor="mediumseagreen">
3597- 28/28
3598- </td>
3599- </tr>
3600- <tr>
3601- <td valign="top">
3602- prod-CompElemConstructor
3603- </td>
3604- <td align="center" bgcolor="mediumseagreen">
3605- 72/72
3606- </td>
3607- </tr>
3608- <tr>
3609- <td valign="top">
3610- prod-CompNamespaceConstructor
3611- </td>
3612- <td align="center" bgcolor="white">
3613- 0/0
3614- </td>
3615- </tr>
3616- <tr>
3617- <td valign="top">
3618- prod-CompPIConstructor
3619- </td>
3620- <td align="center" bgcolor="mediumseagreen">
3621- 54/54
3622- </td>
3623- </tr>
3624- <tr>
3625- <td valign="top">
3626- prod-CompTextConstructor
3627- </td>
3628- <td align="center" bgcolor="mediumseagreen">
3629- 35/35
3630- </td>
3631- </tr>
3632- <tr>
3633- <td valign="top">
3634- prod-ConstructionDecl
3635- </td>
3636- <td align="center" bgcolor="mediumseagreen">
3637- 26/26
3638- </td>
3639- </tr>
3640- <tr>
3641- <td valign="top">
3642- prod-ConstructionDecl.schema
3643- </td>
3644- <td align="center" bgcolor="mediumseagreen">
3645- 4/4
3646- </td>
3647- </tr>
3648- <tr>
3649- <td valign="top">
3650- prod-ContextItemDecl
3651- </td>
3652- <td align="center" bgcolor="white">
3653- 0/0
3654- </td>
3655- </tr>
3656- <tr>
3657- <td valign="top">
3658- prod-ContextItemExpr
3659- </td>
3660- <td align="center" bgcolor="mediumseagreen">
3661- 45/45
3662- </td>
3663- </tr>
3664- <tr>
3665- <td valign="top">
3666- prod-CopyNamespacesDecl
3667- </td>
3668- <td align="center" bgcolor="mediumseagreen">
3669- 36/36
3670- </td>
3671- </tr>
3672- <tr>
3673- <td valign="top">
3674- prod-CountClause
3675- </td>
3676- <td align="center" bgcolor="white">
3677- 0/0
3678- </td>
3679- </tr>
3680- <tr>
3681- <td valign="top">
3682- prod-DecimalFormatDecl
3683- </td>
3684- <td align="center" bgcolor="white">
3685- 0/0
3686- </td>
3687- </tr>
3688- <tr>
3689- <td valign="top">
3690- prod-DefaultCollationDecl
3691- </td>
3692- <td align="center" bgcolor="mediumseagreen">
3693- 8/8
3694- </td>
3695- </tr>
3696- <tr>
3697- <td valign="top">
3698- prod-DefaultNamespaceDecl
3699- </td>
3700- <td align="center" bgcolor="coral">
3701- 57/59
3702- </td>
3703- </tr>
3704- <tr>
3705- <td valign="top">
3706- prod-DirAttributeList
3707- </td>
3708- <td align="center" bgcolor="mediumseagreen">
3709- 124/124
3710- </td>
3711- </tr>
3712- <tr>
3713- <td valign="top">
3714- prod-DirectConstructor
3715- </td>
3716- <td align="center" bgcolor="mediumseagreen">
3717- 91/91
3718- </td>
3719- </tr>
3720- <tr>
3721- <td valign="top">
3722- prod-DirElemConstructor
3723- </td>
3724- <td align="center" bgcolor="mediumseagreen">
3725- 67/67
3726- </td>
3727- </tr>
3728- <tr>
3729- <td valign="top">
3730- prod-DirElemContent
3731- </td>
3732- <td align="center" bgcolor="palegreen">
3733- 126/127
3734- </td>
3735- </tr>
3736- <tr>
3737- <td valign="top">
3738- prod-DirElemContent.namespace
3739- </td>
3740- <td align="center" bgcolor="palegreen">
3741- 131/132
3742- </td>
3743- </tr>
3744- <tr>
3745- <td valign="top">
3746- prod-DirElemContent.whitespace
3747- </td>
3748- <td align="center" bgcolor="mediumseagreen">
3749- 83/83
3750- </td>
3751- </tr>
3752- <tr>
3753- <td valign="top">
3754- prod-EmptyOrderDecl
3755- </td>
3756- <td align="center" bgcolor="mediumseagreen">
3757- 32/32
3758- </td>
3759- </tr>
3760- <tr>
3761- <td valign="top">
3762- prod-EQName
3763- </td>
3764- <td align="center" bgcolor="mediumseagreen">
3765- 2/2
3766- </td>
3767-
3768-
3769- </tr>
3770- <tr>
3771- <td valign="top">
3772- prod-ExtensionExpr
3773- </td>
3774- <td align="center" bgcolor="mediumseagreen">
3775- 51/51
3776- </td>
3777- </tr>
3778- <tr>
3779- <td valign="top">
3780- prod-FLWORExpr
3781- </td>
3782- <td align="center" bgcolor="mediumseagreen">
3783- 21/21
3784- </td>
3785- </tr>
3786- <tr>
3787- <td valign="top">
3788- prod-FLWORExpr.static-typing
3789- </td>
3790- <td align="center" bgcolor="white">
3791- 0/0
3792- </td>
3793- </tr>
3794- <tr>
3795- <td valign="top">
3796- prod-ForClause
3797- </td>
3798- <td align="center" bgcolor="mediumseagreen">
3799- 188/188
3800- </td>
3801- </tr>
3802- <tr>
3803- <td valign="top">
3804- prod-FunctionCall
3805- </td>
3806- <td align="center" bgcolor="coral">
3807- 66/69
3808- </td>
3809- </tr>
3810- <tr>
3811- <td valign="top">
3812- prod-FunctionDecl
3813- </td>
3814- <td align="center" bgcolor="coral">
3815- 137/152
3816- </td>
3817- </tr>
3818- <tr>
3819- <td valign="top">
3820- prod-GeneralComp.eq
3821- </td>
3822- <td align="center" bgcolor="mediumseagreen">
3823- 172/172
3824- </td>
3825- </tr>
3826- <tr>
3827- <td valign="top">
3828- prod-GeneralComp.ge
3829- </td>
3830- <td align="center" bgcolor="mediumseagreen">
3831- 110/110
3832- </td>
3833- </tr>
3834- <tr>
3835- <td valign="top">
3836- prod-GeneralComp.gt
3837- </td>
3838- <td align="center" bgcolor="mediumseagreen">
3839- 118/118
3840- </td>
3841- </tr>
3842- <tr>
3843- <td valign="top">
3844- prod-GeneralComp.le
3845- </td>
3846- <td align="center" bgcolor="mediumseagreen">
3847- 108/108
3848- </td>
3849- </tr>
3850- <tr>
3851- <td valign="top">
3852- prod-GeneralComp.lt
3853- </td>
3854- <td align="center" bgcolor="mediumseagreen">
3855- 127/127
3856- </td>
3857- </tr>
3858- <tr>
3859- <td valign="top">
3860- prod-GeneralComp.ne
3861- </td>
3862- <td align="center" bgcolor="mediumseagreen">
3863- 140/140
3864- </td>
3865- </tr>
3866- <tr>
3867- <td valign="top">
3868- prod-GroupByClause
3869- </td>
3870- <td align="center" bgcolor="white">
3871- 0/0
3872- </td>
3873- </tr>
3874- <tr>
3875- <td valign="top">
3876- prod-IfExpr
3877- </td>
3878- <td align="center" bgcolor="mediumseagreen">
3879- 42/42
3880- </td>
3881- </tr>
3882- <tr>
3883- <td valign="top">
3884- prod-InstanceofExpr
3885- </td>
3886- <td align="center" bgcolor="palegreen">
3887- 277/278
3888- </td>
3889- </tr>
3890- <tr>
3891- <td valign="top">
3892- prod-LetClause
3893- </td>
3894- <td align="center" bgcolor="mediumseagreen">
3895- 81/81
3896- </td>
3897- </tr>
3898- <tr>
3899- <td valign="top">
3900- prod-Literal
3901- </td>
3902- <td align="center" bgcolor="palegreen">
3903- 163/166
3904- </td>
3905- </tr>
3906- <tr>
3907- <td valign="top">
3908- prod-ModuleImport
3909- </td>
3910- <td align="center" bgcolor="coral">
3911- 72/80
3912- </td>
3913- </tr>
3914- <tr>
3915- <td valign="top">
3916- prod-NamedFunctionRef
3917- </td>
3918- <td align="center" bgcolor="white">
3919- 0/0
3920- </td>
3921- </tr>
3922- <tr>
3923- <td valign="top">
3924- prod-NamespaceDecl
3925- </td>
3926- <td align="center" bgcolor="mediumseagreen">
3927- 44/44
3928- </td>
3929- </tr>
3930- <tr>
3931- <td valign="top">
3932- prod-NameTest
3933- </td>
3934- <td align="center" bgcolor="mediumseagreen">
3935- 122/122
3936- </td>
3937- </tr>
3938- <tr>
3939- <td valign="top">
3940- prod-NodeTest
3941- </td>
3942- <td align="center" bgcolor="mediumseagreen">
3943- 67/67
3944- </td>
3945- </tr>
3946- <tr>
3947- <td valign="top">
3948- prod-OptionDecl
3949- </td>
3950- <td align="center" bgcolor="mediumseagreen">
3951- 8/8
3952- </td>
3953- </tr>
3954- <tr>
3955- <td valign="top">
3956- prod-OptionDecl.serialization
3957- </td>
3958- <td align="center" bgcolor="white">
3959- 0/0
3960- </td>
3961- </tr>
3962- <tr>
3963- <td valign="top">
3964- prod-OrExpr
3965- </td>
3966- <td align="center" bgcolor="mediumseagreen">
3967- 371/371
3968- </td>
3969- </tr>
3970- <tr>
3971- <td valign="top">
3972- prod-OrderByClause
3973- </td>
3974- <td align="center" bgcolor="coral">
3975- 195/201
3976- </td>
3977- </tr>
3978- <tr>
3979- <td valign="top">
3980- prod-OrderingModeDecl
3981- </td>
3982- <td align="center" bgcolor="mediumseagreen">
3983- 27/27
3984- </td>
3985- </tr>
3986- <tr>
3987- <td valign="top">
3988- prod-PathExpr
3989- </td>
3990- <td align="center" bgcolor="mediumseagreen">
3991- 17/17
3992- </td>
3993- </tr>
3994- <tr>
3995- <td valign="top">
3996- prod-ParenthesizedExpr
3997- </td>
3998- <td align="center" bgcolor="mediumseagreen">
3999- 20/20
4000- </td>
4001- </tr>
4002- <tr>
4003- <td valign="top">
4004- prod-PositionalVar
4005- </td>
4006- <td align="center" bgcolor="mediumseagreen">
4007- 34/34
4008- </td>
4009- </tr>
4010- <tr>
4011- <td valign="top">
4012- prod-Predicate
4013- </td>
4014- <td align="center" bgcolor="mediumseagreen">
4015- 190/190
4016- </td>
4017- </tr>
4018- <tr>
4019- <td valign="top">
4020- prod-QuantifiedExpr
4021- </td>
4022- <td align="center" bgcolor="mediumseagreen">
4023- 200/200
4024- </td>
4025- </tr>
4026- <tr>
4027- <td valign="top">
4028- prod-RequireProhibitFeature
4029- </td>
4030- <td align="center" bgcolor="white">
4031- 0/0
4032- </td>
4033- </tr>
4034- <tr>
4035- <td valign="top">
4036- prod-ReturnClause
4037- </td>
4038- <td align="center" bgcolor="mediumseagreen">
4039- 21/21
4040- </td>
4041- </tr>
4042- <tr>
4043- <td valign="top">
4044- prod-SchemaImport
4045- </td>
4046- <td align="center" bgcolor="coral">
4047- 105/116
4048- </td>
4049- </tr>
4050- <tr>
4051- <td valign="top">
4052- prod-SequenceType
4053- </td>
4054- <td align="center" bgcolor="mediumseagreen">
4055- 21/21
4056- </td>
4057- </tr>
4058- <tr>
4059- <td valign="top">
4060- prod-StepExpr
4061- </td>
4062- <td align="center" bgcolor="mediumseagreen">
4063- 58/58
4064- </td>
4065- </tr>
4066- <tr>
4067- <td valign="top">
4068- prod-SwitchExpr
4069- </td>
4070- <td align="center" bgcolor="white">
4071- 0/0
4072- </td>
4073- </tr>
4074- <tr>
4075- <td valign="top">
4076- prod-TreatExpr
4077- </td>
4078- <td align="center" bgcolor="mediumseagreen">
4079- 69/69
4080- </td>
4081- </tr>
4082- <tr>
4083- <td valign="top">
4084- prod-TryCatchExpr
4085- </td>
4086- <td align="center" bgcolor="white">
4087- 0/0
4088- </td>
4089- </tr>
4090- <tr>
4091- <td valign="top">
4092- prod-TypeswitchExpr
4093- </td>
4094- <td align="center" bgcolor="mediumseagreen">
4095- 56/56
4096- </td>
4097- </tr>
4098- <tr>
4099- <td valign="top">
4100- prod-UnorderedExpr
4101- </td>
4102- <td align="center" bgcolor="mediumseagreen">
4103- 26/26
4104- </td>
4105- </tr>
4106- <tr>
4107- <td valign="top">
4108- prod-ValidateExpr
4109- </td>
4110- <td align="center" bgcolor="mediumseagreen">
4111- 66/66
4112- </td>
4113- </tr>
4114- <tr>
4115- <td valign="top">
4116- prod-ValueComp
4117- </td>
4118- <td align="center" bgcolor="mediumseagreen">
4119- 44/44
4120- </td>
4121- </tr>
4122- <tr>
4123- <td valign="top">
4124- prod-VarDecl
4125- </td>
4126- <td align="center" bgcolor="mediumseagreen">
4127- 124/124
4128- </td>
4129- </tr>
4130- <tr>
4131- <td valign="top">
4132- prod-VarDecl.external
4133- </td>
4134- <td align="center" bgcolor="palegreen">
4135- 94/95
4136- </td>
4137- </tr>
4138- <tr>
4139- <td valign="top">
4140- prod-VarDefaultValue
4141- </td>
4142- <td align="center" bgcolor="white">
4143- 0/0
4144- </td>
4145- </tr>
4146- <tr>
4147- <td valign="top">
4148- prod-VersionDecl
4149- </td>
4150- <td align="center" bgcolor="coral">
4151- 27/28
4152- </td>
4153- </tr>
4154- <tr>
4155- <td valign="top">
4156- prod-WhereClause
4157- </td>
4158- <td align="center" bgcolor="mediumseagreen">
4159- 71/71
4160- </td>
4161- </tr>
4162- <tr>
4163- <td valign="top">
4164- prod-WindowClause
4165- </td>
4166- <td align="center" bgcolor="white">
4167- 0/0
4168- </td>
4169- </tr>
4170- <tr>
4171- <td valign="top">
4172- misc-CombinedErrorCodes
4173- </td>
4174- <td align="center" bgcolor="mediumseagreen">
4175- 254/254
4176- </td>
4177- </tr>
4178- <tr>
4179- <td valign="top">
4180- misc-AnnexE
4181- </td>
4182- <td align="center" bgcolor="mediumseagreen">
4183- 8/8
4184- </td>
4185- </tr>
4186- <tr>
4187- <td valign="top">
4188- misc-AppendixA4
4189- </td>
4190- <td align="center" bgcolor="mediumseagreen">
4191- 9/9
4192- </td>
4193- </tr>
4194- <tr>
4195- <td valign="top">
4196- misc-ErrorsAndOptimization
4197- </td>
4198- <td align="center" bgcolor="mediumseagreen">
4199- 7/7
4200- </td>
4201- </tr>
4202- <tr>
4203- <td valign="top">
4204- misc-HigherOrderFunctions
4205- </td>
4206- <td align="center" bgcolor="white">
4207- 0/0
4208- </td>
4209- </tr>
4210- <tr>
4211- <td valign="top">
4212- misc-MiscFunctions
4213- </td>
4214- <td align="center" bgcolor="mediumseagreen">
4215- 38/38
4216- </td>
4217- </tr>
4218- <tr>
4219- <td valign="top">
4220- misc-StaticContext
4221- </td>
4222- <td align="center" bgcolor="mediumseagreen">
4223- 1/1
4224- </td>
4225- </tr>
4226- <tr>
4227- <td valign="top">
4228- misc-Serialization
4229- </td>
4230- <td align="center" bgcolor="coral">
4231- 4/12
4232- </td>
4233- </tr>
4234- <tr>
4235- <td valign="top">
4236- misc-Surrogates
4237- </td>
4238- <td align="center" bgcolor="mediumseagreen">
4239- 17/17
4240- </td>
4241- </tr>
4242- <tr>
4243- <td valign="top">
4244- misc-XMLEdition
4245- </td>
4246- <td align="center" bgcolor="coral">
4247- 9/10
4248- </td>
4249- </tr>
4250- <tr>
4251- <td valign="top">
4252- app-CatalogCheck
4253- </td>
4254- <td align="center" bgcolor="mediumseagreen">
4255- 10/10
4256- </td>
4257- </tr>
4258- <tr>
4259- <td valign="top">
4260- app-Demos
4261- </td>
4262- <td align="center" bgcolor="mediumseagreen">
4263- 4/4
4264- </td>
4265- </tr>
4266- <tr>
4267- <td valign="top">
4268- app-FunctxFn
4269- </td>
4270- <td align="center" bgcolor="mediumseagreen">
4271- 500/500
4272- </td>
4273- </tr>
4274- <tr>
4275- <td valign="top">
4276- app-FunctxFunctx
4277- </td>
4278- <td align="center" bgcolor="mediumseagreen">
4279- 627/627
4280- </td>
4281- </tr>
4282- <tr>
4283- <td valign="top">
4284- app-UseCaseNS
4285- </td>
4286- <td align="center" bgcolor="mediumseagreen">
4287- 8/8
4288- </td>
4289- </tr>
4290- <tr>
4291- <td valign="top">
4292- app-UseCasePARTS
4293- </td>
4294- <td align="center" bgcolor="mediumseagreen">
4295- 1/1
4296- </td>
4297- </tr>
4298- <tr>
4299- <td valign="top">
4300- app-UseCaseR
4301- </td>
4302- <td align="center" bgcolor="mediumseagreen">
4303- 18/18
4304- </td>
4305- </tr>
4306- <tr>
4307- <td valign="top">
4308- app-UseCaseSEQ
4309- </td>
4310- <td align="center" bgcolor="mediumseagreen">
4311- 5/5
4312- </td>
4313- </tr>
4314- <tr>
4315- <td valign="top">
4316- app-UseCaseSGML
4317- </td>
4318- <td align="center" bgcolor="mediumseagreen">
4319- 11/11
4320- </td>
4321- </tr>
4322- <tr>
4323- <td valign="top">
4324- app-UseCaseSTRING
4325- </td>
4326- <td align="center" bgcolor="mediumseagreen">
4327- 4/4
4328- </td>
4329- </tr>
4330- <tr>
4331- <td valign="top">
4332- app-UseCaseTREE
4333- </td>
4334- <td align="center" bgcolor="mediumseagreen">
4335- 6/6
4336- </td>
4337- </tr>
4338- <tr>
4339- <td valign="top">
4340- app-UseCaseXMP
4341- </td>
4342- <td align="center" bgcolor="mediumseagreen">
4343- 12/12
4344- </td>
4345- </tr>
4346- <tr>
4347- <td valign="top">
4348- app-XMark
4349- </td>
4350- <td align="center" bgcolor="mediumseagreen">
4351- 21/21
4352- </td>
4353+ <th> Tests </th>
4354+ <th> Zorba 2.9.1 XQ30 (QT3 vCVS) </th>
4355+ </tr>
4356+ <tr>
4357+ <td valign="top"> fn-abs </td>
4358+ <td align="center" bgcolor="mediumseagreen"> 183/183 </td>
4359+ </tr>
4360+ <tr>
4361+ <td valign="top"> fn-adjust-date-to-timezone </td>
4362+ <td align="center" bgcolor="mediumseagreen"> 40/40 </td>
4363+ </tr>
4364+ <tr>
4365+ <td valign="top"> fn-adjust-dateTime-to-timezone </td>
4366+ <td align="center" bgcolor="mediumseagreen"> 47/47 </td>
4367+ </tr>
4368+ <tr>
4369+ <td valign="top"> fn-adjust-time-to-timezone </td>
4370+ <td align="center" bgcolor="mediumseagreen"> 41/41 </td>
4371+ </tr>
4372+ <tr>
4373+ <td valign="top"> fn-analyze-string </td>
4374+ <td align="center" bgcolor="white"> 0/0 </td>
4375+ </tr>
4376+ <tr>
4377+ <td valign="top"> fn-available-environment-variables </td>
4378+ <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
4379+ </tr>
4380+ <tr>
4381+ <td valign="top"> fn-avg </td>
4382+ <td align="center" bgcolor="mediumseagreen"> 237/237 </td>
4383+ </tr>
4384+ <tr>
4385+ <td valign="top"> fn-base-uri </td>
4386+ <td align="center" bgcolor="mediumseagreen"> 62/62 </td>
4387+ </tr>
4388+ <tr>
4389+ <td valign="top"> fn-boolean </td>
4390+ <td align="center" bgcolor="mediumseagreen"> 136/136 </td>
4391+ </tr>
4392+ <tr>
4393+ <td valign="top"> fn-ceiling </td>
4394+ <td align="center" bgcolor="mediumseagreen"> 87/87 </td>
4395+ </tr>
4396+ <tr>
4397+ <td valign="top"> fn-codepoint-equal </td>
4398+ <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
4399+ </tr>
4400+ <tr>
4401+ <td valign="top"> fn-codepoints-to-string </td>
4402+ <td align="center" bgcolor="mediumseagreen"> 76/76 </td>
4403+ </tr>
4404+ <tr>
4405+ <td valign="top"> fn-collection </td>
4406+ <td align="center" bgcolor="coral"> 18/29 </td>
4407+ </tr>
4408+ <tr>
4409+ <td valign="top"> fn-compare </td>
4410+ <td align="center" bgcolor="palegreen"> 63/64 </td>
4411+ </tr>
4412+ <tr>
4413+ <td valign="top"> fn-concat </td>
4414+ <td align="center" bgcolor="mediumseagreen"> 95/95 </td>
4415+ </tr>
4416+ <tr>
4417+ <td valign="top"> fn-contains </td>
4418+ <td align="center" bgcolor="mediumseagreen"> 41/41 </td>
4419+ </tr>
4420+ <tr>
4421+ <td valign="top"> fn-count </td>
4422+ <td align="center" bgcolor="mediumseagreen"> 316/316 </td>
4423+ </tr>
4424+ <tr>
4425+ <td valign="top"> fn-current-date </td>
4426+ <td align="center" bgcolor="mediumseagreen"> 26/26 </td>
4427+ </tr>
4428+ <tr>
4429+ <td valign="top"> fn-current-dateTime </td>
4430+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4431+ </tr>
4432+ <tr>
4433+ <td valign="top"> fn-current-time </td>
4434+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4435+ </tr>
4436+ <tr>
4437+ <td valign="top"> fn-data </td>
4438+ <td align="center" bgcolor="mediumseagreen"> 53/53 </td>
4439+ </tr>
4440+ <tr>
4441+ <td valign="top"> fn-dateTime </td>
4442+ <td align="center" bgcolor="mediumseagreen"> 52/52 </td>
4443+ </tr>
4444+ <tr>
4445+ <td valign="top"> fn-day-from-date </td>
4446+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4447+ </tr>
4448+ <tr>
4449+ <td valign="top"> fn-day-from-dateTime </td>
4450+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4451+ </tr>
4452+ <tr>
4453+ <td valign="top"> fn-days-from-duration </td>
4454+ <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
4455+ </tr>
4456+ <tr>
4457+ <td valign="top"> fn-deep-equal </td>
4458+ <td align="center" bgcolor="coral"> 204/210 </td>
4459+ </tr>
4460+ <tr>
4461+ <td valign="top"> fn-default-collation </td>
4462+ <td align="center" bgcolor="mediumseagreen"> 7/7 </td>
4463+ </tr>
4464+ <tr>
4465+ <td valign="top"> fn-distinct-values </td>
4466+ <td align="center" bgcolor="mediumseagreen"> 104/104 </td>
4467+ </tr>
4468+ <tr>
4469+ <td valign="top"> fn-doc </td>
4470+ <td align="center" bgcolor="mediumseagreen"> 43/43 </td>
4471+ </tr>
4472+ <tr>
4473+ <td valign="top"> fn-doc-available </td>
4474+ <td align="center" bgcolor="mediumseagreen"> 13/13 </td>
4475+ </tr>
4476+ <tr>
4477+ <td valign="top"> fn-document-uri </td>
4478+ <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
4479+ </tr>
4480+ <tr>
4481+ <td valign="top"> fn-element-with-id </td>
4482+ <td align="center" bgcolor="mediumseagreen"> 5/5 </td>
4483+ </tr>
4484+ <tr>
4485+ <td valign="top"> fn-empty </td>
4486+ <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
4487+ </tr>
4488+ <tr>
4489+ <td valign="top"> fn-encode-for-uri </td>
4490+ <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
4491+ </tr>
4492+ <tr>
4493+ <td valign="top"> fn-ends-with </td>
4494+ <td align="center" bgcolor="mediumseagreen"> 38/38 </td>
4495+ </tr>
4496+ <tr>
4497+ <td valign="top"> fn-environment-variable </td>
4498+ <td align="center" bgcolor="mediumseagreen"> 3/3 </td>
4499+ </tr>
4500+ <tr>
4501+ <td valign="top"> fn-error </td>
4502+ <td align="center" bgcolor="mediumseagreen"> 97/97 </td>
4503+ </tr>
4504+ <tr>
4505+ <td valign="top"> fn-escape-html-uri </td>
4506+ <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
4507+ </tr>
4508+ <tr>
4509+ <td valign="top"> fn-exactly-one </td>
4510+ <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
4511+ </tr>
4512+ <tr>
4513+ <td valign="top"> fn-exists </td>
4514+ <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
4515+ </tr>
4516+ <tr>
4517+ <td valign="top"> fn-false </td>
4518+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4519+ </tr>
4520+ <tr>
4521+ <td valign="top"> fn-filter </td>
4522+ <td align="center" bgcolor="white"> 0/0 </td>
4523+ </tr>
4524+ <tr>
4525+ <td valign="top"> fn-floor </td>
4526+ <td align="center" bgcolor="mediumseagreen"> 88/88 </td>
4527+ </tr>
4528+ <tr>
4529+ <td valign="top"> fn-fold-left </td>
4530+ <td align="center" bgcolor="white"> 0/0 </td>
4531+ </tr>
4532+ <tr>
4533+ <td valign="top"> fn-fold-right </td>
4534+ <td align="center" bgcolor="white"> 0/0 </td>
4535+ </tr>
4536+ <tr>
4537+ <td valign="top"> fn-format-date </td>
4538+ <td align="center" bgcolor="white"> 0/0 </td>
4539+ </tr>
4540+ <tr>
4541+ <td valign="top"> fn-format-dateTime </td>
4542+ <td align="center" bgcolor="white"> 0/0 </td>
4543+ </tr>
4544+ <tr>
4545+ <td valign="top"> fn-format-integer </td>
4546+ <td align="center" bgcolor="white"> 0/0 </td>
4547+ </tr>
4548+ <tr>
4549+ <td valign="top"> fn-format-number </td>
4550+ <td align="center" bgcolor="white"> 0/0 </td>
4551+ </tr>
4552+ <tr>
4553+ <td valign="top"> fn-format-time </td>
4554+ <td align="center" bgcolor="white"> 0/0 </td>
4555+ </tr>
4556+ <tr>
4557+ <td valign="top"> fn-function-lookup </td>
4558+ <td align="center" bgcolor="white"> 0/0 </td>
4559+ </tr>
4560+ <tr>
4561+ <td valign="top"> fn-function-arity </td>
4562+ <td align="center" bgcolor="white"> 0/0 </td>
4563+ </tr>
4564+ <tr>
4565+ <td valign="top"> fn-function-name </td>
4566+ <td align="center" bgcolor="white"> 0/0 </td>
4567+ </tr>
4568+ <tr>
4569+ <td valign="top"> fn-generate-id </td>
4570+ <td align="center" bgcolor="white"> 0/0 </td>
4571+ </tr>
4572+ <tr>
4573+ <td valign="top"> fn-has-children </td>
4574+ <td align="center" bgcolor="white"> 0/0 </td>
4575+ </tr>
4576+ <tr>
4577+ <td valign="top"> fn-head </td>
4578+ <td align="center" bgcolor="white"> 0/0 </td>
4579+ </tr>
4580+ <tr>
4581+ <td valign="top"> fn-hours-from-dateTime </td>
4582+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4583+ </tr>
4584+ <tr>
4585+ <td valign="top"> fn-hours-from-duration </td>
4586+ <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
4587+ </tr>
4588+ <tr>
4589+ <td valign="top"> fn-hours-from-time </td>
4590+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4591+ </tr>
4592+ <tr>
4593+ <td valign="top"> fn-id </td>
4594+ <td align="center" bgcolor="coral"> 39/41 </td>
4595+ </tr>
4596+ <tr>
4597+ <td valign="top"> fn-idref </td>
4598+ <td align="center" bgcolor="mediumseagreen"> 30/30 </td>
4599+ </tr>
4600+ <tr>
4601+ <td valign="top"> fn-implicit-timezone </td>
4602+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4603+ </tr>
4604+ <tr>
4605+ <td valign="top"> fn-innermost </td>
4606+ <td align="center" bgcolor="white"> 0/0 </td>
4607+ </tr>
4608+ <tr>
4609+ <td valign="top"> fn-index-of </td>
4610+ <td align="center" bgcolor="mediumseagreen"> 53/53 </td>
4611+ </tr>
4612+ <tr>
4613+ <td valign="top"> fn-insert-before </td>
4614+ <td align="center" bgcolor="mediumseagreen"> 43/43 </td>
4615+ </tr>
4616+ <tr>
4617+ <td valign="top"> fn-in-scope-prefixes </td>
4618+ <td align="center" bgcolor="mediumseagreen"> 58/58 </td>
4619+ </tr>
4620+ <tr>
4621+ <td valign="top"> fn-iri-to-uri </td>
4622+ <td align="center" bgcolor="mediumseagreen"> 46/46 </td>
4623+ </tr>
4624+ <tr>
4625+ <td valign="top"> fn-lang </td>
4626+ <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
4627+ </tr>
4628+ <tr>
4629+ <td valign="top"> fn-last </td>
4630+ <td align="center" bgcolor="mediumseagreen"> 65/65 </td>
4631+ </tr>
4632+ <tr>
4633+ <td valign="top"> fn-local-name </td>
4634+ <td align="center" bgcolor="mediumseagreen"> 59/59 </td>
4635+ </tr>
4636+ <tr>
4637+ <td valign="top"> fn-local-name-from-QName </td>
4638+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4639+ </tr>
4640+ <tr>
4641+ <td valign="top"> fn-lower-case </td>
4642+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4643+ </tr>
4644+ <tr>
4645+ <td valign="top"> fn-map </td>
4646+ <td align="center" bgcolor="white"> 0/0 </td>
4647+ </tr>
4648+ <tr>
4649+ <td valign="top"> fn-max </td>
4650+ <td align="center" bgcolor="mediumseagreen"> 201/201 </td>
4651+ </tr>
4652+ <tr>
4653+ <td valign="top"> fn-map-pairs </td>
4654+ <td align="center" bgcolor="white"> 0/0 </td>
4655+ </tr>
4656+ <tr>
4657+ <td valign="top"> fn-matches </td>
4658+ <td align="center" bgcolor="palegreen"> 145/146 </td>
4659+ </tr>
4660+ <tr>
4661+ <td valign="top"> fn-matches.re </td>
4662+ <td align="center" bgcolor="mediumseagreen"> 1/1 </td>
4663+ </tr>
4664+ <tr>
4665+ <td valign="top"> fn-min </td>
4666+ <td align="center" bgcolor="mediumseagreen"> 200/200 </td>
4667+ </tr>
4668+ <tr>
4669+ <td valign="top"> fn-minutes-from-dateTime </td>
4670+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4671+ </tr>
4672+ <tr>
4673+ <td valign="top"> fn-minutes-from-duration </td>
4674+ <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
4675+ </tr>
4676+ <tr>
4677+ <td valign="top"> fn-minutes-from-time </td>
4678+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4679+ </tr>
4680+ <tr>
4681+ <td valign="top"> fn-month-from-date </td>
4682+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4683+ </tr>
4684+ <tr>
4685+ <td valign="top"> fn-months-from-duration </td>
4686+ <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
4687+ </tr>
4688+ <tr>
4689+ <td valign="top"> fn-month-from-dateTime </td>
4690+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4691+ </tr>
4692+ <tr>
4693+ <td valign="top"> fn-name </td>
4694+ <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
4695+ </tr>
4696+ <tr>
4697+ <td valign="top"> fn-namespace-uri </td>
4698+ <td align="center" bgcolor="mediumseagreen"> 33/33 </td>
4699+ </tr>
4700+ <tr>
4701+ <td valign="top"> fn-namespace-uri-for-prefix </td>
4702+ <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
4703+ </tr>
4704+ <tr>
4705+ <td valign="top"> fn-namespace-uri-from-QName </td>
4706+ <td align="center" bgcolor="mediumseagreen"> 29/29 </td>
4707+ </tr>
4708+ <tr>
4709+ <td valign="top"> fn-nilled </td>
4710+ <td align="center" bgcolor="mediumseagreen"> 54/54 </td>
4711+ </tr>
4712+ <tr>
4713+ <td valign="top"> fn-node-name </td>
4714+ <td align="center" bgcolor="mediumseagreen"> 35/35 </td>
4715+ </tr>
4716+ <tr>
4717+ <td valign="top"> fn-normalize-space </td>
4718+ <td align="center" bgcolor="coral"> 37/39 </td>
4719+ </tr>
4720+ <tr>
4721+ <td valign="top"> fn-normalize-unicode </td>
4722+ <td align="center" bgcolor="coral"> 41/44 </td>
4723+ </tr>
4724+ <tr>
4725+ <td valign="top"> fn-not </td>
4726+ <td align="center" bgcolor="mediumseagreen"> 83/83 </td>
4727+ </tr>
4728+ <tr>
4729+ <td valign="top"> fn-number </td>
4730+ <td align="center" bgcolor="mediumseagreen"> 66/66 </td>
4731+ </tr>
4732+ <tr>
4733+ <td valign="top"> fn-one-or-more </td>
4734+ <td align="center" bgcolor="mediumseagreen"> 56/56 </td>
4735+ </tr>
4736+ <tr>
4737+ <td valign="top"> fn-outermost </td>
4738+ <td align="center" bgcolor="white"> 0/0 </td>
4739+ </tr>
4740+ <tr>
4741+ <td valign="top"> fn-parse-json </td>
4742+ <td align="center" bgcolor="white"> 0/0 </td>
4743+ </tr>
4744+ <tr>
4745+ <td valign="top"> fn-parse-xml </td>
4746+ <td align="center" bgcolor="white"> 0/0 </td>
4747+ </tr>
4748+ <tr>
4749+ <td valign="top"> fn-parse-xml-fragment </td>
4750+ <td align="center" bgcolor="white"> 0/0 </td>
4751+ </tr>
4752+ <tr>
4753+ <td valign="top"> fn-path </td>
4754+ <td align="center" bgcolor="white"> 0/0 </td>
4755+ </tr>
4756+ <tr>
4757+ <td valign="top"> fn-position </td>
4758+ <td align="center" bgcolor="mediumseagreen"> 66/66 </td>
4759+ </tr>
4760+ <tr>
4761+ <td valign="top"> fn-prefix-from-QName </td>
4762+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4763+ </tr>
4764+ <tr>
4765+ <td valign="top"> fn-QName </td>
4766+ <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
4767+ </tr>
4768+ <tr>
4769+ <td valign="top"> fn-remove </td>
4770+ <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
4771+ </tr>
4772+ <tr>
4773+ <td valign="top"> fn-replace </td>
4774+ <td align="center" bgcolor="palegreen"> 72/73 </td>
4775+ </tr>
4776+ <tr>
4777+ <td valign="top"> fn-resolve-QName </td>
4778+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4779+ </tr>
4780+ <tr>
4781+ <td valign="top"> fn-resolve-uri </td>
4782+ <td align="center" bgcolor="coral"> 36/38 </td>
4783+ </tr>
4784+ <tr>
4785+ <td valign="top"> fn-reverse </td>
4786+ <td align="center" bgcolor="mediumseagreen"> 70/70 </td>
4787+ </tr>
4788+ <tr>
4789+ <td valign="top"> fn-root </td>
4790+ <td align="center" bgcolor="mediumseagreen"> 36/36 </td>
4791+ </tr>
4792+ <tr>
4793+ <td valign="top"> fn-round </td>
4794+ <td align="center" bgcolor="mediumseagreen"> 245/245 </td>
4795+ </tr>
4796+ <tr>
4797+ <td valign="top"> fn-round-half-to-even </td>
4798+ <td align="center" bgcolor="mediumseagreen"> 128/128 </td>
4799+ </tr>
4800+ <tr>
4801+ <td valign="top"> fn-seconds-from-dateTime </td>
4802+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4803+ </tr>
4804+ <tr>
4805+ <td valign="top"> fn-seconds-from-duration </td>
4806+ <td align="center" bgcolor="mediumseagreen"> 32/32 </td>
4807+ </tr>
4808+ <tr>
4809+ <td valign="top"> fn-seconds-from-time </td>
4810+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4811+ </tr>
4812+ <tr>
4813+ <td valign="top"> fn-serialize </td>
4814+ <td align="center" bgcolor="white"> 0/0 </td>
4815+ </tr>
4816+ <tr>
4817+ <td valign="top"> fn-serialize-json </td>
4818+ <td align="center" bgcolor="white"> 0/0 </td>
4819+ </tr>
4820+ <tr>
4821+ <td valign="top"> fn-starts-with </td>
4822+ <td align="center" bgcolor="mediumseagreen"> 39/39 </td>
4823+ </tr>
4824+ <tr>
4825+ <td valign="top"> fn-static-base-uri </td>
4826+ <td align="center" bgcolor="mediumseagreen"> 18/18 </td>
4827+ </tr>
4828+ <tr>
4829+ <td valign="top"> fn-string </td>
4830+ <td align="center" bgcolor="mediumseagreen"> 62/62 </td>
4831+ </tr>
4832+ <tr>
4833+ <td valign="top"> fn-string-join </td>
4834+ <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
4835+ </tr>
4836+ <tr>
4837+ <td valign="top"> fn-string-length </td>
4838+ <td align="center" bgcolor="coral"> 33/35 </td>
4839+ </tr>
4840+ <tr>
4841+ <td valign="top"> fn-string-to-codepoints </td>
4842+ <td align="center" bgcolor="mediumseagreen"> 44/44 </td>
4843+ </tr>
4844+ <tr>
4845+ <td valign="top"> fn-subsequence </td>
4846+ <td align="center" bgcolor="mediumseagreen"> 103/103 </td>
4847+ </tr>
4848+ <tr>
4849+ <td valign="top"> fn-substring </td>
4850+ <td align="center" bgcolor="mediumseagreen"> 48/48 </td>
4851+ </tr>
4852+ <tr>
4853+ <td valign="top"> fn-substring-after </td>
4854+ <td align="center" bgcolor="coral"> 36/37 </td>
4855+ </tr>
4856+ <tr>
4857+ <td valign="top"> fn-substring-before </td>
4858+ <td align="center" bgcolor="coral"> 35/36 </td>
4859+ </tr>
4860+ <tr>
4861+ <td valign="top"> fn-sum </td>
4862+ <td align="center" bgcolor="mediumseagreen"> 218/218 </td>
4863+ </tr>
4864+ <tr>
4865+ <td valign="top"> fn-tail </td>
4866+ <td align="center" bgcolor="white"> 0/0 </td>
4867+ </tr>
4868+ <tr>
4869+ <td valign="top"> fn-timezone-from-date </td>
4870+ <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
4871+ </tr>
4872+ <tr>
4873+ <td valign="top"> fn-timezone-from-dateTime </td>
4874+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4875+ </tr>
4876+ <tr>
4877+ <td valign="top"> fn-timezone-from-time </td>
4878+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4879+ </tr>
4880+ <tr>
4881+ <td valign="top"> fn-tokenize </td>
4882+ <td align="center" bgcolor="mediumseagreen"> 50/50 </td>
4883+ </tr>
4884+ <tr>
4885+ <td valign="top"> fn-trace </td>
4886+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4887+ </tr>
4888+ <tr>
4889+ <td valign="top"> fn-translate </td>
4890+ <td align="center" bgcolor="mediumseagreen"> 42/42 </td>
4891+ </tr>
4892+ <tr>
4893+ <td valign="top"> fn-true </td>
4894+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4895+ </tr>
4896+ <tr>
4897+ <td valign="top"> fn-unordered </td>
4898+ <td align="center" bgcolor="mediumseagreen"> 34/34 </td>
4899+ </tr>
4900+ <tr>
4901+ <td valign="top"> fn-unparsed-text </td>
4902+ <td align="center" bgcolor="white"> 0/0 </td>
4903+ </tr>
4904+ <tr>
4905+ <td valign="top"> fn-unparsed-text-available </td>
4906+ <td align="center" bgcolor="white"> 0/0 </td>
4907+ </tr>
4908+ <tr>
4909+ <td valign="top"> fn-unparsed-text-lines </td>
4910+ <td align="center" bgcolor="white"> 0/0 </td>
4911+ </tr>
4912+ <tr>
4913+ <td valign="top"> fn-upper-case </td>
4914+ <td align="center" bgcolor="mediumseagreen"> 24/24 </td>
4915+ </tr>
4916+ <tr>
4917+ <td valign="top"> fn-uri-collection </td>
4918+ <td align="center" bgcolor="white"> 0/0 </td>
4919+ </tr>
4920+ <tr>
4921+ <td valign="top"> fn-year-from-date </td>
4922+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4923+ </tr>
4924+ <tr>
4925+ <td valign="top"> fn-years-from-duration </td>
4926+ <td align="center" bgcolor="mediumseagreen"> 31/31 </td>
4927+ </tr>
4928+ <tr>
4929+ <td valign="top"> fn-year-from-dateTime </td>
4930+ <td align="center" bgcolor="mediumseagreen"> 27/27 </td>
4931+ </tr>
4932+ <tr>
4933+ <td valign="top"> fn-zero-or-one </td>
4934+ <td align="center" bgcolor="mediumseagreen"> 51/51 </td>
4935+ </tr>
4936+ <tr>
4937+ <td valign="top"> math-acos </td>
4938+ <td align="center" bgcolor="white"> 0/0 </td>
4939+ </tr>
4940+ <tr>
4941+ <td valign="top"> math-asin </td>
4942+ <td align="center" bgcolor="white"> 0/0 </td>
4943+ </tr>
4944+ <tr>
4945+ <td valign="top"> math-atan </td>
4946+ <td align="center" bgcolor="white"> 0/0 </td>
4947+ </tr>
4948+ <tr>
4949+ <td valign="top"> math-atan2 </td>
4950+ <td align="center" bgcolor="white"> 0/0 </td>
4951+ </tr>
4952+ <tr>
4953+ <td valign="top"> math-cos </td>
4954+ <td align="center" bgcolor="white"> 0/0 </td>
4955+ </tr>
4956+ <tr>
4957+ <td valign="top"> math-exp </td>
4958+ <td align="center" bgcolor="white"> 0/0 </td>
4959+ </tr>
4960+ <tr>
4961+ <td valign="top"> math-exp10 </td>
4962+ <td align="center" bgcolor="white"> 0/0 </td>
4963+ </tr>
4964+ <tr>
4965+ <td valign="top"> math-log </td>
4966+ <td align="center" bgcolor="white"> 0/0 </td>
4967+ </tr>
4968+ <tr>
4969+ <td valign="top"> math-log10 </td>
4970+ <td align="center" bgcolor="white"> 0/0 </td>
4971+ </tr>
4972+ <tr>
4973+ <td valign="top"> math-pi </td>
4974+ <td align="center" bgcolor="white"> 0/0 </td>
4975+ </tr>
4976+ <tr>
4977+ <td valign="top"> math-pow </td>
4978+ <td align="center" bgcolor="white"> 0/0 </td>
4979+ </tr>
4980+ <tr>
4981+ <td valign="top"> math-sin </td>
4982+ <td align="center" bgcolor="white"> 0/0 </td>
4983+ </tr>
4984+ <tr>
4985+ <td valign="top"> math-sqrt </td>
4986+ <td align="center" bgcolor="white"> 0/0 </td>
4987+ </tr>
4988+ <tr>
4989+ <td valign="top"> math-tan </td>
4990+ <td align="center" bgcolor="white"> 0/0 </td>
4991+ </tr>
4992+ <tr>
4993+ <td valign="top"> map-new </td>
4994+ <td align="center" bgcolor="white"> 0/0 </td>
4995+ </tr>
4996+ <tr>
4997+ <td valign="top"> map-contains </td>
4998+ <td align="center" bgcolor="white"> 0/0 </td>
4999+ </tr>
5000+ <tr>
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches