Last modified on 11 July 2014, at 13:38

XQuery/eXist Crib sheet

Imports and DeclarationsEdit

XQuery declarationEdit

xquery version "1.0";

import a moduleEdit

import module namespace geo="http://www.cems.uwe.ac.uk/exist/coord" at "coord.xqm";

Base eXist namespaceEdit

  declare namespace exist = "http://exist.sourceforge.net/NS/exist"; 

Standard eXist modulesEdit

Optional in an XQuery script but required in a module in 1.2 but not in 1.3

 import module namespace xmldb = "http://exist-db.org/xquery/xmldb";
 import module namespace util = "http://exist-db.org/xquery/util";
 import module namespace request = "http://exist-db.org/xquery/request";
 import module namespace response = "http://exist-db.org/xquery/response";
 import module namespace session = "http://exist-db.org/xquery/session";
 import module namespace transform = "http://exist-db.org/xquery/transform";
 import module namespace text = "http://exist-db.org/xquery/text";
 import module namespace system = "http://exist-db.org/xquery/system";

declare a namespaceEdit

 declare namespace tx="http://www.transxchange.org.uk/";

declare a default element namespaceEdit

declare default element namespace "http://www.w3.org/1999/xhtml";

Be VERY careful if you use a default namespace. This means that everything that does not have a namespace prefix will automatically be serialized into this namespace. It also PREVENTS you from using the null namespace unless you specifically declare it as xmlns="". Note that you do NOT associate a prefix with the default namespace.

declare a default function namespaceEdit

declare default function namespace "http://www.transxchange.org.uk/";

declare a java binding namespaceEdit

declare namespace math="java:java.lang.Math";

Note that the java binding is disabled by default due to security issues. Math functions can now be invoked via the maths extension module.

Serialization OptionsEdit

output XML documentEdit

This is the default, but can be declared explictly:

declare option exist:serialize "method=xml media-type=text/xml omit-xml-declaration=no indent=yes";

output SVG documentEdit

declare option exist:serialize "method=svg media-type=application/svg+xml omit-xml-declaration=no indent=yes";


output XHTML documentEdit

declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=no indent=yes 
        doctype-public=-//W3C//DTD XHTML 1.0 Transitional//EN
        doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";

If your code contains a lot of XML fragements that are in the NULL namespace (xmlns="") then there is a method of automatically converting everything in the null namespace to automatically get put into the XHTML namespace.

declare option exist:serialize "method=xhtml enforce-xhtml=yes";

output HTML4 documentEdit

declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=no indent=yes 
        doctype-public=-//W3C//DTD HTML 4.01 Transitional//EN
        doctype-system=http://www.w3.org/TR/loose.dtd";

output HTML5 documentEdit

declare option exist:serialize "method=html5 media-type=text/html omit-xml-declaration=yes indent=yes";

output HTML document with no doctypeEdit

declare option exist:serialize "method=html media-type=text/html omit-xml-declaration=yes indent=yes";

output XHTML document with no doctypeEdit

declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=yes indent=yes";

output plain text document with no doctypeEdit

declare option exist:serialize "method=text media-type=text/plain omit-xml-declaration=yes";

output kml documentEdit

declare option exist:serialize  "method=xhtml media-type=application/vnd.google-earth.kml+xml highlight-matches=none";

output XForms documentEdit

declare option exist:serialize "method=xhtml media-type=text/xml indent=yes";

Modules and FunctionsEdit

module headerEdit

module namespace c="http://www.cems.uwe.ac.uk/exist/coord";

function declarationEdit

  • in the default namespace in an XQuery script
declare function local:times($tt, $dt) {
  if (exists($dt))
  then local:times(($tt, $tt[last()]+ $dt[1]), remove($dt,1))
  else $tt
};
  • in the namespace of a module
module namespace time = 'http://www.cems.uwe.ac.uk/fold/time';
declare function time:times($tt, $dt) {
  if (exists($dt))
  then time:times(($tt, $tt[last()]+ $dt[1]), remove($dt,1))
  else $tt
};

declare variableEdit

declare variable $pi as xs:double := 3.14159265;

in a module with namespace prefix fxx:

declare variable $fxx:file := doc('/db/me/file.xml');

embedded CSS stylesheetEdit

  <style language="text/css">
  <![CDATA[
    .good {background-color: green;}
    .bad {background-color:red;}
  ]]>
  </style>

Get HTTP POST URL ParametersEdit

To get two URL parameters from an HTTP POST

   http://localhost:8080/exist/rest/db/my-collection/my-xquery.xq?color=blue&shape=circle

Add the following:

  let $my-color := request:get-parameter('color', 'red')
  let $my-shape := request:get-parameter('shape', '')

If no color parameter is supplied a default color of "red" will be used.

Get HTTP POST DataEdit

To get all the XML data from an HTTP POST

  let $my-data := request:get-data()

Extend the Output Size LimitEdit

By default the output size in 10,000 bytes. You can extend this by adding the following

  declare option exist:output-size-limit "new-size";

For example to triple the size limit of the output use the following line:

  declare option exist:output-size-limit "30000";