W3C

XQuery 1.0: An XML Query Language

W3C Working Draft 23 July 2004

This version:
http://www.w3.org/TR/2004/WD-xquery-20040723/
Latest version:
http://www.w3.org/TR/xquery/
Previous versions:
http://www.w3.org/TR/2003/WD-xquery-20031112/ http://www.w3.org/TR/2003/WD-xquery-20030822/ http://www.w3.org/TR/2003/WD-xquery-20030502/
Editors:
Scott Boag (XSL WG), IBM Research <scott_boag@us.ibm.com>
Don Chamberlin (XML Query WG), IBM Almaden Research Center <chamberlin@almaden.ibm.com>
Mary F. Fernández (XML Query WG), AT&T Labs <mff@research.att.com>
Daniela Florescu (XML Query WG), BEA Systems <danielaf@bea.com>
Jonathan Robie (XML Query WG), DataDirect Technologies <jonathan.robie@datadirect-technologies.com>
Jérôme Siméon (XML Query WG), IBM T.J. Watson Research Center <simeon@us.ibm.com>

Abstract

XML is a versatile markup language, capable of labeling the information content of diverse data sources including structured and semi-structured documents, relational databases, and object repositories. A query language that uses the structure of XML intelligently can express queries across all these kinds of data, whether physically stored in XML or viewed as XML via middleware. This specification describes a query language called XQuery, which is designed to be broadly applicable across many types of XML data sources.

Status of this Document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This is a public W3C Working Draft for review by W3C Members and other interested parties. Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

XQuery 1.0 has been defined jointly by the XML Query Working Group and the XSL Working Group (both part of the XML Activity). The XPath 2.0 and XQuery 1.0 Working Drafts are generated from a common source. These languages are closely related, sharing much of the same expression syntax and semantics, and much of the text found in the two Working Drafts is identical.

This working draft includes a number of changes made in response to comments received during the Last Call period that ended on Feb. 15, 2004. The working group is continuing to process these comments, and additional changes are expected. A list of changes introduced by this draft can be found in I Revision Log.

This document reflects decisions taken up to and including the face-to-face meeting in Cambridge, MA during the week of June 21, 2004. These decisions are recorded in the Last Call issues list (http://www.w3.org/2004/07/xquery-issues.html). However, some of these decisions may not yet have been made in this document.

Public comments on this document and its open issues are invited. Comments should be sent to the W3C XPath/XQuery mailing list, public-qt-comments@w3.org (archived at http://lists.w3.org/Archives/Public/public-qt-comments/), with “[XQuery]” at the beginning of the subject field.

The patent policy for this document is expected to become the 5 February 2004 W3C Patent Policy, pending the Advisory Committee review of the renewal of the XML Query Working Group. Patent disclosures relevant to this specification may be found on the XML Query Working Group's patent disclosure page and the XSL Working Group's patent disclosure page. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) with respect to this specification should disclose the information in accordance with section 6 of the W3C Patent Policy.

Table of Contents

1 Introduction
2 Basics
    2.1 Expression Context
        2.1.1 Static Context
        2.1.2 Dynamic Context
    2.2 Processing Model
        2.2.1 Data Model Generation
        2.2.2 Schema Import Processing
        2.2.3 Expression Processing
            2.2.3.1 Static Analysis Phase
            2.2.3.2 Dynamic Evaluation Phase
        2.2.4 Serialization
        2.2.5 Consistency Constraints
    2.3 Documents
        2.3.1 Document Order
        2.3.2 Atomization
        2.3.3 Effective Boolean Value
        2.3.4 Input Sources
    2.4 Types
        2.4.1 Predefined Types
        2.4.2 Typed Value and String Value
        2.4.3 SequenceType Syntax
        2.4.4 SequenceType Matching
            2.4.4.1 Matching a SequenceType and a Value
            2.4.4.2 Matching an ItemType and an Item
            2.4.4.3 Element Test
            2.4.4.4 Schema Element Test
            2.4.4.5 Attribute Test
            2.4.4.6 Schema Attribute Test
    2.5 Error Handling
        2.5.1 Kinds of Errors
        2.5.2 Handling Dynamic Errors
        2.5.3 Errors and Optimization
    2.6 Optional Features
        2.6.1 Schema Import Feature
        2.6.2 Static Typing Feature
        2.6.3 Full Axis Feature
        2.6.4 Module Feature
        2.6.5 Pragmas
        2.6.6 Must-Understand Extensions
            2.6.6.1 XQuery Flagger
        2.6.7 Static Typing Extensions
            2.6.7.1 XQuery Static Flagger
    2.7 Comments
3 Expressions
    3.1 Primary Expressions
        3.1.1 Literals
        3.1.2 Variable References
        3.1.3 Parenthesized Expressions
        3.1.4 Context Item Expression
        3.1.5 Function Calls
    3.2 Path Expressions
        3.2.1 Steps
            3.2.1.1 Axes
            3.2.1.2 Node Tests
        3.2.2 Predicates
        3.2.3 Unabbreviated Syntax
        3.2.4 Abbreviated Syntax
    3.3 Sequence Expressions
        3.3.1 Constructing Sequences
        3.3.2 Filter Expressions
        3.3.3 Combining Node Sequences
    3.4 Arithmetic Expressions
    3.5 Comparison Expressions
        3.5.1 Value Comparisons
        3.5.2 General Comparisons
        3.5.3 Node Comparisons
    3.6 Logical Expressions
    3.7 Constructors
        3.7.1 Direct Element Constructors
            3.7.1.1 Attributes
            3.7.1.2 Namespace Declaration Attributes
            3.7.1.3 Content
            3.7.1.4 Whitespace in Element Content
        3.7.2 Other Direct Constructors
        3.7.3 Computed Constructors
            3.7.3.1 Computed Element Constructors
            3.7.3.2 Computed Attribute Constructors
            3.7.3.3 Document Node Constructors
            3.7.3.4 Text Node Constructors
            3.7.3.5 Computed Processing Instruction Constructors
            3.7.3.6 Computed Comment Constructors
        3.7.4 In-scope Namespaces of a Constructed Element
    3.8 FLWOR Expressions
        3.8.1 For and Let Clauses
        3.8.2 Where Clause
        3.8.3 Order By and Return Clauses
        3.8.4 Example
    3.9 Ordered and Unordered Expressions
    3.10 Conditional Expressions
    3.11 Quantified Expressions
    3.12 Expressions on SequenceTypes
        3.12.1 Instance Of
        3.12.2 Typeswitch
        3.12.3 Cast
        3.12.4 Castable
        3.12.5 Constructor Functions
        3.12.6 Treat
    3.13 Validate Expressions
        3.13.1 Validating an Element Node
        3.13.2 Validating a Document Node
4 Modules and Prologs
    4.1 Version Declaration
    4.2 Module Declaration
    4.3 Xmlspace Declaration
    4.4 Default Collation Declaration
    4.5 Base URI Declaration
    4.6 Construction Declaration
    4.7 Default Namespace Declaration
    4.8 Default Ordering Declaration
    4.9 Schema Import
    4.10 Module Import
    4.11 Namespace Declaration
    4.12 Variable Declaration
    4.13 Function Declaration

Appendices

A XQuery Grammar
    A.1 EBNF
        A.1.1 Grammar Notes
    A.2 Lexical structure
        A.2.1 Terminal Types
        A.2.2 Whitespace Rules
            A.2.2.1 Default Whitespace Handling
            A.2.2.2 ExplicitSpecial Whitespace Handling
        A.2.3 Comments, Pragmas and Extensions
        A.2.4 Lexical Rules
    A.3 Reserved Function Names
    A.4 Precedence Order
B Type Promotion and Operator Mapping
    B.1 Type Promotion
    B.2 Operator Mapping
C Context Components
    C.1 Static Context Components
    C.2 Dynamic Context Components
    C.3 Serialization Parameters
D References
    D.1 Normative References
    D.2 Non-normative References
    D.3 Non-normative Background References
    D.4 Non-normative Informative Material
E Glossary
F Summary of Error Conditions (Non-Normative)
G Example Applications (Non-Normative)
    G.1 Joins
    G.2 Grouping
    G.3 Queries on Sequence
    G.4 Recursive Transformations
    G.5 Selecting Distinct Combinations
H XPath 2.0 and XQuery 1.0 Issues (Non-Normative)
I Revision Log (Non-Normative)
    I.1 23 July 2004


1 Introduction

As increasing amounts of information are stored, exchanged, and presented using XML, the ability to intelligently query XML data sources becomes increasingly important. One of the great strengths of XML is its flexibility in representing many different kinds of information from diverse sources. To exploit this flexibility, an XML query language must provide features for retrieving and interpreting information from these diverse sources.

XQuery is designed to meet the requirements identified by the W3C XML Query Working Group [XML Query 1.0 Requirements] and the use cases in [XML Query Use Cases]. It is designed to be a language in which queries are concise and easily understood. It is also flexible enough to query a broad spectrum of XML information sources, including both databases and documents. The Query Working Group has identified a requirement for both a human-readable query syntax and an XML-based query syntax. XQuery is designed to meet the first of these requirements. XQuery is derived from an XML query language called Quilt [Quilt], which in turn borrowed features from several other languages, including XPath 1.0 [XPath 1.0], XQL [XQL], XML-QL [XML-QL], SQL [SQL], and OQL [ODMG].

[Definition: XQuery operates on the abstract, logical structure of an XML document, rather than its surface syntax. This logical structure is known as the data model, which is defined in the [XQuery 1.0 and XPath 2.0 Data Model] document.]

XQuery Version 1.0 is an extension of XPath Version 2.0. Any expression that is syntactically valid and executes successfully in both XPath 2.0 and XQuery 1.0 will return the same result in both languages. Since these languages are so closely related, their grammars and language descriptions are generated from a common source to ensure consistency, and the editors of these specifications work together closely.

XQuery also depends on and is closely related to the following specifications:

This document specifies a grammar for XQuery, using the same Basic EBNF notation used in [XML 1.0]. Unless otherwise noted (see A.2 Lexical structure), whitespace is not significant in the grammar. Grammar productions are introduced together with the features that they describe, and a complete grammar is also presented in the appendix [A XQuery Grammar]. The appendix is the normative version.

In the grammar productions in this document, nonterminal symbols are underlined and literal text is enclosed in double quotes. Certain productions (including the productions that define DecimalLiteral, DoubleLiteral, and StringLiteral) employ a regular-expression notation. The following example production describes the syntax of a function call:

[83]    FunctionCall    ::=    QName "(" (ExprSingle ("," ExprSingle)*)? ")"

The production should be read as follows: A function call consists of a QName followed by an open-parenthesis. The open-parenthesis is followed by an optional argument list. The argument list (if present) consists of one or more expressions, separated by commas. The optional argument list is followed by a close-parenthesis.

Certain aspects of language processing are described in this specification as implementation-defined or implementation-dependent.

This document normatively defines the dynamic semantics of XQuery. The static semantics of XQuery are normatively defined in [XQuery 1.0 and XPath 2.0 Formal Semantics]. In this document, examples and material labeled as "Note" are provided for explanatory purposes and are not normative.

2 Basics

The basic building block of XQuery is the expression, which is a string of Unicode characters. This specification makes no assumptions or requirements regarding the character set encoding of strings of Unicode characters. The language provides several kinds of expressions which may be constructed from keywords, symbols, and operands. In general, the operands of an expression are other expressions. [Definition: XQuery is a functional language, which means that expressions can be nested with full generality. (However, unlike a pure functional language, it does not allow variable substitutability if the variable declaration contains construction of new nodes.)] [Definition: XQuery is also a strongly-typed language in which the operands of various expressions, operators, and functions must conform to the expected types.]

Note:

This specification contains no assumptions or requirements regarding the character set encoding of strings of Unicode characters.

Like XML, XQuery is a case-sensitive language. Keywords in XQuery use lower-case characters and are not reserved—that is, names in XQuery expressions are allowed to be the same as language keywords—except for the list of reserved function-names in A.3 Reserved Function Names.

The value of an expression is always a sequence. [Definition: A sequence is an ordered collection of zero or more items.] [Definition: An item is either an atomic value or a node.] [Definition: An atomic value is a value in the value space of an atomic type, including all the atomic types defined in [XML Schema] and xdt:untypedAtomic.] [Definition: A node is an instance of one of the node kinds defined in [XQuery 1.0 and XPath 2.0 Data Model].] Each node has a unique node identity. Some kinds of nodes have typed values, string values, and names, which can be extracted from the node. The typed value of a node is a sequence of zero or more atomic values. The string value of a node is a value of type xs:string. The name of a node is a value of type xs:QName.

[Definition: A sequence containing exactly one item is called a singleton sequence.] An item is identical to a singleton sequence containing that item. Sequences are never nested—for example, combining the values 1, (2, 3), and ( ) into a single sequence results in the sequence (1, 2, 3). [Definition: A sequence containing zero items is called an empty sequence.]

Names in XQuery are called QNames, and conform to the syntax in [XML Names]. [Definition: Lexically, a QName consists of an optional namespace prefix and a local name.] A lexical QName can be converted into an expanded QName by resolving its namespace prefix, using algorithms described later in this document. [Definition: An expanded QName consists of an optional namespace URI and a local name.] Two QNames are considered equal if their namespace URIs are equal and their local names are equal (even if the prefixes in their lexical forms are not equal). Namespace URIs and local names are compared on a codepoint basis, without normalization.

This document uses the following predefined namespace prefixes:

In some cases, where the meaning is clear and namespaces are not important to the discussion, built-in XML Schema typenames such as integer and string are used without a namespace prefix.

Element nodes have a property called in-scope namespaces. [Definition: The in-scope namespaces property of an element node is a set of namespace bindings, each of which associates a namespace prefix with a URI, thus defining the set of namespace prefixes that are available for interpreting QNames within the scope of the element. For a given element, one namespace binding may have an empty prefix; the URI of this namespace binding is the default namespace within the scope of the element.]

Note:

In [XPath 1.0], the in-scope namespaces of an element node are represented by a collection of namespace nodes arranged on a namespace axis, which is optional and deprecated in [XPath 2.0]. XQuery does not support the namespace axis and does not represent namespace bindings in the form of nodes. However, where other specifications such as [XSLT 2.0 and XQuery 1.0 Serialization] refer to namespace nodes, these nodes may be synthesized from the in-scope namespaces of an element node by interpreting each namespace binding as a namespace node.

2.1 Expression Context

[Definition: The expression context for a given expression consists of all the information that can affect the result of the expression.] This information is organized into two categories called the static context and the dynamic context.

2.1.1 Static Context

[Definition: The static context of an expression is the information that is available during static analysis of the expression, prior to its evaluation.] This information can be used to decide whether the expression contains a static error. If analysis of an expression relies on some component of the static context that has not been assigned a value, a static error is raised.[err:XP0001]

The individual components of the static context are summarized below. Further rules governing the semantics of these components can be found in C.1 Static Context Components.

  • [Definition: XPath 1.0 compatibility mode. This component must be set by all host languages that include XPath 2.0 as a subset, indicating whether rules for compatibility with XPath 1.0 are in effect. XQuery sets the value of this component to false. ]

  • [Definition: Statically known namespaces. This is a set of (prefix, URI) pairs that define all the namespaces that are known during static processing of a given expression.] Note the difference between in-scope namespaces, which is a dynamic property of an element node, and statically known namespaces, which is a static property of an expression.

    Some namespaces are predefined; additional namespaces can be added to the statically known namespaces by namespace declarations in a Prolog, by namespace declaration attributes in direct element constructors, and by local namespace declarations in computed element constructors.

  • [Definition: Default element/type namespace. This is a namespace URI or "none". The namespace URI, if present, is used for any unprefixed QName appearing in a position where an element or type name is expected.] The initial default element/type namespace may be provided by the external environmentor by a declaration in a Prolog.

  • [Definition: Default function namespace. This is a namespace URI that is used for any unprefixed QName appearing as the function name in a function call. The initial default function namespace may be provided by the external environmentor by a declaration in a Prolog.]

  • [Definition: In-scope schema definitions. This is a generic term for all the element, attribute, and type definitions that are in scope during processing of an expression.] It includes the following three parts:

    • [Definition: In-scope type definitions. Each named type definition is identified either by an expanded QName (for a named type) or by an implementation-dependent type identifier (for an anonymous type). The in-scope type definitions include the predefined types described in 2.4.1 Predefined Types. If the Schema Import Feature is supported, in-scope type definitions also include all type definitions found in imported schemas. ]

    • [Definition: In-scope element declarations. Each element declaration is identified either by an expanded QName (for a top-level element declaration) or by an implementation-dependent element identifier (for a local element declaration). If the Schema Import Feature is supported, in-scope element declarations include all element declarations found in imported schemas. ] An element declaration includes information about the element's substitution group affiliation.

      [Definition: Substitution groups are defined in [XML Schema] Part 1, Section 2.2.2.2. Informally, the substitution group headed by a given element (called the head element) consists of the set of elements that can be substituted for the head element without affecting the outcome of schema validation.]

    • [Definition: In-scope attribute declarations. Each attribute declaration is identified either by an expanded QName (for a top-level attribute declaration) or by an implementation-dependent attribute identifier (for a local attribute declaration). If the Schema Import Feature is supported, in-scope attribute declarations include all attribute declarations found in imported schemas.]

  • [Definition: In-scope variables. This is a set of (expanded QName, type) pairs. It defines the set of variables that are available for reference within an expression. The expanded QName is the name of the variable, and the type is the static type of the variable.]

    Variable declarations in a Prolog are added to in-scope variables. An expression that binds a variable (such as a let, for, some, or every expression) extends the in-scope variables of its subexpressions with the new bound variable and its type. Within a function declaration, the in-scope variables are extended by the names and types of the function parameters.

    The static type of a variable may be either declared in a query or (if the Static Typing Feature is enabled) inferred by static type inference rules as described in [XQuery 1.0 and XPath 2.0 Formal Semantics].

  • Context item static type. This component defines the static type of the context item within the scope of a given expression.

  • [Definition: Function signatures. This component defines the set of functions that are available to be called from within an expression. Each function is uniquely identified by its expanded QName and its arity (number of parameters).] In addition to the name and arity, each function signature specifies the static types of the function parameters and result.

    The function signatures include the signatures of constructor functions, which are discussed in 3.12.5 Constructor Functions.

  • [Definition: Statically known collations. This is a set of (URI, collation) pairs. It defines the names of the collations that are available for use in function calls that take a collation name as an argument.] A collation may be regarded as an object that supports two functions: a function that given a set of strings, returns a sequence containing those strings in sorted order; and a function that given two strings, returns true if they are considered equal, and false if not.

  • [Definition: Default collation. This identifies one of the collations in statically known collations as the collation to be used by string comparison functions and operators when no explicit collation is specified.]

  • [Definition: Construction mode. The construction mode governs the behavior of element constructors. If construction mode is preserve, the type of a constructed element node is xs:anyType, and the attributes and descendants of the constructed element retain their original types. If construction mode is strip, the type of the constructed element node and all its descendants is xdt:untyped, and attributes of the constructed element have type xdt:untypedAtomic.]

  • [Definition: Ordering mode. Ordering mode, which has the value ordered or unordered, affects the ordering of the result sequence returned by path expressions, union, intersect, and except expressions, and FLWOR expressions that have no order by clause.] Details are provided in the descriptions of these expressions.

  • [Definition: XMLSpace policy. This policy, declared in the Prolog, controls the processing of whitespace by element constructors.] Its value may be preserve or strip.

  • [Definition: Base URI. This is an absolute URI, used when necessary in the resolution of relative URIs (for example, by the fn:resolve-uri function.)]

  • [Definition: Statically known documents. This is a mapping from strings onto types. The string represents the absolute URI of a resource that is potentially available using the fn:doc function. The type is the static type of a call to fn:doc with the given URI as its literal argument. ] If the argument to fn:doc is not a string literal that is present in statically known documents, then the static type of fn:doc is document-node()?.

    Note:

    The purpose of the statically known documents is to provide static type information, not to determine which documents are available. A URI need not be found in the statically known documents to be accessed using fn:doc.

  • [Definition: Statically known collections. This is a mapping from strings onto types. The string represents the absolute URI of a resource that is potentially available using the fn:collection function. The type is the type of the sequence of nodes that would result from calling the fn:collection function with this URI as its argument.] If the argument to fn:collection is not a string literal that is present in statically known collections, then the static type of fn:collection is node()*.

    Note:

    The purpose of the statically known collections is to provide static type information, not to determine which collections are available. A URI need not be found in the statically known collections to be accessed using fn:collection.

  • XQuery Flagger status. This component has the value "on" if the XQuery Flagger is implemented and enabled; otherwise it has the value "off".

  • XQuery Static Flagger status. This component has the value "on" if the XQuery Static Flagger is implemented and enabled; otherwise it has the value "off".

2.1.2 Dynamic Context

[Definition: The dynamic context of an expression is defined as information that is available at the time the expression is evaluated.] If evaluation of an expression relies on some part of the dynamic context that has not been assigned a value, a dynamic error is raised.[err:XP0002]

The individual components of the dynamic context are summarized below. Further rules governing the semantics of these components can be found in C.2 Dynamic Context Components.

The dynamic context consists of all the components of the static context, and the additional components listed below.

[Definition: The first three components of the dynamic context (context item, context position, and context size) are called the focus of the expression. ] The focus enables the processor to keep track of which nodes are being processed by the expression.

Certain language constructs, notably the path expression E1/E2 and the filter expression E1[E2], create a new focus for the evaluation of a sub-expression. In these constructs, E2 is evaluated once for each item in the sequence that results from evaluating E1. Each time E2 is evaluated, it is evaluated with a different focus. The focus for evaluating E2 is referred to below as the inner focus, while the focus for evaluating E1 is referred to as the outer focus. The inner focus exists only while E2 is being evaluated. When this evaluation is complete, evaluation of the containing expression continues with its original focus unchanged.

  • [Definition: The context item is the item currently being processed. An item is either an atomic value or a node.][Definition: When the context item is a node, it can also be referred to as the context node.] The context item is returned by the expression ".". When an expression E1/E2 or E1[E2] is evaluated, each item in the sequence obtained by evaluating E1 becomes the context item in the inner focus for an evaluation of E2.

  • [Definition: The context position is the position of the context item within the sequence of items currently being processed.] It changes whenever the context item changes. Its value is always an integer greater than zero. The context position is returned by the expression fn:position(). When an expression E1/E2 or E1[E2] is evaluated, the context position in the inner focus for an evaluation of E2 is the position of the context item in the sequence obtained by evaluating E1. The position of the first item in a sequence is always 1 (one). The context position is always less than or equal to the context size.

  • [Definition: The context size is the number of items in the sequence of items currently being processed.] Its value is always an integer greater than zero. The context size is returned by the expression fn:last(). When an expression E1/E2 or E1[E2] is evaluated, the context size in the inner focus for an evaluation of E2 is the number of items in the sequence obtained by evaluating E1.

  • [Definition: Variable values. This is a set of (expanded QName, value) pairs. It contains the same expanded QNames as the in-scope variables in the static context for the expression. The QName is the name of the variable and the value is the dynamic value of the variable.]

  • [Definition: Function implementations. Each function in function signatures has a function implementation that enables the function to map instances of its parameter types into an instance of its result type. For a user-defined function, the function implementation is an XQuery expression. For an external function, the function implementation is implementation-dependent.]

  • [Definition: Current date and time. This information represents an implementation-dependent point in time during processing of a query or transformation. It can be retrieved by the fn:current-date, fn:current-time, and fn:current-dateTime functions. If invoked multiple times during the execution of a query or transformation, these functions always return the same result.]

  • [Definition: Implicit timezone. This is the timezone to be used when a date, time, or dateTime value that does not have a timezone is used in a comparison or in any other operation. This value is an instance of xdt:dayTimeDuration that is implementation-defined . See [ISO 8601] for the range of legal values of a timezone.]

  • [Definition: Available documents. This is a mapping of strings onto document nodes. The string represents the absolute URI of a resource. The document node is the root of a tree that represents that resource using the data model. The document node is returned by the fn:doc function when applied to that URI.] The set of available documents is not constrained by the set of statically known documents, and it may be empty.

  • [Definition: Available collections. This is a mapping of strings onto sequences of nodes. The string represents the absolute URI of a resource. The sequence of nodes represents the result of the fn:collection function when that URI is supplied as the argument. ] The set of available collections is not constrained by the set of statically known collections, and it may be empty.

2.2 Processing Model

XQuery is defined in terms of the data model and in terms of the expression context.

Processing Model Overview

Figure 1: Processing Model Overview

Figure 1 provides a schematic overview of the processing steps that are discussed in detail below. Some of these steps are completely outside the domain of XQuery; in Figure 1, these are depicted outside the line that represents the boundaries of the language, an area labeled the external processing domain. The external processing domain includes generation of the data model (see 2.2.1 Data Model Generation), schema import processing (see 2.2.2 Schema Import Processing) and serialization (see 2.2.4 Serialization). The area inside the boundaries of the language is known as the query processing domain, which includes the static analysis and dynamic evaluation phases (see 2.2.3 Expression Processing). Consistency constraints on the query processing domain are defined in 2.2.5 Consistency Constraints.

2.2.1 Data Model Generation

Before an expression can be processed, the input documents to be accessed by the expression must be represented in the data model. This process occurs outside the domain of XQuery, which is why Figure 1 represents it in the external processing domain. Here are some steps by which an XML document might be converted to the data model:

  1. A document may be parsed using an XML parser that generates an XML Information Set (see [XML Infoset]). The parsed document may then be validated against one or more schemas. This process, which is described in [XML Schema], results in an abstract information structure called the Post-Schema Validation Infoset (PSVI). If a document has no associated schema, its Information Set is preserved. (See DM1 in Fig. 1.)

  2. The Information Set or PSVI may be transformed into the data model by a process described in [XQuery 1.0 and XPath 2.0 Data Model]. (See DM2 in Fig. 1.)

The above steps provide an example of how a document in the data model might be constructed. A document or fragment might also be synthesized directly from a relational database, or constructed in some other way (see DM3 in Fig. 1.) XQuery is defined in terms of operations on the data model, but it does not place any constraints on how documents and instances in the data model are constructed.

Each atomic value, element node, and attribute node in the data model is annotated with its dynamic type. The dynamic type specifies a range of values—for example, an attribute named version might have the dynamic type xs:decimal, indicating that it contains a decimal value. For example, if the data model was derived from an input XML document, the dynamic types of the elements and attributes are derived from schema validation.

The value of an attribute is represented directly within the attribute node. An attribute node whose type is unknown (such as might occur in a schemaless document) is annotated with the dynamic type xdt:untypedAtomic.

The value of an element is represented by the children of the element node, which may include text nodes and other element nodes. The dynamic type of an element node indicates how the values in its child text nodes are to be interpreted. An element that has not been validated (such as might occur in a schemaless document) is annotated with the type xdt:untyped. An element that has been validated and found to be partially valid is annotated with the type xs:anyType. If an element node is annotated xdt:untyped, all its descendant element nodes are also annotated xdt:untyped. However, if an element node is annotated xs:anyType, some of its descendant element nodes may have a more specific type annotation.

An atomic value of unknown type is annotated with the type xdt:untypedAtomic.

2.2.2 Schema Import Processing

The in-scope schema definitions in the static context may be extracted from actual XML Schemata as described in [XQuery 1.0 and XPath 2.0 Formal Semantics] (see step SI1 in Figure 1) or may be generated by some other mechanism (see step SI2 in Figure 1). In either case, the result must satisfy the consistency constraints defined in 2.2.5 Consistency Constraints.

2.2.3 Expression Processing

XQuery defines two phases of processing called the static analysis phase and the dynamic evaluation phase (see Fig. 1). An implementation is free to use any strategy or algorithm whose result conforms to these specifications.

2.2.3.1 Static Analysis Phase

[Definition: The static analysis phase depends on the expression itself and on the static context. The static analysis phase does not depend on input data (other than schemas).]

During the static analysis phase, the query is parsed into an internal representation called the operation tree (step SQ1 in Figure 1). A parse error is raised as a static error.[err:XP0003] The static context is initialized by the implementation (step SQ2). The static context is then changed and augmented based on information in the prolog (step SQ3). If the Schema Import Feature is supported, the in-scope schema definitions are populated with information from imported schemata. The static context is used to resolve type names, function names, namespace prefixes and variable names (step SQ4). If a name in the operation tree is not found in the static context, a static error [err:XP0008] is raised (however, see exceptions to this rule in 2.4.4.3 Element Test and 2.4.4.5 Attribute Test.

The operation tree is then normalized by making explicit the implicit operations such as atomization, type promotion, and extraction of Effective Boolean Values (step SQ5). The normalization process is described in [XQuery 1.0 and XPath 2.0 Formal Semantics].

If the Static Typing Feature is supported, each expression is assigned a static type (step SQ6). [Definition: The static type of an expression may be either a named type or a structural description—for example, xs:boolean? denotes an optional occurrence of the xs:boolean type. The rules for inferring the static types of various expressions are described in [XQuery 1.0 and XPath 2.0 Formal Semantics].] In some cases, the static type is derived from the lexical form of the expression; for example, the static type of the literal 5 is xs:integer. In other cases, the static type of an expression is inferred according to rules based on the static types of its operands; for example, the static type of the expression 5 + 1.2 is xs:decimal.

During the static analysis phase, if the Static Typing Feature is in effect and an operand of an expression is found to have a static type that is not appropriate for that operand, a type error is raised.[err:XP0004] If static type checking raises no errors and assigns a static type T to an expression, then execution of the expression on valid input data is guaranteed either to produce a value of type T or to raise a dynamic error.

During the static analysis phase, if the Static Typing Feature is in effect and the static type assigned to an expression other than () or data(()) is empty(), a static error is raised.[err:XP0005] This catches cases in which a query refers to an element or attribute that is not present in the in-scope schema definitions, possibly because of a spelling error.

The purpose of type-checking during the static analysis phase is to provide early detection of type errors and to infer type information that may be useful in optimizing the evaluation of an expression.

2.2.3.2 Dynamic Evaluation Phase

[Definition: The dynamic evaluation phase occurs after completion of the static analysis phase. During the dynamic evaluation phase, the value of the query is computed.]

The dynamic evaluation phase can occur only if no errors were detected during the static analysis phase. If the Static Typing Feature is in effect, all type errors are detected during static analysis and serve to inhibit the dynamic evaluation phase. If the Static Typing Feature is not in effect, an implementation is allowed to raise type-related warnings during the static analysis phase. It may then proceed with the dynamic evaluation phase; in this case, type errors must be detected and raised during dynamic evaluation.

The dynamic evaluation phase depends on the operation tree of the expression being evaluated (step DQ1), on the input data (step DQ4), and on the dynamic context (step DQ5), which in turn draws information from the external environment (step DQ3) and the static context (step DQ2). Execution of the evaluation phase may create new data-model values (step DQ4) and it may extend the dynamic context (step DQ5)—for example, by binding values to variables.

[Definition: A dynamic type is associated with each value as it is computed. The dynamic type of a value may be either a structural description (such as "sequence of integers") or a named type.] The dynamic type of a value may be more specific than the static type of the expression that computed it (for example, the static type of an expression might be "zero or more integers or strings," but at evaluation time its value may have the dynamic type "integer.")

If an operand of an expression is found to have a dynamic type that is not appropriate for that operand, a type error is raised.[err:XP0006]

Even though static typing can catch many type errors before an expression is executed, it is possible for an expression to raise an error during evaluation that was not detected by static analysis. For example, an expression may contain a cast of a string into an integer, which is statically valid. However, if the actual value of the string at run time cannot be cast into an integer, a dynamic error will result. Similarly, an expression may apply an arithmetic operator to a value whose static type is xdt:untypedAtomic. This is not a static error, but at run time, if the value cannot be successfully cast to a numeric type, a dynamic error will be raised.

When the Static Typing Feature is in effect, it is also possible for static analysis of an expression to raise a type error, even though execution of the expression on certain inputs would be successful. For example, an expression might contain a function that requires an element as its parameter, and the static analysis phase might infer the static type of the function parameter to be an optional element. This case is treated as a type error and inhibits evaluation, even though the function call would have been successful for input data in which the optional element is present.

2.2.4 Serialization

[Definition: Serialization is the process of converting a sequence of nodes and atomic values from the data model into a sequence of octets (step DM4 in Figure 1.) ] The general framework for serialization of the data model is described in [XSLT 2.0 and XQuery 1.0 Serialization].

An XQuery implementation is not required to provide a serialization interface. For example, an implementation may only provide a DOM interface or an interface based on an event stream. In these cases, serialization would be outside of the scope of this specification.

[XSLT 2.0 and XQuery 1.0 Serialization] defines a set of serialization parameters that govern the serialization process. If an XQuery implementation provides a serialization interface, it may support (and may expose to users) any of the serialization parameters listed (with default values) in C.3 Serialization Parameters. An XQuery implementation that provides a serialization interface must support some combination of serialization parameters in which method = "xml" and version = "1.0".

2.2.5 Consistency Constraints

In order for XQuery to be well defined, the data model, the static context, and the dynamic context must be mutually consistent. The consistency constraints listed below are prerequisites for correct functioning of an XQuery implementation. Enforcement of these consistency constraints is beyond the scope of this specification. This specification does not define the result of a query under any condition in which one or more of these constraints is not satisfied.

Some of the consistency constraints use the term data model schema. [Definition: For a given node in the data model, the data model schema is defined as the schema from which the type annotation of that node was derived.] For a node that was constructed by some process other than schema validation, the data model schema consists simply of the type definition that is represented by the type annotation of the node.

  • For every data model node that has a type annotation, if that type annotation is found in the in-scope schema definitions (ISSD), then its definition in the ISSD must be the same as its definition in the data model schema. Furthermore, all types that are derived by extension from the given type in the data model schema must also be known by equivalent definitions in the ISSD.

  • For every element name EN that is found both in a data model node and in the in-scope schema definitions (ISSD), all elements that are known in the data model schema to be in the substitution group headed by EN must also be known in the ISSD to be in the substitution group headed by EN.

  • Every item type (i.e., every element, attribute, or type name) referenced in in-scope variables or function signatures must be in the in-scope schema definitions.

  • For each mapping of a string to a document node in available documents, if there exists a mapping of the same string to a document type in statically known documents, the document node must match the document type, using the matching rules in 2.4.4 SequenceType Matching.

  • For each mapping of a string to a sequence of nodes in available collections, if there exists a mapping of the same string to a type in statically known collections, the sequence of nodes must match the type, using the matching rules in 2.4.4 SequenceType Matching.

  • For each (variable, type) pair in in-scope variables and the corresponding (variable, value) pair in variable values such that the variable names are equal, the value must match the type, using the matching rules in 2.4.4 SequenceType Matching.

  • For each variable declared as external: If the variable declaration includes a declared type, the external environment must provide a value for the variable that matches the declared type, using the matching rules in 2.4.4 SequenceType Matching. If the variable declaration does not include a declared type, the external environment must provide a type and a matching value, using the same matching rules.

  • For a given query, define a participating ISSD as the in-scope schema definitions of a module that is used in evaluating the query. If two participating ISSDs contain a definition for the same type name, element name, or attribute name, the definitions must be equivalent in both ISSDs. Furthermore, if two participating ISSDs each contain a definition of a type name T, the set of types derived by extension from T must be equivalent in both ISSDs. Also, if two participating ISSDs each contain a definition of an element name E, the substitution group headed by E must be equivalent in both ISSDs.

2.3 Documents

XQuery is generally used to process documents. The representation of a document is normatively defined in [XQuery 1.0 and XPath 2.0 Data Model]. The functions used to access documents and collections are normatively defined in [XQuery 1.0 and XPath 2.0 Functions and Operators]. Because documents are centrally important in XQuery processing, we provide a summary of some key concepts here.

2.3.1 Document Order

An ordering called document order is defined among all the nodes used during a given query or transformation, which may consist of one or more trees (documents or fragments). Document order is defined in [XQuery 1.0 and XPath 2.0 Data Model], and its definition is repeated here for convenience. [Definition: The node ordering that is the reverse of document order is called reverse document order.]

Document order is a total ordering, although the relative order of some nodes is implementation-dependent. [Definition: Informally, document order is the order defined by a pre-order, depth-first traversal of the nodes in the data model.] Document order is stable, which means that the relative order of two nodes will not change during the processing of a given query or transformation, even if this order is implementation-dependent.

Within a tree, document order satisfies the following constraints:

  1. The root node is the first node.

  2. The relative order of siblings is determined by their order in the XML representation of the tree. A node N1 occurs before a node N2 in document order if and only if the start of N1 occurs before the start of N2 in the XML representation.

  3. Attribute nodes immediately follow the element node with which they are associated. The relative order of attribute nodes is stable but implementation-dependent.

  4. Element nodes occur before their children; children occur before following-siblings.

The relative order of nodes in distinct trees is stable but implementation-dependent, subject to the following constraint: If any node in tree T1 is before any node in tree T2, then all nodes in tree T1 are before all nodes in tree T2.

2.3.2 Atomization

The semantics of some XQuery operators depend on a process called atomization. [Definition: Atomization is applied to a value when the value is used in a context in which a sequence of atomic values is required. The result of atomization is either a sequence of atomic values or a type error. Atomization of a sequence is defined as the result of invoking the fn:data function on the sequence, as defined in [XQuery 1.0 and XPath 2.0 Functions and Operators].]

The semantics of fn:data are repeated here for convenience. The result of fn:data is the sequence of atomic values produced by applying the following rules to each item in the input sequence:

  • If the item is an atomic value, it is returned.

  • If the item is a node, its typed value is returned.

Atomization is used in processing the following types of expressions:

  • Arithmetic expressions

  • Comparison expressions

  • Function calls and returns

  • Cast expressions

  • Computed element and attribute constructors.

2.3.3 Effective Boolean Value

Under certain circumstances (listed below), it is necessary to find the effective boolean value of a value. [Definition: The effective boolean value of a value is defined as the result of applying the fn:boolean function to the value, as defined in [XQuery 1.0 and XPath 2.0 Functions and Operators].]

The semantics of fn:boolean are repeated here for convenience. fn:boolean returns false if its operand is any of the following:

  • An empty sequence

  • The boolean value false

  • A zero-length value of type xs:string or xdt:untypedAtomic

  • A numeric value that is equal to zero

  • The xs:double or xs:float value NaN

Otherwise, fn:boolean returns true.

The effective boolean value of a sequence is computed implicitly during processing of the following types of expressions:

  • Logical expressions (and, or)

  • The fn:not function

  • The where clause of a FLWOR expression

  • Certain types of predicates, such as a[b]

  • Conditional expressions (if)

  • Quantified expressions (some, every)

Note:

Note that the definition of effective boolean value is not used when casting a value to the type xs:boolean.

2.3.4 Input Sources

XQuery has a set of functions that provide access to input data. These functions are of particular importance because they provide a way in which an expression can reference a document or a collection of documents. The input functions are described informally here; they are defined in [XQuery 1.0 and XPath 2.0 Functions and Operators].

An expression can access input data either by calling one of the input functions or by referencing some part of the expression context that is initialized by the external environment, such as a variable or a context item.

The input functions supported by XQuery are as follows:

  • The fn:doc function takes a string containing a URI that refers to an XML document, and returns a document node whose content is the data model representation of the given document.

  • The fn:collection function takes a string containing a URI, and returns the data model representation of the collection identified by the URI. A collection may be any sequence of nodes. For example, the expression fn:collection("http://example.org")//customer identifies all the customer elements that are descendants of nodes found in the collection whose URI is http://example.org.

If a given input function is invoked repeatedly with arguments that resolve to the same absolute URI during the scope of a single query or transformation, each invocation returns the same result.

2.4 Types

XQuery is a strongly typed language with a type system based on [XML Schema]. The XQuery type system is formally defined in [XQuery 1.0 and XPath 2.0 Formal Semantics].

2.4.1 Predefined Types

The in-scope type definitions in the static context are initialized with certain predefined types, including the built-in types of [XML Schema]. These built-in types are in the namespace http://www.w3.org/2001/XMLSchema, which has the predefined namespace prefix xs. Some examples of built-in schema types include xs:integer, xs:string, and xs:date. Element and attribute declarations in the xs namespace are not implicitly included in the static context.

In addition, the predefined types of XQuery include the types defined in the namespace http://www.w3.org/2004/07/xpath-datatypes, which has the predefined namespace prefix xdt. The types in this namespace are defined in [XQuery 1.0 and XPath 2.0 Functions and Operators] and are summarized below.

  1. [Definition: xdt:untyped is used to denote the dynamic type of an element node that has not been validated, or has been validated in skip mode.] It has no subtypes.

  2. [Definition: xdt:untypedAtomic is used to denote untyped atomic data, such as text that has not been assigned a more specific type.] It has no subtypes. An attribute that has been validated in skip mode, or that has a PSVI property of xs:anySimpleType, is represented in the Data Model by an attribute node with the type xdt:untypedAtomic.

  3. [Definition: xdt:dayTimeDuration is a subtype of xs:duration whose lexical representation is restricted to contain only day, hour, minute, and second components.]

  4. [Definition: xdt:yearMonthDuration is a subtype of xs:duration whose lexical representation is restricted to contain only year and month components.]

  5. [Definition: xdt:anyAtomicType includes all atomic values (and no values that are not atomic).] It is a subtype of xs:anySimpleType, which is the base type for all simple types, including atomic, list, and union types. All specific atomic types such as xs:integer, xs:string, and xdt:untypedAtomic, are subtypes of xdt:anyAtomicType.

    Note:

    xdt:anyAtomicType will not appear as the type of an actual value in the Data Model.

The relationships among the types in the xs and xdt namespaces are illustrated in Figure 2. A more complete description of the XQuery type hierarchy can be found in [XQuery 1.0 and XPath 2.0 Functions and Operators].

Type Hierarchy Diagram

Figure 2: Summary of XQuery Type Hierarchy

2.4.2 Typed Value and String Value

In the data model, every node has a typed value and a string value. The typed value of a node is a sequence of atomic values and can be extracted by applying the fn:data function to the node. The typed value for each kind of node is defined by the dm:typed-value accessor in [XQuery 1.0 and XPath 2.0 Data Model]. The string value of a node is a string and can be extracted by applying the fn:string function to the node. The string value for each kind of node is defined by the dm:string-value accessor in [XQuery 1.0 and XPath 2.0 Data Model]. Element and attribute nodes have a type annotation, which represents (in an implementation-dependent way) the dynamic (run-time) type of the node. In the [XQuery 1.0 and XPath 2.0 Data Model], type annotation is defined by the dm:type-name accessor; however, XQuery does not provide a way to directly access the type annotation of an element or attribute node.

The relationship between the typed value and the string value for various kinds of nodes is described and illustrated by examples below.

  1. For text and document nodes, the typed value of the node is the same as its string value, as an instance of the type xdt:untypedAtomic. (The string value of a document node is formed by concatenating the string values of all its descendant text nodes, in document order.)

  2. The typed value of a comment or processing instruction node is the same as its string value. It is an instance of the type xs:string.

  3. The typed value of an attribute node with the type annotation xdt:untypedAtomic is the same as its string value, as an instance of xdt:untypedAtomic. The typed value of an attribute node with any other type annotation is derived from its string value and type annotation using the lexical-to-value-space mapping defined in [XML Schema] Part 2 for the relevant type.

    Example: A1 is an attribute having string value "3.14E-2" and type annotation xs:double. The typed value of A1 is the xs:double value whose lexical representation is 3.14E-2.

    Example: A2 is an attribute with type annotation xs:IDREFS, which is a list datatype derived from the atomic datatype xs:IDREF. Its string value is "bar baz faz". The typed value of A2 is a sequence of three atomic values ("bar", "baz", "faz"), each of type xs:IDREF. The typed value of a node is never treated as an instance of a named list type. Instead, if the type annotation of a node is a list type (such as xs:IDREFS), its typed value is treated as a sequence of the atomic type from which it is derived (such as xs:IDREF).

  4. For an element node, the relationship between typed value and string value depends on the node's type annotation, as follows:

    1. If the type annotation is xdt:untyped or denotes a complex type with mixed content (including xs:anyType), then the typed value of the node is equal to its string value, as an instance of xdt:untypedAtomic.

      Example: E1 is an element node having type annotation xdt:untyped and string value "1999-05-31". The typed value of E1 is "1999-05-31", as an instance of xdt:untypedAtomic.

      Example: E2 is an element node with the type annotation formula, which is a complex type with mixed content. The content of E2 consists of the character "H", a child element named subscript with string value "2", and the character "O". The typed value of E2 is "H2O" as an instance of xdt:untypedAtomic.

    2. If the type annotation denotes a simple type or a complex type with simple content, then the typed value of the node is derived from its string value and its type annotation in a way that is consistent with schema validation.

      Example: E3 is an element node with the type annotation cost, which is a complex type that has several attributes and a simple content type of xs:decimal. The string value of E3 is "74.95". The typed value of E3 is 74.95, as an instance of xs:decimal.

      Example: E4 is an element node with the type annotation hatsizelist, which is a simple type derived from the atomic type hatsize, which in turn is derived from xs:integer. The string value of E4 is "7 8 9". The typed value of E4 is a sequence of three values (7, 8, 9), each of type hatsize.

    3. If the type annotation denotes a complex type with empty content, then the typed value of the node is the empty sequence and its string value is the zero-length string.

    4. If the type annotation denotes a complex type with element-only content, then the typed value of the node is undefined. The fn:data function raises a type error [err:XP0007] when applied to such a node.

      Example: E5 is an element node with the type annotation weather, which is a complex type whose content type specifies element-only. E5 has two child elements named temperature and precipitation. The typed value of E5 is undefined, and the fn:data function applied to E5 raises an error.

2.4.3 SequenceType Syntax

[Definition: When it is necessary to refer to a type in an XQuery expression, the SequenceType syntax is used. The name SequenceType suggests that this syntax is used to describe the type of an XQuery value, which is always a sequence.]

[110]    SequenceType    ::=    (ItemType OccurrenceIndicator?)
| ("empty" "(" ")")
[112]    ItemType    ::=    AtomicType | KindTest | ("item" "(" ")")
[111]    OccurrenceIndicator    ::=    "?" | "*" | "+"
[113]    AtomicType    ::=    QName
[114]    KindTest    ::=    DocumentTest
| ElementTest
| AttributeTest
| SchemaElementTest
| SchemaAttributeTest
| PITest
| CommentTest
| TextTest
| AnyKindTest
[116]    DocumentTest    ::=    "document-node" "(" (ElementTest | SchemaElementTest)? ")"
[124]    ElementTest    ::=    "element" "(" (ElementNameOrWildcard ("," TypeName "?"?)?)? ")"
[126]    SchemaElementTest    ::=    "schema-element" "(" ElementDeclaration ")"
[127]    ElementDeclaration    ::=    ElementName
[120]    AttributeTest    ::=    "attribute" "(" (AttribNameOrWildcard ("," TypeName)?)? ")"
[122]    SchemaAttributeTest    ::=    "schema-attribute" "(" AttributeDeclaration ")"
[123]    AttributeDeclaration    ::=    AttributeName
[125]    ElementNameOrWildcard    ::=    ElementName | "*"
[129]    ElementName    ::=    QName
[121]    AttribNameOrWildcard    ::=    AttributeName | "*"
[128]    AttributeName    ::=    QName
[130]    TypeName    ::=    QName
[119]    PITest    ::=    "processing-instruction" "(" (NCName | StringLiteral)? ")"
[118]    CommentTest    ::=    "comment" "(" ")"
[117]    TextTest    ::=    "text" "(" ")"
[115]    AnyKindTest    ::=    "node" "(" ")"

Here are some examples of SequenceTypes that might be used in XQuery expressions:

  • xs:date refers to the built-in atomic Schema type named xs:date

  • attribute()? refers to an optional attribute

  • element() refers to any element

  • element(po:shipto, po:address) refers to an element that has the name po:shipto and has the type annotation po:address (or a type derived from po:address)

  • element(*, po:address) refers to an element of any name that has the type annotation po:address (or a type derived from po:address)

  • element(customer) refers to an element named customer of any type

  • schema-element(customer) refers to an element named customer whose type annotation matches the type declared for a customer element in the in-scope element declarations

  • node()* refers to a sequence of zero or more nodes of any type

  • item()+ refers to a sequence of one or more nodes or atomic values

2.4.4 SequenceType Matching

[Definition: During evaluation of an expression, it is sometimes necessary to determine whether a value with a known type "matches" an expected type, expressed in the SequenceType syntax. This process is known as SequenceType matching.] For example, an instance of expression returns true if the actual type of a given value matches a given type, or false if it does not.

Note:

In this specification, the word "type", when used without modification, represents a type that can be expressed using the SequenceType syntax. When we refer specifically to XML Schema simple or complex types, appropriate modifiers are used to make this clear.

QNames appearing in a SequenceType have their prefixes expanded to namespace URIs by means of the statically known namespaces and the default element/type namespace. As usual, two QNames are considered to be equal if their local parts are the same and their namespace URI's are the same.

[Definition: The use of a value whose actual type is derived from the expected type is known as subtype substitution.] Subtype substitution does not change the actual type of a value. For example, if an xs:integer value is used where an xs:decimal value is expected, the value retains its type as xs:integer.

The rules for SequenceType matching compare the actual type of a value with an expected type. These rules are a subset of the formal rules that match a value with an expected type defined in [XQuery 1.0 and XPath 2.0 Formal Semantics], because the Formal Semantics must be able to match a value with any XML Schema type, whereas the rules below only match values against those types expressible by the SequenceType syntax.

Some of the rules for SequenceType matching require determining whether a given type name is the same as or derived from an expected type name. The given type name may be "known" (defined in the in-scope schema definitions), or "unknown" (not defined in the in-scope schema definitions). An unknown type name might be encountered, for example, if a source document has been validated using a schema that was not imported into the static context. In this case, an implementation is allowed (but is not required) to provide an implementation-dependent mechanism for determining whether the unknown type name is derived from the expected type name. For example, an implementation might maintain a data dictionary containing information about type hierarchies.

The definition of SequenceType matching relies on a pseudo-function named derives-from(AT, ET), which takes an an actual simple or complex type name AT and an expected simple or complex type name ET, and either returns a boolean value or raises a type error. [err:XP0004][err:XP0006] The pseudo-function derives-from is defined below and is defined formally in [XQuery 1.0 and XPath 2.0 Formal Semantics].

  • derives-from(AT, ET) returns true if any of the following three conditions is true:

    1. AT is a type name found in the in-scope schema definitions, and is the same as ET or is derived by restriction or extension from ET

    2. AT is a type name not found in the in-scope schema definitions, and an implementation-dependent mechanism is able to determine that AT is derived by restriction from ET

    3. There exists some type name IT such that derives-from(IT, ET) and derives-from(AT, IT) are true.

  • derives-from(AT, ET) returns false if either the first and third or the second and third of the following conditions are true:

    1. AT is a type name found in the in-scope schema definitions, and is not the same as ET, and is not is derived by restriction or extension from ET

    2. AT is a type name not found in the in-scope schema definitions, and an implementation-dependent mechanism is able to determine that AT is not derived by restriction from ET

    3. No type name IT exists such that derives-from(IT, ET) and derives-from(AT, IT) are true.

  • derives-from(AT, ET) raises a type error [err:XP0004][err:XP0006] if:

    1. ET is an unknown type, or

    2. AT is an unknown type, and the implementation is not able to determine whether AT is derived by restriction from ET.

Note:

The derives-from pseudo-function cannot be written as a real XQuery function, because types are not valid function parameters.

The rules for SequenceType matching are given below, with examples (the examples are for purposes of illustration, and do not cover all possible cases).

2.4.4.1 Matching a SequenceType and a Value

An OccurrenceIndicator specifies the number of items in a sequence, as follows:

  • ? matches zero or one items

  • * matches zero or more items

  • + matches one or more items

As a consequence of these rules, any SequenceType whose OccurrenceIndicator is * or ? matches a value that is an empty sequence.

2.4.4.2 Matching an ItemType and an Item
  • An ItemType consisting simply of a QName is interpreted as an AtomicType. An AtomicType AtomicType matches an atomic value whose actual type is AT if derives-from(AT, AtomicType) is true. If a QName that is used as an AtomicType is not defined as an atomic type in the in-scope type definitions, a static error is raised. [err:XP0051]

    Example: The AtomicType xs:decimal matches the value 12.34 (a decimal literal). xs:decimal also matches a value whose type is shoesize, if shoesize is an atomic type derived by restriction from xs:decimal.

    Note:

    The names of non-atomic types such as xs:IDREFS are not accepted in this context, but can often be replaced by an atomic type with an occurrence indicator, such as xs:IDREF*.

  • item() matches any single item.

    Example: item() matches the atomic value 1 or the element <a/>.

  • node() matches any node.

  • text() matches any text node.

  • processing-instruction() matches any processing-instruction node.

  • processing-instruction(N) matches any processing-instruction node whose name (called its "PITarget" in XML) is equal to N, where N is an NCName.

    Example: processing-instruction(xml-stylesheet) matches any processing instruction whose PITarget is xml-stylesheet.

    For backward compatibility with XPath 1.0, the PITarget of a processing instruction may also be expressed as a string literal, as in this example: processing-instruction("xml-stylesheet").

  • comment() matches any comment node.

  • document-node() matches any document node.

  • document-node(E) matches any document node that contains exactly one element node, optionally accompanied by one or more comment and processing instruction nodes, if E is an ElementTest or SchemaElementTest that matches the element node (see 2.4.4.3 Element Test and 2.4.4.4 Schema Element Test).

    Example: document-node(element(book)) matches a document node containing exactly one element node that is matched by the ElementTest element(book).

  • An ItemType that is an ElementTest, SchemaElementTest, AttributeTest, or SchemaAttributeTest matches an element or attribute node as described in the following sections.

2.4.4.3 Element Test

An ElementTest is used to match an element node by its name and/or type. An ElementTest any take any of the following forms. In these forms, ElementName and TypeName may be any QNames, and need not be present in the in-scope schema definitions. Note that substitution groups do not affect the semantics of ElementTest.

  1. element() and element(*) match any single element node, regardless of its name or type.

  2. element(ElementName) matches any element node whose name is ElementName, regardless of its type or nilled property.

    Example: element(person) matches any element node whose name is person.

  3. element(ElementName, TypeName) matches an element node whose name is ElementName if derives-from(AT, TypeName ) is true, where AT is the type of the element node, and the nilled property of the node is false.

    Example: element(person, surgeon) matches a non-nilled element node whose name is person and whose type annotation is surgeon.

  4. element(ElementName, TypeName ?) matches an element node whose name is ElementName if derives-from(AT, TypeName) is true, where AT is the type of the element node. The nilled property of the node may be either true or false.

    Example: element(person, surgeon?) matches a nilled or non-nilled element node whose name is person and whose type annotation is surgeon.

  5. element(*, TypeName) matches an element node regardless of its name, if derives-from(AT, TypeName ) is true, where AT is the type of the element node, and the nilled property of the node is false.

    Example: element(*, surgeon) matches any non-nilled element node whose type annotation is surgeon, regardless of its name.

  6. element(*, TypeName ?) matches an element node regardless of its name, if derives-from(AT, TypeName ) is true, where AT is the type of the element node. The nilled property of the node may be either true or false.

    Example: element(*, surgeon?) matches any nilled or non-nilled element node whose type annotation is surgeon, regardless of its name.

2.4.4.4 Schema Element Test

A SchemaElementTest matches an element node against a corresponding element declaration found in the in-scope element declarations. It takes the following form:

schema-element(ElementName)

If the ElementName specified in the SchemaElementTest<