Copyright © 2003 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C liability, trademark, document use and software licensingrules apply.
This document defines basic operators and functions on the datatypes defined in [XML Schema Part 2: Datatypes] for use in XQuery, XPath, XSLT and other related XML standards. It also discusses operators and functions on nodes and node sequences as defined in the [XQuery 1.0 and XPath 2.0 Data Model] for use in XQuery, XPath, XSLT and other related XML standards.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. The latest status of this document series is maintained at the W3C.
This is a Public Working Draft of this document for review by W3C Members and other interested parties. It is a draft document and may be updated, replaced, or made obsolete by other documents at any time. It is inappropriate to use W3C Working Drafts as reference material or to cite them as other than "work in progress". This is work in progress and does not imply endorsement by the W3C membership.
This document describes constructor functions, operators and functions that are used in [XPath 2.0], [XQuery 1.0: An XML Query Language] and [XSLT 2.0] and possibly other W3C specifications.
The more significant changes from the previous version of this document are listed below. Public comment is solicited on these changes.
Two new datatypes, xdt:anyAtomicType and
xdt:untypedAtomic have been added (see 1.3 xdt:anyAtomicType and
xdt:untypedAtomic) and the datatypes introduced in
this document have been put into their own namespace.
The semantics of functions whose return type varies with their input type is now described in greater detail. The return type of such functions is identified typographically to call attention to their special semantics.
There also has been some amplification of the rules for
constructing simple types and for casting (see section 5 Constructor
Functions and section 17
Casting Functions). A constructor for
xs:QName has been added with special semantics.
See 17.14 Casting to
xs:QName.
Another area where there has been a significant change
from earlier versions is the implementation of the decision
to preserve the input timezone in xs:dateTime,
xs:date and xs:time values. This
has impacted a large number of functions and has had a
pervasive effect over 9
Functions and Operators on Durations, Dates and
Times.
The fn:document() function has been replaced
by a much simpler function called fn:doc().
The rules for overflow and underflow in numeric operations have been spelled out in greater detail. See 6.2 Operators on Numeric Values
An error function, fn:error(), and a trace
function, fn:trace(),
have been added.
This document has been produced following the procedures set out for the W3C Process. This document was produced through the efforts of a joint task force of the W3C XML Query Working Group and the W3C XSL Working Group (both part of the W3C XML Activity). It is designed to be read in conjunction with the following documents: [XQuery 1.0 and XPath 2.0 Data Model], [XPath 2.0], [XQuery 1.0: An XML Query Language] and [XSLT 2.0].
This is a Last Call Working Draft. Comments on this document are due on 30 June 2003. Comments should be sent to the W3C mailing list, public-qt-comments@w3.org (archived at http://lists.w3.org/Archives/Public/public-qt-comments/).
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.
A list of current W3C Recommendations and other technical documents can be found at http://www.w3.org/TR/.
1 Introduction
1.1 Terminology
1.2 Datatypes
1.3 xdt:anyAtomicType and
xdt:untypedAtomic
1.3.1 xdt:anyAtomicType
1.3.2 xdt:untypedAtomic
1.4 xs:dateTime, xs:date and xs:time
values
1.4.1 Examples
1.5 Syntax
1.6 Notations
1.7 Namespace Prefix
2 Accessors
2.1 fn:node-kind
2.2 fn:node-name
2.3 fn:string
2.4 fn:data
2.5 fn:base-uri
2.6 fn:document-uri
3 The Error Function
3.1 Examples
4 The Trace Function
4.1 Examples
5 Constructor
Functions
5.1 Constructor
Functions for XML Schema Built-in Types
5.2 Constructor
Functions for User-Defined Types
6 Functions and Operators on
Numerics
6.1 Numeric
Types
6.2 Operators
on Numeric Values
6.2.1 op:numeric-add
6.2.2 op:numeric-subtract
6.2.3 op:numeric-multiply
6.2.4 op:numeric-divide
6.2.5 op:numeric-integer-divide
6.2.6 op:numeric-mod
6.2.7 op:numeric-unary-plus
6.2.8 op:numeric-unary-minus
6.3 Comparison of Numeric Values
6.3.1 op:numeric-equal
6.3.2 op:numeric-less-than
6.3.3 op:numeric-greater-than
6.4 Functions on
Numeric Values
6.4.1 fn:floor
6.4.2 fn:ceiling
6.4.3 fn:round
6.4.4 fn:round-half-to-even
7 Functions on Strings
7.1 String
Types
7.2 Functions to
Assemble and Disassemble Strings
7.2.1 fn:codepoints-to-string
7.2.2 fn:string-to-codepoints
7.3 Equality and Comparison of
Strings
7.3.1 fn:compare
7.4 Functions on
String Values
7.4.1 fn:concat
7.4.2 fn:string-join
7.4.3 fn:starts-with
7.4.4 fn:ends-with
7.4.5 fn:contains
7.4.6 fn:substring
7.4.7 fn:string-length
7.4.8 fn:substring-before
7.4.9 fn:substring-after
7.4.10 fn:normalize-space
7.4.11 fn:normalize-unicode
7.4.12 fn:upper-case
7.4.13 fn:lower-case
7.4.14 fn:translate
7.4.15 fn:string-pad
7.4.16 fn:escape-uri
7.5 String
Functions that Use Pattern Matching
7.5.1 Regular Expression Syntax
7.5.2 fn:matches
7.5.3 fn:replace
7.5.4 fn:tokenize
8 Functions and Operators on
Booleans
8.1 Boolean
Constructor Functions
8.1.1 fn:true
8.1.2 fn:false
8.2 Operators on
Boolean Values
8.2.1 op:boolean-equal
8.2.2 op:boolean-less-than
8.2.3 op:boolean-greater-than
8.3 Functions on
Boolean Values
8.3.1 fn:not
9 Functions and Operators on
Durations, Dates and Times
9.1 Duration, Date
and Time Types
9.1.1 CONFORMANCE NOTE
9.2 Two
Totally Ordered Subtypes of Duration
9.2.1 xdt:yearMonthDuration
9.2.2 xdt:dayTimeDuration
9.3 Comparisons of Duration, Date
and Time Values
9.3.1 op:yearMonthDuration-equal
9.3.2 op:yearMonthDuration-less-than
9.3.3 op:yearMonthDuration-greater-than
9.3.4 op:dayTimeDuration-equal
9.3.5 op:dayTimeDuration-less-than
9.3.6 op:dayTimeDuration-greater-than
9.3.7 op:dateTime-equal
9.3.8 op:dateTime-less-than
9.3.9 op:dateTime-greater-than
9.3.10 op:date-equal
9.3.11 op:date-less-than
9.3.12 op:date-greater-than
9.3.13 op:time-equal
9.3.14 op:time-less-than
9.3.15 op:time-greater-than
9.3.16 op:gYearMonth-equal
9.3.17 op:gYear-equal
9.3.18 op:gMonthDay-equal
9.3.19 op:gMonth-equal
9.3.20 op:gDay-equal
9.4 Component
Extraction Functions on Duration, Date and Time
Values
9.4.1 fn:get-years-from-yearMonthDuration
9.4.2 fn:get-months-from-yearMonthDuration
9.4.3 fn:get-days-from-dayTimeDuration
9.4.4 fn:get-hours-from-dayTimeDuration
9.4.5 fn:get-minutes-from-dayTimeDuration
9.4.6 fn:get-seconds-from-dayTimeDuration
9.4.7 fn:get-year-from-dateTime
9.4.8 fn:get-month-from-dateTime
9.4.9 fn:get-day-from-dateTime
9.4.10 fn:get-hours-from-dateTime
9.4.11 fn:get-minutes-from-dateTime
9.4.12 fn:get-seconds-from-dateTime
9.4.13 fn:get-timezone-from-dateTime
9.4.14 fn:get-year-from-date
9.4.15 fn:get-month-from-date
9.4.16 fn:get-day-from-date
9.4.17 fn:get-timezone-from-date
9.4.18 fn:get-hours-from-time
9.4.19 fn:get-minutes-from-time
9.4.20 fn:get-seconds-from-time
9.4.21 fn:get-timezone-from-time
9.5 Arithmetic Functions on
xdt:yearMonthDuration and xdt:dayTimeDuration
9.5.1 op:add-yearMonthDurations
9.5.2 op:subtract-yearMonthDurations
9.5.3 op:multiply-yearMonthDuration
9.5.4 op:divide-yearMonthDuration
9.5.5 op:add-dayTimeDurations
9.5.6 op:subtract-dayTimeDurations
9.5.7 op:multiply-dayTimeDuration
9.5.8 op:divide-dayTimeDuration
9.6 Timezone Adjustment on dateTime,
date and time Values
9.6.1 fn:adjust-dateTime-to-timezone
9.6.2 fn:adjust-date-to-timezone
9.6.3 fn:adjust-time-to-timezone
9.7 Adding and Subtracting Durations
From dateTime, date and time
9.7.1 fn:subtract-dateTimes-yielding-yearMonthDuration
9.7.2 fn:subtract-dateTimes-yielding-dayTimeDuration
9.7.3 op:subtract-dates
9.7.4 op:subtract-times
9.7.5 op:add-yearMonthDuration-to-dateTime
9.7.6 op:add-dayTimeDuration-to-dateTime
9.7.7 op:subtract-yearMonthDuration-from-dateTime
9.7.8 op:subtract-dayTimeDuration-from-dateTime
9.7.9 op:add-yearMonthDuration-to-date
9.7.10 op:add-dayTimeDuration-to-date
9.7.11 op:subtract-yearMonthDuration-from-date
9.7.12 op:subtract-dayTimeDuration-from-date
9.7.13 op:add-dayTimeDuration-to-time
9.7.14 op:subtract-dayTimeDuration-from-time
10 Functions Related to QNames
10.1 Constructor
Functions for QNames
10.1.1 fn:resolve-QName
10.1.2 fn:expanded-QName
10.2 Functions
Related to QNames
10.2.1 op:QName-equal
10.2.2 fn:get-local-name-from-QName
10.2.3 fn:get-namespace-from-QName
10.2.4 fn:get-namespace-uri-for-prefix
10.2.5 fn:get-in-scope-namespaces
11 Functions and Operators for
anyURI
11.1 fn:resolve-uri
11.2 op:anyURI-equal
11.2.1 Examples
12 Functions and Operators on base64Binary
and hexBinary
12.1 Comparisons
of base64Binary and hexBinary Values
12.1.1 op:hexBinary-equal
12.1.2 op:base64Binary-equal
13 Functions and Operators on
NOTATION
13.1 Operators on
NOTATION
13.1.1 op:NOTATION-equal
14 Functions and Operators on
Nodes
14.1 Functions and
Operators on Nodes
14.1.1 fn:name
14.1.2 fn:local-name
14.1.3 fn:namespace-uri
14.1.4 fn:number
14.1.5 fn:lang
14.1.6 op:node-equal
14.1.7 op:node-before
14.1.8 op:node-after
14.1.9 fn:root
15 Functions and Operators on
Sequences
15.1 Functions and
Operators on Sequences
15.1.1 fn:zero-or-one
15.1.2 fn:one-or-more
15.1.3 fn:exactly-one
15.1.4 fn:boolean
15.1.5 op:concatenate
15.1.6 fn:item-at
15.1.7 fn:index-of
15.1.8 fn:empty
15.1.9 fn:exists
15.1.10 fn:distinct-nodes
15.1.11 fn:distinct-values
15.1.12 fn:insert-before
15.1.13 fn:remove
15.1.14 fn:subsequence
15.1.15 fn:unordered
15.2 Equals,
Union, Intersection and Except
15.2.1 fn:deep-equal
15.2.2 fn:sequence-node-identical
15.2.3 op:union
15.2.4 op:intersect
15.2.5 op:except
15.3 Aggregate
Functions
15.3.1 fn:count
15.3.2 fn:avg
15.3.3 fn:max
15.3.4 fn:min
15.3.5 fn:sum
15.4 Functions that Generate
Sequences
15.4.1 op:to
15.4.2 fn:id
15.4.3 fn:idref
15.4.4 fn:doc
15.4.5 fn:collection
15.4.6 fn:input
16 Context Functions
16.1 fn:context-item
16.2 fn:position
16.3 fn:last
16.4 fn:current-dateTime
16.4.1 Examples
16.5 fn:current-date
16.5.1 Examples
16.6 fn:current-time
16.6.1 Examples
16.7 fn:default-collation
16.8 fn:implicit-timezone
17 Casting Functions
17.1 Casting from
primitive types to primitive types
17.2 Casting to derived
types
17.3 Casting from derived
types to parent types
17.4 Casting within a branch of the
type hierarchy
17.5 Casting across the type
hierarchy
17.6 Casting from xs:string,
xdt:untypedAtomic and xs:anySimpleType
17.7 Casting to xs:string,
xs:anySimpleType and xdt:untypedAtomic
17.8 Casting to numeric
types
17.9 Casting to duration
types
17.10 Casting to date and time
types
17.11 Casting to xs:boolean
17.12 Casting to
xs:base64Binary and xs:hexBinary
17.13 Casting to xs:anyURI
17.14 Casting to xs:QName
17.14.1 Usage Note
17.15 Casting to xs:NOTATION
A References
A.1 Normative
A.2 Non-normative
B Compatibility with XPath
1.0 (Non-Normative)
C Illustrative User-written Functions
(Non-Normative)
C.1 eg:if-empty and
eg:if-absent
C.1.1 eg:if-empty
C.1.2 eg:if-absent
C.2 union, intersect and
except on sequences of values
C.2.1 eg:value-union
C.2.2 eg:value-intersect
C.2.3 eg:value-except
C.3 eg:index-of-node
C.4 Working With xs:duration
Values
D Functions and Operators Issues List
(Non-Normative)
E ChangeLog since Last Public Version on
2002-11-15 (Non-Normative)
F Function and Operator Quick
Reference (Non-Normative)
F.1 Functions and
Operators by Section
F.2 Functions and
Operators Alphabetically
[XML Schema Part 2: Datatypes]
defines a number of primitive and derived datatypes,
collectively known as built-in datatypes. This document
defines operations on these datatypes as well as the two
datatypes defined in 1.3
xdt:anyAtomicType and xdt:untypedAtomic and the two
totally ordered subtypes of xs:duration
defined in 9.2 Two Totally
Ordered Subtypes of Duration, for use in XQuery,
XPath, XSLT and related XML standards. This document also
discusses operators and functions on nodes and node
sequences as defined in the [XQuery
1.0 and XPath 2.0 Data Model] for use in XQuery, XPath,
XSLT and other related XML standards.
The terminology used to describe the functions and operators on [XML Schema Part 2: Datatypes] is defined in the body of this specification. The terms defined in the following list are used in building those definitions:
A feature of this specification included to ensure that implementations that use this feature remain compatible with [XPath 1.0]
Conforming documents and processors are permitted to, but need not, behave as described.
Conforming documents and processors are required to behave as described; otherwise, they are non-conformant or in error.
Possibly differing between implementations, but specified by the implementor for each particular implementation.
Possibly differing between implementations, but not specified by this or other W3C specification, and not required to be specified by the implementor for any particular implementation.
Most of the functions in the core library have the
property that calling the same function twice with
the same arguments returns the same result: these
functions are said to be stable. This category
includes a number of functions such as fn:doc(), fn:collection(),
fn:input(), fn:current-dateTime(),
fn:current-date
and fn:current-time()
whose result depends on the external environment.
Where the function returns nodes, stability means
that the returned nodes are identical, not merely
equal. The scope over which the results are stable
depends on the processing context. In XSLT, it
applies to any two calls on the function executed
during the same transformation. In XQuery, it applies
to any two calls executed during the evaluation of a
top-level expression i.e. an expression not contained
in any other expression. In other contexts, the scope
is specified by the host environment that invokes the
function library.
Some other functions, for example fn:position()
and fn:last(),
have an explicit dependency on the dynamic context,
and may therefore produce different results each time
they are called. These functions are said to be
contextual.
The diagram below shows the built-in [XML Schema Part 2: Datatypes]. Solid lines connect a base datatype above to a derived datatype below. Dashed lines connect a datatype created as a list of an item type above.
Diagram courtesy Asir Vedamuthu, webMethods and Jim Melton, Oracle
The abstract datatype xdt:anyAtomicType is a
child of xs:anySimpleType and is the base type
for all the primitive atomic types described in [XML Schema Part 2: Datatypes].
This datatype cannot be used in [XML
Schema Part 1: Structures] type declarations, nor
can it be used as a base for user-defined atomic types.
It can be used in the [XQuery 1.0: An
XML Query Language] SequenceType production to
define a required type (for example in a function
signature) to indicate that any of the primitive atomic
types or xdt:untypedAtomic is acceptable.
This datatype resides in the namespace
http://www.w3.org/2003/05/xpath-datatypes.
The abstract datatype xdt:untypedAtomic is a
child of xdt:anyAtomicType and serves as a
special type annotation to indicate atomic values that
have not been validated by a XML Schema or a DTD or
have received an instance type annotation of
xs:anySimpleType in the PSVI. This
datatype cannot be used in [XML
Schema Part 1: Structures] type declarations, nor
can it be used as a base for user-defined atomic types.
It can be used in the [XQuery 1.0: An
XML Query Language] SequenceType production to
define a required type (for example in a function
signature) to indicate that only an untyped atomic
value is acceptable. This datatype resides in the
namespace
http://www.w3.org/2003/05/xpath-datatypes.
xs:dateTime, xs:date and
xs:time values are represented in the [XQuery 1.0 and XPath 2.0 Data
Model] as tuples: a normalized value with timezone
Z and a timezone represented as a
xdt:dayTimeDuration value. Lexical
representations of xs:dateTime,
xs:date and xs:time that have a
timezone are converted to timezone Z as
defined by [XML Schema Part 2:
Datatypes] and the timezone in the lexical
representation is converted to a
xdt:dayTimeDuration value. Lexical
representations that do not contain a timezone are given
a normalized value with the timezone Z and
the timezone part of the value set to the empty sequence
"()".
The purpose of this document is to catalog the functions and operators required for XPath 2.0, XML Query 1.0 and XSLT 2.0. The exact syntax used to invoke these functions and operators is specified in [XPath 2.0], [XQuery 1.0: An XML Query Language] and [XSLT 2.0].
In general, the specifications named above do not
support function overloading. Consequently, there are no
overloaded functions in this document except for legacy
[XPath 1.0] functions such as
string(), which takes a single argument of a
variety of types, and concat() which takes a
variable number of xs:string arguments. In
addition, the functions defined in 6 Functions and Operators on
Numerics that take numeric arguments take
arguments of type xs:integer,
xs:decimal, xs:float or
xs:double. Operators such as "+" may be
overloaded.
This document defines a few new datatypes, constructor functions and functions that take typed values as arguments. Some of the functions back up operators defined in [XQuery 1.0: An XML Query Language]. Each function is defined by specifying its signature, a description of each of its arguments and its semantics. For many functions, examples are included to illustrate their use.
Each function's signature is presented in a form like this:
fn:function-name($parameter-name as parameter-type, ...) as return-type
In this notation, function-name is the
name of the function whose signature is being specified.
If the function takes no parameters, then the name is
followed by an empty set of parentheses:
"()"; otherwise, the name is followed by a
parenthesized list of parameter declarations, each
declaration specifying the static type of the parameter
and a non-normative name used to describe the function's
semantics. If there are two or more parameter
declarations, they are separated by a comma. The
return-type specifies the static type of the
value returned by the function. In most cases, the
dynamic type returned by the function is the same as its
static type.
For most functions there is a paragraph describing what the function does followed by semantic rules. These rules are meant to be followed in the order that they appear in this document.
In some cases, the dynamic type returned by a function depends on the type(s) of its argument(s). These special functions are indicated by using bold italics for the return type. The semantic rules specifying the type of the value returned are documented in the function definition. The rules are described more formally in Section 6.2 of [XQuery 1.0 and XPath 2.0 Formal Semantics].
The function name is a QName as defined
in [XML 1.0 Recommendation (Second
Edition)] and must adhere to its syntactic
conventions. Following [XPath 1.0],
function names are composed of English words separated by
hyphens,"-". If a function name contains a [XML Schema Part 2: Datatypes]
datatype name, it may have intercapitalized spelling and
is used in the function name as such. For example, fn:get-timezone-from-dateTime.
As is customary, the parameter type name indicates that the function accepts arguments of that type, or types derived from it, in that position. This is called subtype substitution. Details of the semantics of passing parameters to functions are discussed in Appendix B of [XQuery 1.0: An XML Query Language].
Some functions accept the empty sequence as an
argument and some may return the empty sequence. This is
indicated in the function signature by following the
parameter or return type name with a question mark:
"?"
fn:function-name($parameter-name as parameter-type?) as return-type?
The functions and operators discussed in this document
are contained in one of three namespaces (see [Namespaces in XML]) and
referenced using a QName. Constructor functions for the
built-in datatypes defined in [XML
Schema Part 2: Datatypes] discussed in 5 Constructor
Functions are in the XML Schema namespace and
named in this document using the xs: prefix.
The namespace prefix used in this document is
fn: for the functions available to users and
op: for the operator functions.The functions
indicated by the op: prefix back up
operators in the host languages and are not directly
accessible by the user.
The datatypes described in this document are contained
in a fourth namespace and are named using the prefix
xdt:.
The namespace prefix for these functions and datatypes can vary, as long as the prefix is bound to the correct URI.
The URIs of the namespaces are:
http://www.w3.org/2001/XMLSchema for
constructors
http://www.w3.org/2003/05/xpath-operators
for operators
http://www.w3.org/2003/05/xpath-functions
for functions.
http://www.w3.org/2003/05/xpath-datatypes
for the datatypes.
The functions defined with an fn: prefix
are callable by the user. Functions defined with the
op: prefix are described here to underpin
the definitions of the operators in [XPath 2.0], [XQuery
1.0: An XML Query Language] and [XSLT 2.0]. These functions are not
available directly to users, and there is no requirement
that implementations should actually provide these
functions. For example, multiplication is generally
associated with the * operator, but it is
described as a function in this document. For
example:
op:multiply($operand1 as numeric, $operand2 as numeric) as numeric
The [XQuery 1.0 and XPath 2.0 Data Model] describes accessors on different types of nodes and defines their semantics. Some of these accessors are exposed to the user through the functions described below.
| Function | Accessor | Accepts | Returns |
|---|---|---|---|
fn:node-kind |
node-kind |
any kind of node | xs:string |
fn:node-name |
node-name |
any kind of node | zero or one
xs:QName |
fn:string |
string-value |
item | xs:string |
fn:data |
typed-value |
zero or more nodes | a sequence of atomic values |
fn:base-uri |
base-uri |
Element, document or PI node or no argument | zero or one
xs:string |
fn:document-uri |
document-uri |
Node | zero or one
xs:string |
fn:node-kind($srcval as node) as xs:string
This function returns a xs:string
representing the node's kind: either "document",
"element", "attribute", "text", "namespace",
"processing-instruction", or "comment".
fn:node-name($srcval as node) as xs:QName?
This function returns an expanded-QName for node kinds that can have names. For other node kinds, it returns the empty sequence. Expanded-QName is defined in [XQuery 1.0 and XPath 2.0 Data Model], and consists of a pair of values: a namespace URI and a local name.
fn:string() as xs:string
fn:string($srcval as item?) as xs:string
Returns the value of $srcval represented
as a xs:string. If no argument is supplied,
$srcval defaults to the context item
(.).
If $srcval is the empty sequence, the
zero-length string is returned.
If $srcval is a node, the function
returns the string-value of the node, as obtained using
the string-value accessor defined in the [XQuery 1.0 and XPath 2.0 Data
Model].
If $srcval is an atomic value, then the
function returns the same string as is returned by the
expression cast as xs:string ($srcval),
except in the cases listed below:
If the type of $srcval is
xs:anyURI, the URI is converted to a
string without any escaping of special
characters.
Note:
The reason for the special rule for
xs:anyURI is that, although XML Schema
strongly discourages the use of spaces within URI
values, the escaping of spaces can cause problems with
legacy applications (for example, this applies to
spaces within fragment identifiers in many HTML
browsers), and should therefore be under user
control.
Note:
The string representation of xs:double
values is not backwards-compatible with the
representation of number values in [XPath 1.0]. Ordinary
xs:double values are now represented using
scientific notation; the representations of positive
and negative infinity are now 'INF' and '-INF' rather
than 'Infinity' and '-Infinity'. (It should be observed
that '+INF' is not supported as a lexical form of
infinity in [XML Schema Part 2:
Datatypes] and is thus not supported by this
specification; if that lexical form is added in a
future version of [XML Schema Part
2: Datatypes], then it will be supported by a
future version of this specification that aligns with
that future version of [XML Schema
Part 2: Datatypes].) However, most expressions that
would have produced a number in [XPath 1.0] will produce a decimal
(or integer) in [XPath 2.0], so
unless there is a loss of precision caused by numeric
approximation, the result of the expression will in
most simple cases be the same after conversion to a
string.
fn:data($srcval as item*) as xdt:anyAtomicType*
fn:data takes a sequence of items and
returns a sequence of atomic values.
The result of fn:data is the sequence of
atomic values produced by applying the following rules to
each item in $srcval:
If the item is an atomic value, it is returned.
If the item is a node, fn:data()
returns the typed value of the node as defined by the
accessor function dm:typed-value in [XQuery 1.0 and XPath 2.0 Data
Model].
fn:base-uri($srcval as node) as xs:string?
Returns the value of the base-uri property for
$srcval as defined by the accessor function
dm:base-uri for that kind of node in [XQuery 1.0 and XPath 2.0 Data
Model]. Document, element and processing-instruction
nodes have a base-uri property. If that property is
non-empty, its value is returned. The base-uri of all
other node types is the empty sequence.
If the accessor is called on a node that does not have a base-uri property, or whose base-uri property is empty, the base-uri of that node's parent is returned. If the node has no parent, the empty sequence is returned.
fn:base-uri() as xs:string?
This version of the function returns the value of the base-uri property from the static context using the preceding rules.
fn:document-uri($srcval as node) as xs:string?
Returns the value of the document-uri property for
$srcval as defined by the accessor function
dm:document-uri in [XQuery 1.0 and XPath 2.0 Data
Model]. The empty sequence is returned if the node
does not have a document-uri property or if the
document-uri property is a relative URI. Otherwise,
returns an absolute URI expressed as an
xs:string.
If the document-uri property of $srcval
is not the empty sequence, then the following expression
always holds:
fn:doc(fn:document-uri($srcval)) is $srcval
In this document, as well as in [XQuery 1.0: An XML Query Language], [XPath 2.0],and [XQuery 1.0 and XPath 2.0 Formal
Semantics], the phrase "an error is raised" is used
whenever the semantics being described encounter an error.
The occurrence of that phrase implicitly causes the
invocation of the fn:error function defined in
this section. Whenever the raising of an error is
accompanied by a specific error, the phrase "an error is
raised (name-of-error)" is used, and the value
name-of-error is passed as an argument to the
fn:error function invocation. Invocation of
this function causes the evaluation phase of the outermost
XQuery or transformation to be terminated. For a more
detailed treatment of error handing see section 2.5.1 of [XQuery 1.0: An XML Query Language] and
section 6.2.1 of [XQuery 1.0
and XPath 2.0 Formal Semantics].
The fn:error function may also be invoked
from XQuery and XPath 2.0 applications.
fn:error() as none
fn:error($srcval as item?) as none
The fn:error function accepts any item
(e.g., an atomic value or an element) as an argument. An
alternate version of the function takes no arguments. The
fn:error function never returns a value.
Note that "none" is a special type defined in the [XQuery 1.0 and XPath 2.0 Formal Semantics] and is not available to the user. It indicates that the function never returns and ensures that it has the correct static type.
This function is intended to be used in debugging queries by providing a trace of their execution.
fn:trace($value as item*, $label as xs:string) as item*
The input $value is returned, unchanged, as
the result of the function. In addition, the inputs
$value and $label are directed to
a trace data set. The location and format of the trace data
set are ·implementation defined·. The ordering of output
from invocations of the fn:trace() function is
·implementation defined·.
Consider a situation in which a user wants to
investigate the actual value passed to a function.
Assume that in a particular execution,
$v is an xs:decimal with
value 124.84. Writing fn:trace($v,
'the value of $v is:') will put the strings
"124.84" and "the value of $v
is" in the trace data set in implementation
defined order.
Every built-in atomic type that is defined in [XML Schema Part 2: Datatypes],
except xs:NOTATION, as well as
xdt:untypedAtomic and the two derived types
xdt:yearMonthDuration and
xdt:dayTimeDuration defined in this
specification, has an associated constructor function.
The form of that function for a type pref:TYPE
is:
pref:TYPE($srcval as xdt:anyAtomicType) as pref:TYPE
For example, the signature of the constructor function
corresponding to the xs:unsignedInt type
defined in [XML Schema Part 2:
Datatypes] is:
xs:unsignedInt($srcval as xdt:anyAtomicType) as xs:unsignedInt
Invoking the constructor function
xs:unsignedInt(12) returns the
xs:unsignedInt value 12. Another invocation
of that constructor function that returns the same
xs:unsignedInt value is
xs:unsignedInt("12"). The same result would
also be returned if the constructor function were to be
invoked with a node that had a value equal to the
xs:unsignedInt 12. The standard features
described in [XQuery 1.0: An XML Query
Language] would 'atomize' the node to extract its
value and then call the constructor with that value. If
the value passed to a constructor is illegal for the
datatype to be constructed, an error is raised ("Illegal
value for constructor").
If the argument to a constructor function is a string
literal, the literal must be a valid lexical form for its
type, as specified in [XML Schema Part
2: Datatypes] and the semantics of the function are
identical to XML Schema validation. In the case of
xs:dateTime, xs:date and
xs:time, the value returned differs from [XML Schema Part 2: Datatypes] and is
defined in 1.4
xs:dateTime, xs:date and xs:time values.
Whitespace normalization is applied before validation as
indicated by the value of the whitespace facet for the
datatype.
If the argument to a constructor function is a literal, the result of the function may be evaluated statically; if an error is found during such evaluation, it may be reported as a static error.
The semantics of the constructor function
xs:TYP(xdt:anyAtomicType) are identical to
the semantics of "cast as xs:TYP
(xdt:anyAtomicType)". See 17 Casting Functions
The following constructor functions for the built-in types are supported:
xs:string($srcval as xdt:anyAtomicType) as xs:string
xs:boolean($srcval as xdt:anyAtomicType) as xs:boolean
xs:decimal($srcval as xdt:anyAtomicType) as xs:decimal
xs:float($srcval as xdt:anyAtomicType) as xs:float
Implementations ·may· return negative zero
for xs:float(-0.0E0).
xs:double($srcval as xdt:anyAtomicType) as xs:double
Implementations ·may· return negative zero
for xs:double(-0.0E0).
xs:duration($srcval as xdt:anyAtomicType) as xs:duration
xs:dateTime( |
$srcval |
as xdt:anyAtomicType) as (xs:dateTime,
xdt:dayTimeDuration) |
xs:time($srcval as xdt:anyAtomicType) as (xs:time,
xdt:dayTimeDuration)
xs:date($srcval as xdt:anyAtomicType) as (xs:date,
xdt:dayTimeDuration)
xs:gYearMonth($srcval as xdt:anyAtomicType) as xs:gYearMonth
xs:gYear($srcval as xdt:anyAtomicType) as xs:gYear
xs:gMonthDay($srcval as xdt:anyAtomicType) as xs:gMonthDay
xs:gDay($srcval as xdt:anyAtomicType) as xs:gDay
xs:gMonth($srcval as xdt:anyAtomicType) as xs:gMonth
xs:hexBinary($srcval as xdt:anyAtomicType) as xs:hexBinary
xs:base64Binary($srcval as xdt:anyAtomicType) as xs:base64Binary
xs:anyURI($srcval as xdt:anyAtomicType) as xs:anyURI
xs:anyURI($srcval as xdt:anyAtomicType) as xs:QName
See 17.14 Casting
to xs:QName for semantics of
xs:anyURI.
xs:normalizedString($srcval as xdt:anyAtomicType) as xs:normalizedString
xs:token($srcval as xdt:anyAtomicType) as xs:token
xs:language($srcval as xdt:anyAtomicType) as xs:language
xs:NMTOKEN($srcval as xdt:anyAtomicType) as xs:NMTOKEN
xs:Name($srcval as xdt:anyAtomicType) as xs:Name
xs:NCName($srcval as xdt:anyAtomicType) as xs:NCName
xs:ID($srcval as xdt:anyAtomicType) as xs:ID
xs:IDREF($srcval as xdt:anyAtomicType) as xs:IDREF
xs:ENTITY($srcval as xdt:anyAtomicType) as xs:ENTITY
xs:integer($srcval as xdt:anyAtomicType) as xs:integer
xs:nonPositiveInteger($srcval as xdt:anyAtomicType) as xs:nonPositiveInteger
xs:negativeInteger($srcval as xdt:anyAtomicType) as xs:negativeInteger
xs:long($srcval as xdt:anyAtomicType) as xs:long
xs:int($srcval as xdt:anyAtomicType) as xs:int
xs:short($srcval as xdt:anyAtomicType) as xs:short
xs:byte($srcval as xdt:anyAtomicType) as xs:byte
xs:nonNegativeInteger($srcval as xdt:anyAtomicType) as xs:nonNegativeInteger
xs:unsignedLong($srcval as xdt:anyAtomicType) as xs:unsignedLong
xs:unsignedInt($srcval as xdt:anyAtomicType) as xs:unsignedInt
xs:unsignedShort($srcval as xdt:anyAtomicType) as xs:unsignedShort
xs:unsignedByte($srcval as xdt:anyAtomicType) as xs:unsignedByte
xs:positiveInteger($srcval as xdt:anyAtomicType) as xs:positiveInteger
xdt:yearMonthDuration($srcval as xdt:anyAtomicType) as xdt:yearMonthDuration
xdt:dayTimeDuration($srcval as xdt:anyAtomicType) as xdt:dayTimeDuration
xdt:untypedAtomic($srcval as xdt:anyAtomicType) as xdt:untypedAtomic
For every globally-defined atomic type in the static context (See [XQuery 1.0: An XML Query Language] that is derived by restriction from a primitive type, there is a constructor function (whose name is the same as the name of the type) whose effect is to create a value of that type from the supplied argument. The rules are defined in the same way as for built-in derived types as discussed in 5.1 Constructor Functions for XML Schema Built-in Types.
Consider a situation where the static context contains
a type called hatSize defined in a schema
that is bound to the prefix my. In such a
case the constructor function:
my:hatSize($srcval as xdt:anyAtomicType) as my:hatSize
is available to users.
This section discusses arithmetic operators on the numeric datatypes defined in [XML Schema Part 2: Datatypes]. It uses an approach that permits lightweight implementation whenever possible.
The operators described in this section are defined on the following numeric types. Each type whose name is indented is derived from the type whose name appears nearest above with one less level of indent.
| xs:decimal | |
| xs:integer | |
| xs:float | |
| xs:double |
They also apply to types derived by restriction from these types.
Note:
The value space for xs:float and
xs:double, as defined in the errata to [XML Schema Part 2: Datatypes],
defines only a single zero. [IEEE
754-1985] arithmetic, however, can produce distinct
results of positive zero and negative zero. The value
space for atomic values of type xs:float
and xs:double, as defined in this suite of
documents, contains this extra value of negative zero
which compares equal to positive zero. The value
negative zero will never be obtained from the typed
value of a node. However, negative zero may be produced
as the result of a computation; for example, the unary
minus operator produces negative zero if its operand is
positive zero.
The following functions are defined to back up operators defined in [XQuery 1.0: An XML Query Language] and [XPath 2.0] on these numeric types.
| Operators | Meaning |
|---|---|
op:numeric-add |
Addition |
op:numeric-subtract |
Subtraction |
op:numeric-multiply |
Multiplication |
op:numeric-divide |
Division |
op:numeric-integer-divide |
Integer division |
op:numeric-mod |
Modulus |
op:numeric-unary-plus |
Unary plus |
op:numeric-unary-minus |
Unary minus (negation) |
The arguments and return types for the arithmetic
operators are the basic numeric types:
xs:integer, xs:decimal,
xs:float and xs:double, and
types derived from them. For simplicity, each operator is
defined to operate on operands of the same type and to
return the same type. The one exception is op:numeric-divide,
which returns an xs:decimal if called with
two xs:integer operands.)
Operands of type xdt:untypedAtomic are
converted to xs:double, except for arguments
to 6.2.5
op:numeric-integer-divide which are converted to
xs:integer. If the two operands are not of
the same type, subtype substitution and type
promotion may be used to obtain two operands of the
same type. Appendix B of [XQuery 1.0:
An XML Query Language] describes the semantics of
these operations in detail.
Subtype substitution: A derived type may
substitute for its base type. In particular,
xs:integer may be used where
xs:decimal is expected.
Type promotion: xs:decimal
may be promoted to xs:float, and
xs:float may be promoted to
xs:double.
The result type of operations depends on their argument datatypes and is defined in the following table:
| Operator | Returns |
|---|---|
op:operation(xs:integer,
xs:integer) |
xs:integer
(except for op:numeric-divide(integer,
integer), which returns
xs:decimal) |
op:operation(xs:decimal,
xs:decimal) |
xs:decimal |
op:operation(xs:float, xs:float) |
xs:float |
op:operation(xs:double, xs:double) |
xs:double |
op:operation(xs:integer) |
xs:integer |
op:operation(xs:decimal) |
xs:decimal |
op:operation(xs:float) |
xs:float |
op:operation(xs:double) |
xs:double |
These rules define any operation on any pair of arithmetic types. Consider the following example:
op:operation(xs:int, xs:double) => op:operation(xs:double, xs:double)
For this operation, xs:int must be
converted to xs:double. This can be done,
since by the rules above: xs:int can be
substituted for xs:integer,
xs:integer can be promoted to
xs:decimal, xs:decimal can be
promoted to xs:float, and
xs:float can be promoted to
xs:double. As far as possible, the
promotions should be done in a single step. Specifically,
when a decimal is promoted to a double, it must not be
converted to a float and then to double, as this risks
loss of precision.
As another example, a user may define
height as a derived type of
xs:integer with a minimum value of 20 and a
maximum value of 100. He may then derive
oddHeight using a pattern to restrict the
value to odd integers.
op:operation(oddHeight, xs:integer) => op:operation(xs:integer, xs:integer)
oddHeight can be substituted for its base
type height and height can be
substituted for its base type
xs:integer.
On overflow and underflow situations during arithmetic operations conforming implementations ·must· behave as follows:
For xs:float and
xs:double operations, overflow behavior
·must· be conformant with [IEEE 754-1985]. This
specification allows a number of options:
Raising an error ("overflow on float or double operation") via an overflow trap.
Returning INF or
-INF.
Returning the largest (positive or negative) non-infinite number.
For xs:float and
xs:double operations, underflow behavior
·must· be conformant with [IEEE 754-1985]. This
specification allows a number of options:
Raising an error ("underflow on float or double operation") via an underflow trap.
Returning 0.0E0 or +/-
2**Emin or a denormalized value; where
Emin is the smallest possible
xs:float or xs:double
exponent.
For xs:decimal operations, overflow
behavior ·must· raise an error
("overflow on decimal operation"). On underflow,
0.0 must be returned.
For xs:integer operations,
implementations ·may· choose to always
raise an error ("overflow on integer operation").
Alternatively, implementations ·may· provide an ·implementation
defined·
mechanism that allows users to choose between raising
an error and returning a result that is modulo the
largest representable integer value. See [ISO 10967].
The functions op:numeric-add,
op:numeric-subtract,
op:numeric-multiply,
op:numeric-divide,
op:numeric-integer-divide
and op:numeric-mod
are each defined for pairs of numeric operands, each of
which has the same type: xs:integer,
xs:decimal, xs:float, or
xs:double. The functions op:numeric-unary-plus
and op:numeric-unary-minus
are defined for a single operand whose type is one of
those same numeric types.
For xs:float and xs:double
arguments, if either argument is NaN, the
result is NaN.
The number of digits of precision returned by various numeric functions is ·implementation dependent·.
op:numeric-add($operand1 as numeric, $operand2 as numeric) as numeric
Backs up the "+" operator and returns the arithmetic
sum of its operands: ($operand1 +
$operand2).
op:numeric-subtract($operand1 as numeric, $operand2 as numeric) as numeric
Backs up the "-" operator and returns the arithmetic
difference of its operands: ($operand1 -
$operand2).
op:numeric-multiply($operand1 as numeric, $operand2 as numeric) as numeric
Backs up the "*" operator and returns the arithmetic
product of its operands: ($operand1 *
$operand2).
op:numeric-divide($operand1 as numeric, $operand2 as numeric) as numeric
Backs up the "div" operator and returns the
arithmetic quotient of its operands: ($operand1
div $operand2).
As a special case, if the types of both
$operand1 and $operand2 are
xs:integer, then the return type is
xs:decimal.
For xs:decimal and
xs:integer operands, if the divisor is
0, then an error is raised ("Division by
zero"). For xs:float and
xs:double operands, floating point
division is performed as specified in [IEEE 754-1985] and
INF or -INF is returned if
the divisor is zero.
op:numeric-integer-divide( |
$operand1 |
as xs:integer, |
$operand2 |
as xs:integer) as xs:integer |
Backs up the "idiv" operator and returns the
arithmetic quotient of its operands: ($operand1
idiv $operand2). If the numerator is not evenly
divided by the divisor, then the quotient is the
xs:integer value obtained, ignoring any
remainder that results from the division (that is, no
rounding is performed).
If the divisor is 0, then an error is
raised ("Division by zero").
op:numeric-mod($operand1 as numeric, $operand2 as numeric) as numeric
Backs up the "mod" operator. Informally, this
function returns the remainder resulting from dividing
$operand1, the dividend, by
$operand2, the divisor. The operation
a mod b for operands that are
xs:integer or xs:decimal, or
types derived from them, produces a result such that
(a/b)*b+(a mod b) is equal to
a and the magnitude of the result is
always less than the magnitude of the divisor. This
identity holds even in the special case that the
dividend is the negative integer of largest possible
magnitude for its type and the divisor is -1 (the
remainder is 0). It follows from this rule that the
sign of the result is the sign of the dividend. If
$operand2 is 0, then an error
is raised ("Division by zero").
For xs:float and xs:double
operands the following rules apply:
If either operand is NaN, the
result is NaN.
If the dividend is positive or negative
infinity, or the divisor is positive or negative
zero (0), or both, the result is
NaN.
If the dividend is finite and the divisor is an infinity, the result equals the dividend.
If the dividend is positive or negative zero and the divisor is finite, the result is the same as the dividend.
In the remaining cases, where neither positive
or negative infinity, nor positive or negative
zero, nor NaN is involved, the result
obeys (a/b)*b+(a mod b) =
a. Division is truncating division,
analogous to integer division, not [IEEE 754-1985] rounding
division.
op:numeric-unary-plus($operand as numeric) as numeric
Backs up the unary "+" operator and returns its
operand with the sign unchanged: (+
$operand). Semantically, this operation
performs no operation.
op:numeric-unary-minus($operand as numeric) as numeric
Backs up the unary "-" operator and returns its
operand with the sign reversed: (-
$operand). If $operand is
positive, its negative is returned; if it is negative,
its positive is returned.
For xs:integer and
xs:decimal arguments, 0 and
0.0 return 0 and
0.0, respectively. For
xs:float and xs:double
arguments, NaN returns NaN,
0.0E0 returns -0.0E0 and vice
versa. INF and +INF return
-INF. -INF returns
INF.
This specification defines the following comparison
operators on numeric values. Comparisons take two
arguments of the same type. Arguments of type
xdt:untypedAtomic are converted to
xs:double. If the arguments are of different
types, one argument is promoted to the type of the other
as described above in 6.2
Operators on Numeric Values. Each comparison
operator returns a boolean value. If either, or both,
operands are NaN, false is
returned.
| Operator | Meaning |
|---|---|
op:numeric-equal |
Equality comparison |
op:numeric-less-than |
Less-than comparison |
op:numeric-greater-than |
Greater-than comparison |
op:numeric-equal($operand1 as numeric, $operand2 as numeric) as xs:boolean
Returns true if and only if the value of
$operand1 is equal to the value of
$operand2. For xs:float and
xs:double values, 0 (zero),
+0 (positive zero) and -0
(negative zero) all compare equal. NaN
does not equal itself.
This function backs up the "eq" and "ne" operators on numeric values.
op:numeric-less-than($operand1 as numeric, $operand2 as numeric) as xs:boolean
Returns true if and only if
$operand1 is less than
$operand2. For xs:float and
xs:double values, positive infinity is
greater than all other non-NaN values;
negative infinity is less than all other
non-NaN values. If $operand1
or $operand2 is NaN, the
function returns false.
This function backs up the "lt" and "ge" operators on numeric values.
op:numeric-greater-than( |
$operand1 |
as numeric, |
$operand2 |
as numeric) as xs:boolean |
Returns true if and only if
$operand1 is greater than
$operand2. For xs:float and
xs:double values, positive infinity is
greater than all other non-NaN values;
negative infinity is less than all other
non-NaN values. If $operand1
or $operand2 is NaN, the
function returns false.
This function backs up the "gt" and "le" operators on numeric values.
The following functions are defined on numeric types. Each function returns a value of the same type as the type of its argument.
If the argument is the empty sequence, the empty sequence is returned.
If the argument is xdt:untypedAtomic
it is converted to xs:double.
For xs:float and
xs:double arguments, if the argument is
"NaN", "NaN" is returned.
For xs:float and
xs:double arguments, if the argument is
positive or negative infinity, positive or negative
infinity is returned.
| Function | Meaning |
|---|---|
fn:floor |
Returns the largest number with no fractional part that is less than or equal to the argument. |
fn:ceiling |
Returns the smallest number with no fractional part that is greater than or equal to the argument. |
fn:round |
Rounds to the nearest number with no fractional part. |
fn:round-half-to-even |
Takes a number and a precision and returns a number rounded to the given precision. If the fractional part is exactly half, the result is the number whose least significant digit is even. |
fn:floor($srcval as numeric?) as numeric?
Returns a value of the same type as
$srcval. Specifically, returns the largest
(closest to positive infinity) number with no
fractional part that is not greater than the value of
$srcval.
For float and double
arguments, if the argument is positive zero (+0), then
positive zero (+0) is returned. If the argument is
negative zero (-0), then negative zero (-0) is
returned.
For detailed semantics, see section 6.2.6 of [XQuery 1.0 and XPath 2.0 Formal Semantics].
fn:ceiling($srcval as numeric?) as numeric?
Returns a value of the same type as
$srcval. Specifically, returns the
smallest (closest to negative infinity) number with no
fractional part that is not less than the value of
$srcval.
For xs:float and xs:double
arguments, if the argument is positive zero (+0), then
positive zero (+0) is returned. If the argument is
negative zero (-0), then negative zero (-0) is
returned. If the argument is less than zero (0), but
greater than or equal to -0.5, then negative zero (-0)
is returned.
For detailed semantics, see section 6.2.6 of [XQuery 1.0 and XPath 2.0 Formal Semantics].
fn:round($srcval as numeric?) as numeric?
Returns a value of the same type as
$srcval. Specifically, returns the number
with no fractional part that is closest to the
argument. If there are two such numbers, then the one
that is closest to positive infinity is returned. More
formally, fn:round(x) produces the same
result as fn:floor(x+0.5).
For xs:float and xs:double
arguments, if the argument is positive zero (+0), then
positive zero (+0) is returned. If the argument is
negative zero (-0), then negative zero (-0) is
returned. If the argument is less than zero (0), but
greater than or equal to -0.5, then negative zero (-0)
is returned.
For detailed semantics, see section 6.2.6 of [XQuery 1.0 and XPath 2.0 Formal Semantics].
fn:round-half-to-even($srcval as numeric?) as numeric?
fn:round-half-to-even($srcval as numeric?, $precision as integer) as numeric?
The first signature of this function produces the
same result as the second signature with
$precision=0.
Returns a value of the same type as
$srcval.
For arguments of type xs:float and
xs:double, if the argument is positive
zero (+0), then positive zero (+0) is returned. If the
argument is negative zero (-0), then negative zero (-0)
is returned.
The value returned is the nearest (that is,
numerically closest) numeric to $srcval
that is a multiple of ten to the power of minus
$precision. If two such values are equally
near (i.e. if the fractional part in
$srcval is exactly .500...), returns the
one whose least significant digit is even.
If $srcval is of type
xs:float or xs:double,
rounding occurs on the value of the mantissa computed
with exponent = 0.
For detailed semantics, see section 6.2.6 of [XQuery 1.0 and XPath 2.0 Formal Semantics].
fn:round-half-to-even(1.5)
returns the value corresponding to
2.
fn:round-half-to-even(2.5)
returns the value corresponding to
2.
fn:round-half-to-even(3.567812E+3,
2) returns the value corresponding to
3567.81E0.
fn:round-half-to-even(4.7564E-3,
2) returns the value corresponding to
0.0E0.
fn:round-half-to-even(35612.25,
-2) returns the value corresponding to
35600.
This section discusses functions and operators on the [XML Schema Part 2: Datatypes]
xs:string datatype and the datatypes derived
from it.
The operators described in this section are defined on the following types. Each type whose name is indented is derived from the type whose name appears nearest above with one less level of indent.
| xs:string | |||||
| xs:normalizedString | |||||
| xs:token | |||||
| xs:language | |||||
| xs:NMTOKEN | |||||
| xs:Name | |||||
| xs:NCName | |||||
| xs:ID | |||||
| xs:IDREF | |||||
| xs:ENTITY |
They also apply to user-defined types derived by restriction from these types.
Note:
This document uses the term "code point" as a synonym for "Unicode scalar value". [The Unicode Standard] sometimes spells this term "codepoint". Code points range from #x0000 to #x10FFFF inclusive, except for the range #xD800 to #xDFFF inclusive, which is the range reserved for surrogate pairs. The use of the word 'character' in this document is in the sense of production [2] of [XML 1.0 Recommendation (Second Edition)].
| Function | Meaning |
|---|---|
fn:codepoints-to-string |
Creates an
xs:string from a sequence of code
points. |
fn:string-to-codepoints |
Returns the sequence of
code points that constitute an
xs:string. |
fn:codepoints-to-string($srcval as xs:integer*) as xs:string
Creates an xs:string from a sequence of
code points. Returns the zero-length string if
$srcval is the empty sequence. If any of
the codepoints in $srcval is not a legal
XML character, an error is raised ("codepoint not
legal").
When values whose type is xs:string or a
type derived from xs:string are compared
(or, equivalently, sorted), the comparisons are
inherently performed according to some collation (even if
that collation is defined entirely on code point values
or on the binary representations of the characters of the
string). The [Character Model for the
World Wide Web 1.0] observes that some applications
may require different comparison and ordering behaviors
than other applications. Similarly, some users having
particular linguistic expectations may require different
behaviors than other users. Consequently, the collation
must be taken into account when comparing strings in any
context. Several functions in this and the following
section make use of a collation.
Collations can indicate that some characters that are rendered differently are, in fact, equal for collation purpose (e.g., "uve" and "uwe" are considered equivalent in some European languages). Strings can be compared character-by-character or in a logical manner, as defined by the collation.
Some collations, especially those based on the [Unicode Collation
Algorithm] can be "tailored" for various purposes.
This document does not discuss such tailoring. Instead,
it assumes that the collation argument to the various
functions below is a tailored and named collation. A
specific collation with a distinguished name,
http://www.w3.org/2003/05/xpath-functions/collation/codepoint,
provides the ability to compare strings based on code
point values. Every implementation of XQuery must support
the collation based on code point values.
While the [Character Model for the World Wide Web 1.0] recommends that all strings be subjected to early Unicode normalization, it is not possible to guarantee that all strings in all XML documents are, in fact, normalized, or that they are normalized in the same manner. In order to maximize interoperable results of operations on XML documents in general, there may be collations that operate on unnormalized strings, other collations that raise runtime errors when unnormalized strings are encountered, and still other collations that implicitly normalize strings for the purposes of collating them. For alignment with the [Character Model for the World Wide Web 1.0], applications may choose collations that treat unnormalized strings as though they were normalized (that is, that implicitly normalize the strings). Note that collations based on the Unicode collation algorithm produce equivalent results regardless of a string's normalization.
This specification assumes that collations are named
and that the collation name may be provided as an
argument to string functions. Functions that allow
specification of a collation do so with an argument whose
type is xs:string but whose lexical
representation must conform to xs:anyURI. If
the collation is specified using a relative URI, it is
assumed to be relative to the value of the base-uri
property in the static context. This specification also
defines the manner in which a default collation is
determined if the collation argument is not specified in
invocations of functions that use a collation but allow
it to be omitted.
The XQuery/XPath static context includes provision for a default collation that can be used for string comparisons (including ordering operations). However, the static context is not required to have a default collation specified; an implementation might choose to provide a default collation only under certain circumstances, or not at all. The static context default collation, if provided, is determined by ·implementation defined· means. Such means might include determination from the host operating system environment, determination during XQuery/XPath installation, determination when the XQuery/XPath implementation was created, determination from the locale of some user environment, or even ·implementation defined· language through which the user can specify that collation.
The decision of what collation to use for a given comparison or ordering operation is determined by the following algorithm:
If the operation specifies an explicit collation
CollationA (e.g., if the optional collation argument
is specified in an invocation of the fn:compare()
function), then:
If CollationA is supported by the implementation, then CollationA is used.
Otherwise, an error is raised ("Unsupported collation").
If no collation is explicitly specified for the operation and the XQuery/XPath static context specifies a collation CollationB, then:
If CollationB is supported by the implementation, then CollationB is used.
Otherwise, an error is raised ("Unsupported collation").
Note:
There might be several ways in which a collation might be specified in the XQuery/XPath static context. For example, XQuery might provide syntax that specifies a default collation as part of the query prolog.
Otherwise, the Unicode codepoint collation
(http://www.w3.org/2003/05/xpath-functions/collation/codepoint)
is used.
XML allows elements to specify the
xml:lang attribute to indicate the language
associated with the content of such an element. This
specification does not use xml:lang to
identify the default collation, in part because
collations should be determined by the user of the data,
not (normally) the data itself, and because using
xml:lang does not produce desired effects
when the two strings to be compared have different
xml:lang values or when a string is
multilingual.
Note:
Some data management environments allow collations to be associated with the definition of string items (that is, with the metadata that describes items whose type is string). While such association may be appropriate for use in environments in which data is held in a repository tightly bound to its descriptive metadata, it is not appropriate in the XML environment in which different documents being processed by a single query may be described by differing schemas.
Note:
All collations support the capability of deciding
whether two strings are considered equal, and if not,
which of the strings should be regarded as preceding
the other. For functions such as fn:compare(),
this is all that is required. For other functions, such
as fn:contains(),
the collation needs to support an additional property:
it must decompose the string into a sequence of units,
each unit consisting of one or more characters, such
that two strings can be compared by pairwise comparison
of these units. Functions such as fn:contains(),
fn:starts-with(),
fn:ends-with(),
fn:substring-before()
and fn:substring-after()
first use the collation to decompose the string
provided in the first argument into such a sequence of
units, then examine this sequence to determine if there
is a subsequence that matches the units obtained by
decomposing the string supplied in the second argument.
This might occasionally lead to surprises. For example,
consider a collation that treats "Jaeger" and
"Jäger" as equal. It might do this by treating
"ä" as representing two collation units, in which
case the expression fn:contains("Jäger",
"eg") will return true.
Alternatively, a collation might treat "ae" as a single
collation unit, in which case the expression fn:contains("Jaeger",
"eg") will return false. The
results of these functions thus depends strongly on the
properties of the collation that is used.
It is possible to define collations that do not have
this property, for example a collation that attempts to
sort "ISO 8859" before "ISO 10646", or "January" before
"February". Such collations may fail, or give unexpected
results, when used with functions such as fn:contains().
| Function | Meaning |
|---|---|
fn:compare |
Compares two
xs:strings; a collation may optionally
be specified |
fn:compare($comparand1 as xs:string?, $comparand2 as xs:string?) as xs:integer?
fn:compare( |
$comparand1 |
as xs:string?, |
$comparand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:integer? |
Returns -1, 0, or 1, depending on whether the value
of the $comparand1 is respectively less
than, equal to, or greater than the value of
$comparand2, according to the rules of the
collation that is used.
The collation used by the invocation of this function is determined according to the rules in 7.3 Equality and Comparison of Strings.
If $collationLiteral is not in the
lexical space of xs:anyURI, an error is
raised ("Invalid argument to compare function").
If the value of $comparand2 begins with
a string that is equal to the value of
$comparand1 (according to the collation
that is used) and has additional characters following
that beginning string, then the result is -1. If the
value of $comparand1 begins with a string
that is equal to the value of $comparand2
(according to the collation that is used) and has
additional characters following that beginning string,
then the result is 1.
If either argument is the empty sequence, the result is the empty sequence.
This function backs up the "eq", "ne", "gt", "lt", "le" and "ge" operators on string values.
fn:compare('abc', 'abc') returns
0.
fn:compare('Strasse',
'Straße') returns 0 if and only if
the default collation includes provisions that
equate "ss" and the (German) character "ß"
("sharp-s"). (Otherwise, the returned value
depends on the semantics of the default
collation.)
fn:compare('Strasse', 'Straße',
'deutsch') returns 0 if and only if the
collation identified by the relative URI
constructed from the string value
"deutsch" includes provisions that equate "ss"
and the (German) character "ß" ("sharp-s").
(Otherwise, the returned value depends on the
semantics of that collation.)
fn:compare('Strassen',
'Straße') returns 1 if and only if
the default collation includes provisions that
equate "ss" and the (German) character "ß"
("sharp-s"). (Since the value of
$comparand1 has an additional
character, an "n", following the string that is
equal to "Straße", it is greater than the
value of $comparand2.)
The following functions are defined on these string types. Several of these function use a collation. See 7.3 Equality and Comparison of Strings for a discussion of collations.
| Function | Meaning |
|---|---|
fn:concat |
Concatenates two or more
xs:strings. |
fn:string-join |
Accepts a sequence of
xs:strings and returns them concatenated
together using an optional separator. |
fn:starts-with |
Indicates whether the
value of one xs:string begins with the
characters in another xs:string. |
fn:ends-with |
Indicates whether the
value of one xs:string ends with the
characters in another xs:string. |
fn:contains |
Indicates whether one
xs:string contains another
xs:string. A collation may optionally be
specified. |
fn:substring |
Returns the
xs:string located at a specified place
in an xs:string. |
fn:string-length |
Returns the length of the argument. |
fn:substring-before |
Returns the characters of
one xs:string that precede in that
xs:string the characters in another
xs:string. A collation may optionally be
specified. |
fn:substring-after |
Returns the characters of
one xs:string that follow in that
xs:string the characters in another
xs:string. A collation may optionally be
specified. |
fn:normalize-space |
Returns the whitespace-normalized value of the argument. |
fn:normalize-unicode |
Returns the normalized value of the first argument in the normalization form specified by the second argument. |
fn:upper-case |
Returns the upper-cased value of the argument. |
fn:lower-case |
Returns the lower-cased value of the argument. |
fn:translate |
Returns the first
xs:string argument with occurrences of
characters in the second argument replaced by the
character at the corresponding position in the third
argument. |
fn:string-pad |
Returns an
xs:string composed of as many copies of
its first argument as specified in its second
argument. |
fn:escape-uri |
Returns the string
representing an xs:anyURI value with
certain characters escaped as specified in [RFC 2396] and [RFC 2732]. |
Note also that when the above operators and functions
are applied to datatypes derived from
xs:string, they are guaranteed to return
legal xs:strings, but they might not return
a legal value for the particular subtype to which they
were applied.
fn:concat() as xs:string
fn:concat($op1 as xs:string?) as xs:string
fn:concat($op1 as xs:string?, $op2 as xs:string?, ...) as xs:string
Accepts zero or more xs:strings as
arguments. Returns the xs:string that is
the concatenation of the values of its arguments. The
resulting xs:string might not be
normalized according to any Unicode or W3C
normalization form. If called with no arguments,
returns the zero-length string. If any of the arguments
is the empty sequence, it is treated as the zero-length
string.
The concat() function is specified to
allow an arbitrary number of xs:string
arguments that are concatenated together. This is the
only function specified in this document that has that
characteristic. This capability is retained for
compatibility with [XPath
1.0].
fn:string-join($operand1 as xs:string*, $operand2 as xs:string) as xs:string
Returns a (possibly empty) xs:string
created by concatenating the members of the
$operand1 sequence using
$operand2 as a separator. If the value of
$operand2 is the zero-length string, then
the members of $operand1 are concatenated
without a separator as in fn:concat().
If the value of $operand1 is the empty
sequence, the zero-length string is returned.
fn:string-join(('Now', 'is', 'the',
'time', '...'), " ") returns "Now is
the time ...".
fn:string-join(("abra", "cadabra"),
"") returns
"abracadabra".
fn:string-join((), "separator")
returns "".
Assume a document:
<doc>
<chap>
<section>
</section>
</chap>
</doc>
with the <section> as the
context node,
fn:string-join(for $n in
ancestor-or-self::* return name(.), '/')
returns "doc/chap/section"
fn:starts-with($operand1 as xs:string?, $operand2 as xs:string?) as xs:boolean?
fn:starts-with( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:boolean? |
Returns an xs:boolean indicating
whether or not the value of $operand1
starts with a string that is equal to the value of
$operand2 according to the collation that
is used.
If $collationLiteral is not in the
lexical space of xs:anyURI, an error is
raised ("Invalid collationURI").
If the value of $operand1 or
$operand2 is the empty sequence, the empty
sequence is returned.
If the value of $operand2 is the
zero-length string, then the function returns
true. If the value of
$operand1 is the zero-length string and
the value of $operand2 is not the
zero-length string, then the function returns
false.
The collation used by the invocation of this function is determined according to the rules in 7.3 Equality and Comparison of Strings.
fn:ends-with($operand1 as xs:string?, $operand2 as xs:string?) as xs:boolean?
fn:ends-with( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:boolean? |
Returns an xs:boolean indicating
whether or not the value of $operand1 ends
with a string that is equal to the value of
$operand2 according to the specified
collation.
If $collationLiteral is not in the
lexical space of xs:anyURI, an error is
raised ("Invalid collationURI").
If the value of $operand1 or
$operand2 is the empty sequence, the empty
sequence is returned.
If the value of $operand2 is the
zero-length string, then the function returns
true. If the value of
$operand1 is the zero-length string and
the value of $operand2 is not the
zero-length string, then the function returns
false.
The collation used by the invocation of this function is determined according to the rules in 7.3 Equality and Comparison of Strings.
fn:contains($operand1 as xs:string?, $operand2 as xs:string?) as xs:boolean?
fn:contains( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:boolean? |
If $collationLiteral is not in the
lexical space of xs:anyURI, an error is
raised ("Invalid collationURI").
If the value of $operand1 or
$operand2 is the empty sequence, the empty
sequence is returned.
If the value of $operand2 is the
zero-length string, then the function returns
true. If the value of
$operand1 is the zero-length string and
the value of $operand2 is not the
zero-length string, then the function returns
false.
Otherwise, returns an xs:boolean
indicating whether or not the value of
$operand1 contains (at the beginning, at
the end, or anywhere within) a string equal to the
value of $operand2 according to the
collation that is used. The collation used by the
invocation of this function is determined according to
the rules in 7.3 Equality
and Comparison of Strings.
fn:substring( |
$sourceString |
as xs:string?, |
$startingLoc |
as xs:double) as xs:string? |
fn:substring( |
$sourceString |
as xs:string?, |
$startingLoc |
as xs:double, |
|
$length |
as xs:double) as xs:string? |
If the value of $sourceString is the
empty sequence, the empty sequence is returned.
Otherwise, returns the portion of the value of
$sourceString beginning at the position
indicated by the value of $startingLoc and
continuing for the number of characters indicated by
the value of $length. More specifically,
returns the characters in $sourceString
whose position $p obeys:
fn:round($startingLoc)
<= $p < fn:round($startingLoc) +
fn:round($length)
In the above computation, the rules for op:numeric-less-than()
and op:numeric-greater-than()
apply.
If $startingLoc is zero or negative,
the substring includes characters from the beginning of
the $sourceString.
If $length is not specified, the
substring includes characters to the end of
$sourceString.
If $length is greater than the number
of characters in the value of
$sourceString following
$startingLoc, the substring includes
characters to the end of
$sourceString.
The first character of a string is located at position 1, not position 0.
Note:
The position and length given in the second and (optional) third argument relate to the number of XML characters in the string (or equivalently, the number of Unicode code points). Some implementations may represent a code point above xFFFF using two 16-bit values known as a surrogate pair. A surrogate pair counts as one character, not two.
fn:substring("motor car", 6)
returns " car".
Characters starting at position 6 to the end
of $sourceString are selected.
fn:substring("metadata", 4, 3)
returns "ada".
Characters at positions greater than or equal to 4 and less than 7 are selected.
fn:substring("12345", 1.5, 2.6)
returns "234".
Characters at positions greater than or equal to 2 and less than 5 are selected.
fn:substring("12345", 0, 3)
returns "12".
Characters at positions greater than or equal to 0 and less than 3 are selected.
fn:substring("12345", 0 div 0, 3)
returns "".
Since 0 div 0 returns
NaN, and NaN compared
to any other number returns false,
no characters are selected.
fn:substring("12345", 1, 0 div 0)
returns "".
As above.
fn:substring("12345", -42, 1 div
0) returns "12345".
Characters at positions greater than or equal to -42 and less than INF are selected.
fn:substring("12345", -1 div 0, 1 div
0) returns "".
Since -INF + INF returns
NaN, no characters are selected.
fn:string-length() as xs:integer?
fn:string-length($srcval as xs:string?) as xs:integer?
Returns an xs:integer equal to the
length in characters of the value of
$srcval. If the value of
$srcval is the empty sequence, the empty
sequence is returned. If no argument is supplied,
$srcval defaults to the string value
(calculated using fn:string()) of
the context item (.).
Note:
The value returned is the number of XML characters in the string (or equivalently, the number of Unicode code points). Some implementations may represent a code point above xFFFF using two 16-bit values known as a surrogate pair. A surrogate pair counts as one character, not two.
fn:substring-before( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?) as xs:string? |
fn:substring-before( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:string? |
Returns the substring of the value of
$operand1 that precedes in the value of
$operand1 the first occurrence of a string
that is equal to the value of $operand2
according to the collation that is used.
If $collationLiteral is not in the
lexical space of xs:anyURI an error is
raised ("Invalid collationURI").
If the value of $operand1 or
$operand2 is the empty sequence, returns
the empty sequence.
If the value of $operand2 is the
zero-length string, then the function returns the value
of $operand1.
If the value of $operand1 does not
contain a string that is equal to the value of
$operand2, then the function returns the
zero-length string.
The collation used by the invocation of this function is determined according to the rules in 7.3 Equality and Comparison of Strings.
fn:substring-after($operand1 as xs:string?, $operand2 as xs:string?) as xs:string?
fn:substring-after( |
$operand1 |
as xs:string?, |
$operand2 |
as xs:string?, |
|
$collationLiteral |
as xs:string) as xs:string? |
Returns the substring of the value of
$operand1 that follows in the value of
$operand1 the first occurrence of a string
that is equal to the value of $operand2
according to the collation that is used.
If $collationLiteral is not in the
lexical space of xs:anyURI an error is
raised ("Invalid collationURI").
If the value of $operand1 or
$operand2 is the empty sequence, returns
the empty sequence.
If the value of $operand2 is the
zero-length string, then the function returns the value
of $operand1.
If the value of $operand1 does not
contain a string that is equal to the value of
$operand2, then the function returns the
zero-length string.
The collation used by the invocation of this function is determined according to the rules in 7.3 Equality and Comparison of Strings.
fn:normalize-space() as xs:string?
fn:normalize-space($srcval as xs:string?) as xs:string?
Returns the value of $srcval with
whitespace normalized by stripping leading and trailing
whitespace and replacing sequences of more than one
whitespace character by a single space,
#x20. If the value of $srcval
is the empty sequence, returns the empty sequence. If
no argument is supplied, $srcval defaults
to the string value (calculated using fn:string()) of
the context item (.).
fn:normalize-unicode($srcval as xs:string?) as xs:string?
fn:normalize-unicode( |
$srcval |
as xs:string?, |
$normalizationForm |
as xs:string) as xs:string? |
If the value of $srcval is the empty
sequence, returns the empty sequence.
Otherwise, returns the value of $srcval
normalized according to the normalization criteria for
a normalization form identified by the value of
$normalizationForm. The effective value of
the $normalizationForm is computed by
removing leading and trailing blanks, if present, and
converting to upper case.
If the $normalizationForm is absent, as
in the first format above, it shall be assumed to be
"NFC"
If the effective value of
$normalizationForm is "NFC", then the
value returned by the function is the value of
$srcval in Unicode Normalization Form
C (NFC).
If the effective value of
$normalizationForm is "NFD", then the
value returned by the function is the value of
$srcval in Unicode Normalization Form
D (NFD).
If the effective value of
$normalizationForm is "NFKC", then the
value returned by the function is the value of
$srcval in Unicode Normalization Form
KC (NFKC).
If the effective value of
$normalizationForm is "NFKD", then the
value returned by the function is the value of
$srcval in Unicode Normalization Form
KD (NFKD).
If the effective value of
$normalizationForm is "W3C", then the
value returned by the function is the value of
$srcval is the fully normalized form.
See [Character Model for the
World Wide Web 1.0].
If the effective value of
$normalizationForm is the zero-length
string, no normalization is performed and
$srcval is returned.
Conforming implementations ·must· support normalization
form "NFC" and ·may· support normalization
forms "NFD", "NFKC", "NFKD", "W3C" or other
normalization forms. If the effective value of the
$normalizationForm is other than one of
the values supported by the implementation, then an
error is raised ("Unsupported normalization form").
fn:upper-case($srcval as xs:string?) as xs:string?
If the value of $srcval is the empty
sequence, returns the empty sequence.
Otherwise, returns the value of $srcval
after translating every lower-case letter to its
upper-case correspondent. Every lower-case letter that
does not have an upper-case correspondent, and every
character that is not a lower-case letter, is included
in the returned value in its original form.
A "lower-case letter" is a character whose Unicode General Category class includes "Ll". The corresponding upper-case letter is determined using [Unicode Case Mappings].
fn:lower-case($srcval as xs:string?) as xs:string?
If the value of $srcval is the empty
sequence, returns the empty sequence.
Otherwise, returns the value of $srcval
after translating every upper-case letter to its
lower-case correspondent. Every upper-case letter that
does not have a lower-case correspondent, and every
character that is not an upper-case letter, is included
in the returned value in its original form.
An "upper-case letter" is a character whose Unicode General Category class includes "Lu". The corresponding lower-case letter is determined using [Unicode Case Mappings].
fn:translate( |
$srcval |
as xs:string?, |
$mapString |
as xs:string?, |
|
$transString |
as xs:string?) as xs:string? |
If the value of $srcval,
$mapString or $transString is
the empty sequence, returns the empty sequence.
Otherwise, returns the value of $srcval
modified so that every character in the value of
$srcval that occurs at some position
N in the value of $mapString has
been replaced by the character that occurs at position
N in the value of
$transString.
Every character in the value of $srcval
that does not appear in the value of
$mapString is unchanged.
Every character in the value of $srcval
that appears at some position M in the value
of $mapString, where the value of
$transString is less than M
characters in length, is omitted from the returned
value.
If the value of $srcval,
$mapString or $transString is
the empty sequence, returns the empty sequence.
Note:
This function operates on XML characters in the string (or equivalently, Unicode code points). Some implementations may represent a code point above xFFFF using two 16-bit values known as a surrogate pair. A surrogate pair counts as one character, not two.
fn:string-pad($padString as xs:string?, $padCount as xs:integer) as xs:string?
If the value of $padString is the empty
sequence, returns the empty sequence.
Otherwise, returns an xs:string
consisting of $padCount copies of
$padString concatenated together without
any separators. Returns the zero-length string if
$padCount is zero (0).
If the value of $padCount is less than
zero (0), an error is raised ("Invalid string-pad
count").
fn:escape-uri($uri-part as string, $escape-reserved as xs:boolean) as xs:string
This function applies the URI escaping rules defined
in section 2 of [RFC 2396] as
amended by [RFC 2732] to the
string supplied as $uri-part, which
typically represents all or part of a URI. The effect
of the function is to replace any special character in
the string by an escape sequence of the form %xx%yy...,
where xxyy... is the hexadecimal representation of the
octets used to represent the character in UTF-8.
The set of characters that are escaped depends on the setting of the boolean argument $escape-reserved.
If $escape-reserved is
true, all characters are escaped other
than lower case letters a-z, upper case letters A-Z,
digits 0-9 and the characters referred to in [RFC 2396] as "marks":
specifically, "-" | "_" | "." | "!" | "~" | "*" | "'" |
"(" | ")". The "%" character itself is escaped only if
it is not followed by two hexadecimal digits (that is,
0-9, a-f and A-F).
If $escape-reserved is
false, the behavior differs in that
characters referred to in [RFC
2396] and [RFC 2732] as
reserved characters, together with the '#' character,
are not escaped. These characters are ";" | "/" | "?" |
":" | "@" | "&" | "=" | "+" | "$" | "," | "#", "[",
"]".
[RFC 2396] does not define whether escaped URIs should use lower case or upper case for hexadecimal digits. To ensure that escaped URIs can be compared using string comparison functions, this function must always generate hexadecimal values using the upper-case letters A-F.
Generally, $escape-reserved should be
set to true when escaping a string that is
to form a single part of a URI, and to
false when escaping an entire URI or URI
reference.
fn:escape-uri
("gopher://spinaltap.micro.umn.edu/00/Weather/CA/Los%20Angeles#ocean",
true()) returns
"gopher%3A%2F%2Fspinaltap.micro.umn.edu%2F00%2FWeather%2FCA%2FLos%20Angeles%23ocean"
fn:escape-uri
("gopher://spinaltap.micro.umn.edu/00/Weather/CA/Los%20Angeles#ocean",
false()) returns
"gopher://spinaltap.micro.umn.edu/00/Weather/CA/Los%20Angeles#ocean"
The three functions described in this section make use of a regular expression syntax for pattern matching. This is described below.
| Function | Meaning |
|---|---|
fn:matches |
Returns an
xs:boolean value that indicates whether
the value of the first argument is matched by the
regular expression that is the value of the second
argument. |
fn:replace |
Returns the value of the first argument with every substring matched by the regular expression that is the value of the second argument replaced by the replacement string that is the value of the third argument. |
fn:tokenize |
Returns a sequence of
zero or more xs:strings whose values are
substrings of the value of the first argument
separated by substrings that match the regular
expression that is the value of the second
argument. |
The regular expression syntax used by these functions is defined in terms of the regular expression syntax specified in XML Schema (see [XML Schema Part 2: Datatypes]), which in turn is based on the established conventions of languages such as Perl. However, because XML Schema uses regular expressions only for validity checking, it omits some facilities that are widely-used with languages such as Perl. This section, therefore, describes extensions to the XML Schema regular expressions syntax that reinstate these capabilities.
The regular expression syntax and semantics for these functions are identical to those defined in [XML Schema Part 2: Datatypes] with the following additions:
Two modes are defined, string mode and multiline mode.
Two meta-characters, ^ and
$ are added. In string mode, the
metacharacter ^ matches the start of
the entire string, while $ matches the
end of the entire string. In multiline mode,
^ matches the start of any line (that
is, the start of the entire string, and the
position immediately after a newline character),
while $ matches the end of any line
(that is, the end of the entire string, and the
position immediately before a newline character).
Newline here means the character #x0A only.
This means that the production in [XML Schema Part 2: Datatypes]:
[10] Char ::= [^.\?*+()|#x5B#x5D]
is modified to read:
[10] Char ::= [^.\?*+()|^$#x5B#x5D]
The characters #x5B and #x5D correspond to "[" and "]" respectively.
In string mode, the metacharacter .
matches any character whatsoever. In multiline
mode, the metacharacter . matches any
character except a newline (#x0A) character.
Reluctant quantifiers are supported. Specifically:
X?? matches X, once or not at
all
X*? matches X, zero or more
times
X+? matches X, one or more
times
X{n}? matches X, exactly n
times
X(n,}? matches X, at least n
times
X{n,m}? matches X, at least n
times, but not more than m times
The effect of these quantifiers is that the regular expression matches the shortest possible substring consistent with the match as a whole succeeding. In the absence of these quantifiers, the regular expression matches the longest possible substring.
To achieve this, the production in [XML Schema Part 2: Datatypes]:
[4] quantifier ::= [?*+] | ( '{' quantity
'}' )
is changed to:
[4] quantifier ::= ( [?*+] | ( '{'
quantity '}' ) ) '?'?
Sub-expressions (groups) within the regular
expression are recognized. The regular expression
syntax defined by [XML Schema
Part 2: Datatypes] allows a regular expression
to contain parenthesized sub-expressions, but
attaches no special significance to them. The fn:replace()
function described below allows access to the parts
of the input string that matched a sub-expression
(called captured substrings). The sub-expressions
are numbered according to the position of the
opening parenthesis in left-to-right order within
the top-level regular expression: the first opening
parenthesis identifies captured substring 1, the
second identifies captured substring 2, and so on.
If a sub-expression matches more than one substring
(because it is within a construct that allows
repetition), then only the last substring
that it matched will be captured.
Note:
Reluctant quantifiers have no effect on the
results of the boolean fn:matches
function, since this function is only interested in
discovering whether a match exists, and not where it
exists.
All these functions provide an optional parameter,
$flags, to set options for the
interpretation of the regular expression. The
parameter is a string, in which individual letters
are used to set options. The presence of a letter
within the string indicates that the option is on;
its absence indicates that the option is off. Letters
may appear in any order and may be repeated. If there
are letters present that are not defined here, then
an error is raised ("Invalid regular expression
flags").
The following options are defined:
m: If present, the match operates
in multiline mode. Otherwise, the match operates
in string mode.
i: If present, the match operates
in case-insensitive mode. Otherwise, the match
operates in case-sensitive mode. In
case-sensitive mode, a character in the input
string matches a character specified by the
pattern only if the Unicode code-points match. In
case-insensitive mode, a character in the input
string matches a character specified by the
pattern if there is a canonical caseless
match between the two characters as defined
in section 2.5 of [Unicode Case
Mappings].
fn:matches($input as xs:string?, $pattern as xs:string) as xs:boolean?
fn:matches( |
$input |
as xs:string?, |
$pattern |
as xs:string, |
|
$flags |
as xs:string) as xs:boolean? |
The effect of calling the first version of this
function (omitting the argument $flags) is
the same as the effect of calling the second version
with the $flags argument set to a
zero-length string.
If $input is the empty sequence, the
result is the empty sequence.
The function returns true if $input
matches the regular expression supplied as
$pattern; otherwise, it returns false.
Unless the metacharacters ^ and
$ are used as anchors, the string is
considered to match the pattern if any substring
matches the pattern. But if anchors are used, the
anchors must match the start/end of the string (in
string mode), or the start/end of a line (in multiline
mode).
Note:
This is different from the behavior of patterns in [XML Schema Part 2: Datatypes], where regular expressions are implicitly anchored.
An error is raised ("Invalid regular expression") if
the value of $pattern is invalid according
to the rules described in section 7.5.1 Regular Expression
Syntax.
An error is raised ("Invalid regular expression
flags") if the value of $flags is invalid
according to the rules described in section 7.5.1 Regular Expression
Syntax.
fn:matches("abracadabra", "bra")
returns true
fn:matches("abracadabra",
"^a.*a$") returns true
fn:matches("abracadabra", "^bra")
returns false
Given the source document:
<poem author="Wilhelm Busch"> Kaum hat dies der Hahn gesehen, Fängt er auch schon an zu krähen: «Kikeriki! Kikikerikih!!» Tak, tak, tak! - da kommen sie. </poem>
the following function calls produce the following
results, with the poem element as the
context node:
fn:matches(.,
"Kaum.*krähen") returns true
fn:matches(., "Kaum.*krähen",
"m") returns false
fn:matches(., "^Kaum.*gesehen,$",
"m") returns true
fn:matches(., "^Kaum.*gesehen,$")
returns false
fn:matches(., "kiki", "i")
returns true
Note:
Regular expression matching is defined on the basis of Unicode code-points; it takes no account of collations.
fn:replace( |
$input |
as xs:string?, |
$pattern |
as xs:string, |
|
$replacement |
as xs:string) as xs:string? |
fn:replace( |
$input |
as xs:string?, |
$pattern |
as xs:string, |
|
$replacement |
as xs:string, |
|
$flags |
as xs:string) as xs:string? |
The effect of calling the first version of this
function (omitting the argument $flags) is
the same as the effect of calling the second version
with the $flags argument set to a
zero-length string.
The $flags argument is interpreted in
the same manner as for the fn:matches()
function.
If $input is the empty sequence, the
result is the empty sequence.
The function returns the xs:string that
is obtained by replacing all non-overlapping substrings
of $input that match the given
$pattern with an occurrence of the
$replacement string.
If two overlapping substrings of $input
both match the $pattern, then only the
first one (that is, the one whose first character comes
first in the $input string) is replaced.
Within the $replacement string, the
variables $1 to $9 may be
used to refer to the substring captured by each of the
first nine parenthesized sub-expressions in the regular
expression. A literal $ symbol must be
written as \$. For each match of the
pattern, these variables are assigned the value of the
content of the relevant captured sub-expression, and
the modified replacement string is then substituted for
the characters in $input that matched the
pattern.
If a variable $n is present in the
replacement string, but there is no nth
captured substring (which may happen because there were
fewer than n parenthesized
sub-expressions, or because the nth
parenthesized sub-expression was not matched) then the
variable is replaced by a zero-length string.
If two alternatives within the pattern both match at
the same position in the $input, then the
match that is chosen is the one matched by the first
alternative. For example:
fn:replace("abcd", "(ab)|(a)", "[1=$1][2=$2]") returns "[1=ab][2=]cd"
An error is raised ("Invalid regular expression") if
the value of $pattern is invalid according
to the rules described in section 7.5.1 Regular Expression
Syntax.
An error is raised ("Invalid regular expression
flags") if the value of $flags is invalid
according to the rules described in section 7.5.1 Regular Expression
Syntax.
An error is raised ("Regular expression matches zero-length string") if the pattern matches a zero-length string. It is not an error, however, if a captured substring is zero-length.
An error is raised ("Invalid replacement string") if
the value of $replacement contains a
"$" character that is not immediately
followed by a digit 1-9 and not
immediately preceded by a "/".
An error is raised ("Invalid replacement string") if
the value of $replacement contains a
"\" character that is not part of a
"\\" pair, unless it is immediately
followed by a "$" character.
replace("abracadabra", "bra",
"*") returns "a*cada*"
replace("abracadabra", "a.*a",
"*") returns "*"
replace("abracadabra", "a.*?a",
"*") returns "*c*bra"
replace("abracadabra", "a", "")
returns "brcdbr"
replace("abracadabra", "a(.)",
"a$1$1") returns
"abbraccaddabbra"
replace("abracadabra", ".*?",
"$1") raises an error, because the pattern
matches the zero-length string
fn:tokenize($input as xs:string?, $pattern as xs:string) as xs:string*
fn:tokenize( |
$input |
as xs:string?, |
$pattern |
as xs:string, |
|
$flags |
as xs:string) as xs:string* |
The effect of calling the first version of this
function (omitting the argument $flags) is
the same as the effect of calling the second version
with the $flags argument set to a
zero-length string.
This function breaks the $input string
into a sequence of strings, treating any substring that
matches $pattern as a separator. The
separators themselves are not returned.
The $flags argument is interpreted in
the same way as for the fn:matches()
function.
If $input is the empty sequence, the
result is the empty sequence.
If the supplied $pattern matches a
zero-length string, the fn:tokenize()
function breaks the string into its component
characters. The nth character in the
$input string becomes the nth
string in the result sequence; each string in the
result sequence has a string length of one.
If a separator occurs at the start of the
$input string, the result sequence will
start with a zero-length string. Zero-length strings
will also occur in the result sequence if a separator
occurs at the end of the $input string, or
if two adjacent substrings match the supplied
$pattern.
If two alternatives within the supplied
$pattern both match at the same position
in the $input string, then the match that
is chosen is the first. For example:
fn:tokenize("abracadabra", "(ab)|(a)") returns ("", "r", "c", "d", "r", "")
An error is raised ("Invalid regular expression") if
the value of $pattern is invalid according
to the rules described in section 7.5.1 Regular Expression
Syntax.
An error is raised ("Invalid regular expression
flags") if the value of $flags is invalid
according to the rules described in section 7.5.1 Regular Expression
Syntax.
fn:tokenize("The cat sat on the mat",
"\s+") returns ("The", "cat", "sat",
"on", "the", "mat")
fn:tokenize("1, 15, 24, 50",
",\s*") returns ("1", "15", "24",
"50")
fn:tokenize("1,15,,24,50,", ",")
returns ("1", "15", "", "24", "50",
"")
fn:tokenize("abba", ".?") returns
("a", "b", "b", "a")
fn:tokenize("Some unparsed <br>
HTML <BR> text", "\s*<br>\s*",
"i") returns ("Some unparsed",
"HTML", "text")
This section discusses operators on the [XML Schema Part 2: Datatypes] boolean datatype.
The following constructor functions are defined on the boolean type.
| Function | Meaning |
|---|---|
fn:true |
The xs:boolean value 'true'. |
fn:false |
The xs:boolean value 'false'. |
The following functions are defined on boolean values to back up operators defined in [XQuery 1.0: An XML Query Language] and [XPath 2.0]:
| Operator | Meaning |
|---|---|
op:boolean-equal |
Equality of
xs:boolean values |
op:boolean-less-than |
A less-than operator on
xs:boolean values: false is
less than true. |
op:boolean-greater-than |
A greater-than operator
on xs:boolean values: true
is greater than false. |
op:boolean-equal($value1 as xs:boolean, $value2 as xs:boolean) as xs:boolean
The arguments and return type are all
xs:boolean. The result is
true if both arguments are
true or if both arguments are
false. The result is false if
one of the arguments is true and the other
argument is false.
This function backs up the "eq" operator on
xs:boolean values.
The following functions are defined on boolean values:
| Function | Meaning |
|---|---|
fn:not |
Inverts the
xs:boolean value of the argument. |
fn:not($srcval as item*) as xs:boolean
$srcval is first reduced to an
effective boolean value by applying the fn:boolean()
function.
Returns true if the effective boolean
value is false, and false if
the effective boolean value is true.
This section discusses operations on the [XML Schema Part 2: Datatypes] date and
time types. In addition, it discusses operations on two
subtypes of xs:duration that are defined in
this document. See 9.2 Two
Totally Ordered Subtypes of Duration.
The functions described in this section follow the principle of locale-independent storage for these datatypes that originated with [XML Schema Part 2: Datatypes]. Thus, a single calendar (Gregorian) and a single timezone (UTC) is chosen to represent date and time values. Applications and other processing systems are free to present this information in locale-specific representations.
The operators described in this section are defined on the following duration, date and time types:
xs:dateTime
xs:date
xs:time
xs:gYearMonth
xs:gYear
xs:gMonthDay
xs:gMonth
xs:gDay
In addition, they are defined on the 9.2 Two Totally Ordered Subtypes of Duration:
xdt:yearMonthDuration
xdt:dayTimeDuration
For a number of the above datatypes [XML Schema Part 2: Datatypes] extends the basic [ISO 8601] lexical representations, such as YYYY-MM-DDThh:mm:ss.s for dateTime, by allowing more than four digits to represent the year field - no maximum is specified - and an unlimited number of digits for fractional seconds.
For this specification, all minimally conforming processors must support year values with a minimum of 4 digits (i.e., YYYY) and a minimum fractional second precision of 1 millisecond or three digits (i.e., s.sss). However, conforming processors may set larger ·implementation defined· limits on the maximum number of digits they support in these two situations, in which case the limits ·must· be clearly documented.
A processor that limits the number of digits in date and time datatype representations may encounter overflow and underflow conditions when it tries to execute the functions in 9.7 Adding and Subtracting Durations From dateTime, date and time. In these situations, the processor ·must· return zero in case of underflow and ·must· raise an error ("overflow in date/time arithmetic") in case of overflow.
The value spaces of the two totally ordered subtypes
of xs:duration described in 9.2 Two Totally Ordered
Subtypes of Duration are
xs:integer months for
xdt:yearMonthDuration and
xs:decimal seconds for
xdt:dayTimeDuration. If a processor limits
the number of digits allowed in the representation of
xs:integer and xs:decimal
then overflow and underflow situations can arise when
it tries to execute the functions in 9.5 Arithmetic Functions
on xdt:yearMonthDuration and
xdt:dayTimeDuration. In these situations the
processor ·must· return zero in case of
underflow and ·must· raise an error
("overflow in duration arithmetic") in case of
overflow.
Two totally ordered subtypes of
xs:duration are defined in this
specification using the mechanisms described in [XML Schema Part 2: Datatypes] for
defining user-defined types. They are available in the
namespace
http://www.w3.org/2003/05/xpath-datatypes.
Note:
The W3C XML Query Working Group has requested the
W3C XML Schema Working Group that these two subtypes of
xs:duration be included in the built-in
datatypes described in [XML Schema
Part 2: Datatypes]. If the W3C XML Schema Working
Group agrees to this request, these two datatypes will
be removed from the above name space and moved into the
XML Schema namespace
http://www.w3.org/2001/XMLSchema.
[Definition] xdt:yearMonthDuration is
derived from xs:duration by restricting
its lexical representation to contain only the year and
month components. The value space of
xdt:yearMonthDuration is the set of
xs:integer month values. The year and
month components of xdt:yearMonthDuration
correspond to the Gregorian year and month components
defined in section 5.5.3.2 of [ISO
8601], respectively.
xdt:yearMonthDuration is derived from
xs:duration as follows. In this [XML Schema Part 1: Structures]
fragment, the value of
attributeFormDefault is
unqualified.
<xs:simpleType name='xdt:yearMonthDuration'>
<xs:restriction base='xs:duration'>
<xs:pattern value="[\-]?P[0-9]+(Y([0-9]+M)?|M)"/>
</xs:restriction>
</xs:simpleType>
The lexical representation for
xdt:yearMonthDuration is the [ISO 8601] reduced format PnYnM,
where nY represents the number of years and nM the
number of months. The values of the years and months
components are not restricted but allow an arbitrary
unsigned xs:integer.
An optional preceding minus sign ('-') is allowed
to indicate a negative duration. If the sign is
omitted a positive duration is indicated. To indicate
a xdt:yearMonthDuration of 1 year, 2
months, one would write: P1Y2M. One could also
indicate a xdt:yearMonthDuration of
minus 13 months as: -P13M.
Reduced precision and truncated representations of this format are allowed provided they conform to the following:
If the number of years or months in any expression equals zero (0), the number and its corresponding designator ·may· be omitted. However, at least one number and its designator ·must· be present. For example, P1347Y and P1347M are allowed; P-1347M is not allowed, although -P1347M is allowed. P1Y2MT is not allowed. Also, P24YM is not allowed, nor is PY43M since Y must have at least one prededing digit and M must have one preceding digit.
The value of a xdt:yearMonthDuration
lexical form is obtained by multiplying the value of
the year component by 12 and adding the value of the
month component. The value is positive or negative
depending on the preceding sign.
The canonical representation of
xdt:yearMonthDuration restricts the
value of the months component to
xs:integer values between 0 and 11, both
inclusive. To convert from a non-canonical
representation to the canonical representation, the
lexical representation is first converted to a value
in xs:integer months as defined above.
This value is then divided by 12 to obtain the value
of the years component of the canonical
representation. The remaining number of months is the
value of the months component of the canonical
representation. If a component has the value zero
(0), then the number and the designator for that
component ·must· be omitted. However,
if the value is zero (0) months, the canonical form
is "P0M".
Let the function that calculates the value of an
xdt:yearMonthDuration in the manner
described above be called V(d). Then for two
xdt:yearMonthDuration values x and y, x
> y if and only if V(x) > V(y). The order
relation on yearMonthDuration is a total
order.
[Definition] xdt:dayTimeDuration is
derived from xs:duration by restricting
its lexical representation to contain only the day,
hour, minute and second components. The value space of
xdt:dayTimeDuration is the set of
fractional second values. The components of
xdt:dayTimeDuration correspond to the day,
hour, minute and second components defined in Section
5.5.3.2 of [ISO 8601],
respectively. xdt:dayTimeDuration is
derived from xs:duration as follows. In
this [XML Schema Part 1:
Structures] fragment the value of
attributeFormDefault is
unqualified.
<xs:simpleType name='xdt:dayTimeDuration'>
<xs:restriction base='xs:duration'>
<xs:pattern value="[\-]?P([0-9]+D(T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S
|\.[0-9]+S)?|(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+
(\.[0-9]*)?S|\.[0-9]+S)?|(\.[0-9]*)?S)|\.[0-9]+S))?
|T([0-9]+(H([0-9]+(M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
|(\.[0-9]*)?S)|(\.[0-9]*)?S)?|M([0-9]+(\.[0-9]*)?S|\.[0-9]+S)?
|(\.[0-9]*)?S)|\.[0-9]+S))"/>
</xs:restriction>
</xs:simpleType>
The lexical representation for
xdt:dayTimeDuration is the [ISO 8601] truncated format
PnDTnHnMnS, where nD represents the number of days, T
is the date/time separator, nH the number of hours,
nM the number of minutes and nS the number of
seconds.
The values of the days, hours and minutes
components are not restricted, but allow an arbitrary
unsigned xs:integer. Similarly, the
value of the seconds component allows an arbitrary
unsigned xs:decimal. An optional minus
sign ('-') is allowed to precede the 'P', indicating
a negative duration. If the sign is omitted, the
duration is positive. See also [ISO 8601] Date and Time
Formats.
For example, to indicate a duration of 3 days, 10 hours and 30 minutes, one would write: P3DT10H30M. One could also indicate a duration of minus 120 days as: -P120D. Reduced precision and truncated representations of this format are allowed, provided they conform to the following:
If the number of days, hours, minutes, or seconds in any expression equals zero (0), the number and its corresponding designator ·may· be omitted. However, at least one number and its designator ·must· be present.
The seconds part ·may· have a decimal fraction.
The designator 'T' ·must· be absent if and only if all of the time items are absent. The designator 'P' ·must· always be present.
For example, P13D, PT47H, P3DT2H, -P35.89S and P4D251M are all allowed. P-134D is not allowed (invalid location of minus sign), although -P134D is allowed.
The value of a xdt:dayTimeDuration
lexical form in fractional seconds is obtained by
converting the day, hour minutes and seconds value to
fractional seconds using the conversion rules: 24
hours = 1 day, 60 minutes = 1 hour and 60 seconds = 1
minute.
The canonical representation of
xdt:dayTimeDuration restricts the value
of the hours component to xs:integer
values between 0 and 23, both inclusive; the value of
the minutes component to xs:integer
values between 0 and 59; both inclusive; and the
value of the seconds component to
xs:decimal valued from 0.0 to 60.999...
(see [XML Schema Part 2:
Datatypes], Appendix D). The value can be greater
than 60 seconds to accomodate occasional leap seconds
used to keep human time synchronized with the
rotation of the planet.
To convert from a non-canonical representation to the canonical representation, the value of the lexical form in fractional seconds is first calculated in the manner described above. The value of the days component in the canonical form is then calculated by dividing the value by 86,400 (24*60*60). The remainder is in fractional seconds. The value of the hours component in the canonical form is calculated by dividing this remainder by 3,600 (60*60). The remainder is again in fractional seconds. The value of the minutes component in the canonical form is calculated by dividing this remainder by 60. The remainder in fractional seconds is the value of the seconds component in the canonical form. If a component has the value zero (0) then the number and the designator for that component must be omitted. However, if all the components of the lexical form are zero (0), the canonical form is PT0S.
| Operator | Meaning |
|---|---|
op:yearMonthDuration-equal |
Equality comparison on
xdt:yearMonthDuration values |
op:yearMonthDuration-less-than |
Less-than comparison on
xdt:yearMonthDuration values |
op:yearMonthDuration-greater-than |
Greater-than comparison
on xdt:yearMonthDuration values |
op:dayTimeDuration-equal |
Equality comparison on
xdt:dayTimeDuration values |
op:dayTimeDuration-less-than |
Less-than comparison on
xdt:dayTimeDuration values |
op:dayTimeDuration-greater-than |
Greater-than comparison
on xdt:dayTimeDuration values |
op:dateTime-equal |
Equality comparison on
xs:dateTime values |
op:dateTime-less-than |
Less-than comparison on
xs:dateTime values |
op:dateTime-greater-than |
Greater-than comparison
on xs:dateTime values |
op:date-equal |
Equality comparison on
xs:date values |
op:date-less-than |
Less-than comparison on
xs:date values |
op:date-greater-than |
Greater-than comparison
on xs:date values |
op:time-equal |
Equality comparison on
xs:time values |
op:time-less-than |
Less-than comparison on
xs:time values |
op:time-greater-than |
Greater-than comparison
on xs:time values |
op:gYearMonth-equal |
Equality comparison on
xs:gYearMonth values |
op:gYear-equal |
Equality comparison on
xs:gYear values |
op:gMonthDay-equal |
Equality comparison on
xs:gMonthDay values |
op:gMonth-equal |
Equality comparison on
xs:gMonth values |
op:gDay-equal |
Equality comparison on
xs:gDay values |
The following comparison operators are defined on the
[XML Schema Part 2: Datatypes]
date, time and duration datatypes. Each operator takes
two operands of the same type and returns a boolean
result. As discussed in [XML Schema
Part 2: Datatypes], the order relation on
xs:duration and the date and time datatypes
is not a total order but, rather, a partial order. For
this reason, no functions are defined on
xs:duration. A full complement of comparison
and arithmetic functions are defined on the two subtypes
of duration described in 9.2 Two Totally Ordered
Subtypes of Duration.
If either operand to a comparison function on date or time values does not have an explicit timezone then, for the purpose of the operation, an implicit timezone, provided by the evaluation context, is assumed to be present as part of the value. This creates a total order for all date and time values. The order relations on date and time datatypes is defined in [XML Schema Part 2: Datatypes].
Note that for xs:dateTime,
xs:date and xs:time, as
discussed in 1.4
xs:dateTime, xs:date and xs:time values the value
is defined as a tuple. Comparison operators on these
three datatypes operate on the first, or normalized
value, part of the tuple and disregard the second, or
timezone, part of the tuple. If the timezone part is (),
the implicit timezone is used to adjust the normalized
value as necessary.
op:yearMonthDuration-equal( |
$operand1 |
as xdt:yearMonthDuration, |
$operand2 |
as xdt:yearMonthDuration) as xs:boolean |
Returns true if and only if
$operand1 is equal to
$operand2. Returns false
otherwise.
This function backs up the "eq" and "ne" operators
on xdt:yearMonthDuration values.
op:yearMonthDuration-less-than( |
$operand1 |
as xdt:yearMonthDuration, |
$operand2 |
as xdt:yearMonthDuration) as xs:boolean |
Returns true if and only if
$operand1 is less than
$operand2. Returns false
otherwise.
This function backs up the "lt" and "ge" operators
on xdt:yearMonthDuration values.
op:yearMonthDuration-greater-than( |
$operand1 |
as xdt:yearMonthDuration, |
$operand2 |
as xdt:yearMonthDuration) as xs:boolean |
Returns true if and only if
$operand1 is greater than
$operand2. Returns false
otherwise.
This function backs up the "gt" and "le" operators
on xdt:yearMonthDuration values.
op:dayTimeDuration-equal( |
$operand1 |
as xdt:dayTimeDuration, |
$operand2 |
as xdt:dayTimeDuration) as xs:boolean |
Returns true if and only if the value
of $operand1 is equal to the value of
$operand2. Returns false
otherwise.
This function backs up the "eq" and "ne" operators
on xdt:dayTimeDuration values.
op:dayTimeDuration-less-than( |
$operand1 |
as xdt:dayTimeDuration, |
$operand2 |
as xdt:dayTimeDuration) as xs:boolean |
Returns true if and only if
$operand1 is less than
$operand2. Returns false
otherwise.
This function backs up the "lt" and "ge" operators
on xdt:dayTimeDuration values.
op:dayTimeDuration-greater-than( |
$operand1 |
as xdt:dayTimeDuration, |
$operand2 |
as xdt:dayTimeDuration) as xs:boolean |
Returns true if and only if
$operand1 is greater than
$operand2. Returns false
otherwise.
This function backs up the "gt" and "le" operators
on xdt:dayTimeDuration values.
op:dateTime-equal( |
$operand1 |
as xs:dateTime, |
$operand2 |
as xs:dateTime) as xs:boolean |
Returns true if and only if the
normalized value of $operand1 is equal to
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "eq" and "ne" operators
on xs:dateTime values.
Assume that the evaluation context provides an implicit timezone value of -5:00.
op:dateTime-equal(xs:dateTime("2002-04-02T12:00:00-01:00"),
xs:dateTime("2002-04-02T17:00:00+04:00"))
returns true.
op:dateTime-equal(xs:dateTime("2002-04-02T12:00:00"),
xs:dateTime("2002-04-02T23:00:00+06:00"))
returns true.
op:dateTime-equal(xs:dateTime("2002-04-02T12:00:00"),
xs:dateTime("2002-04-02T17:00:00"))
returns false.
op:dateTime-equal(xs:dateTime("2002-04-02T12:00:00"),
xs:dateTime("2002-04-02T12:00:00"))
returns true.
op:dateTime-less-than( |
$operand1 |
as xs:dateTime, |
$operand2 |
as xs:dateTime) as xs:boolean |
Returns true if and only if the
normalized value of $operand1 is less than
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "lt" and "ge" operators
ond xs:dateTime values.
op:dateTime-greater-than( |
$operand1 |
as xs:dateTime, |
$operand2 |
as xs:dateTime) as xs:boolean |
Returns true if and only if the
normalized value of $operand1 is greater
than the normalized value of $operand2.
Returns false otherwise.
This function backs up the "gt" and "le" operators
on xs:dateTime values.
op:date-equal($operand1 as xs:date, $operand2 as xs:date) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is equal to
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "eq" and "ne" operators
on xs:date values.
op:date-less-than($operand1 as xs:date, $operand2 as xs:date) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is less than
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "lt" and "ge" operators
on xs:date values.
op:date-greater-than($operand1 as xs:date, $operand2 as xs:date) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is greater
than the normalized value of $operand2.
Returns false otherwise.
This function backs up the "gt" and "le" operators
on xs:date values.
op:time-equal($operand1 as xs:time, $operand2 as xs:time) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is equal to
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "eq" and "ne" operators
on xs:time values.
op:time-less-than($operand1 as xs:time, $operand2 as xs:time) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is less than
the normalized value of $operand2. Returns
false otherwise.
This function backs up the "lt" and "ge" operators
on xs:time values.
Assume that the evaluation context provides an implicit timezone value of -5:00.
op:time-less-than(xs:time("12:00:00"),
xs:time("23:00:00+06:00")) returns
false.
op:time-less-than(xs:time("11:00:00"),
xs:time("17:00:00")) returns
true.
op:time-less-than(xs:time("23:00:00"),
xs:time("01:00:00-01:00")) returns
true since it compares the
normalized values 28:00:00Z
(23:00:00 adjusted with the implicit
timezone -05:00) and
02:00:00Z.
op:time-greater-than($operand1 as xs:time, $operand2 as xs:time) as xs:boolean
Returns true if and only if the
normalized value of $operand1 is greater
than the normalized value of $operand2.
Returns false otherwise.
This function backs up the "gt" and "le" operators
on xs:time values.
op:gYearMonth-equal( |
$operand1 |
as xs:gYearMonth, |
$operand2 |
as xs:gYearMonth) as xs:boolean |
Returns true if and only if the value
of $operand1 is equal to the value of
$operand2. Returns false
otherwise.
This function backs up the "eq" and "ne" operators
on xs:gYearMonth values.
op:gYear-equal($operand1 as xs:gYear, $operand2 as xs:gYear) as xs:boolean
Returns true if and only if the value
of $operand1 is equal to the value of
$operand2. Returns false
otherwise.
This function backs up the "eq" and "ne" operators
on xs:gYear values.
op:gMonthDay-equal( |
$operand1 |
as xs:gMonthDay, |
$operand2 |
as xs:gMonthDay) as xs:boolean |
Returns true if and only if the value
of $operand1 is equal to the value of
$operand2. Returns false
otherwise.
This function backs up the "eq" and "ne" operators
on xs:gMonthDay values.
The duration, date and time datatypes may be considered to be composite datatypes in that they contain distinct components. The extraction functions specified below extract a single component from a duration, date or time value.
| Function | Meaning |
|---|---|
fn:get-years-from-yearMonthDuration |
Returns the year
component of an xdt:yearMonthDuration
value. |
fn:get-months-from-yearMonthDuration |
Returns the months
component of an xdt:yearMonthDuration
value. |
fn:get-days-from-dayTimeDuration |
Returns the days
component of an xdt:dayTimeDuration
value. |
fn:get-hours-from-dayTimeDuration |
Returns the hours
component of an xdt:dayTimeDuration
value. |
fn:get-minutes-from-dayTimeDuration |
Returns the minutes
component of an xdt:dayTimeDuration
value. |
fn:get-seconds-from-dayTimeDuration |
Returns the seconds
component of an xdt:dayTimeDuration
value. |
fn:get-year-from-dateTime |
Returns the year from an
xs:dateTime value. |
fn:get-month-from-dateTime |
Returns the month from an
xs:dateTime value. |
fn:get-day-from-dateTime |
Returns the day from an
xs:dateTime value. |
fn:get-hours-from-dateTime |
Returns the hours from an
xs:dateTime value. |
fn:get-minutes-from-dateTime |
Returns the minutes from
an xs:dateTime value. |
fn:get-seconds-from-dateTime |
Returns the seconds from
an xs:dateTime value. |
fn:get-timezone-from-dateTime |
Returns the timezone from
an xs:dateTime value. |
fn:get-year-from-date |
Returns the year from an
xs:date value. |
fn:get-month-from-date |
Returns the month from an
xs:date value. |
fn:get-day-from-date |
Returns the day from an
xs:date value. |
fn:get-timezone-from-date |
Returns the timezone from
an xs:date value. |
fn:get-hours-from-time |
Returns the hours from an
xs:time value. |
fn:get-minutes-from-time |
Returns the minutes from
an xs:time value. |
fn:get-seconds-from-time |
Returns the seconds from
an xs:time value. |
fn:get-timezone-from-time |
Returns the timezone from
an xs:time value. |
fn:get-years-from-yearMonthDuration( |
$srcval |
as xdt:yearMonthDuration?) as xs:integer? |
Returns an xs:integer representing the
years component in the canonical lexical representation
of the value of $srcval. The result may be
negative. If $srcval is the empty
sequence, returns the empty sequence.
fn:get-months-from-yearMonthDuration( |
$srcval |
as xdt:yearMonthDuration?) as xs:integer? |
Returns an xs:integer representing the
months component in the canonical lexical
representation of the value of $srcval.
The result may be negative. If $srcval is
the empty sequence, returns the empty sequence.
fn:get-days-from-dayTimeDuration( |
$srcval |
as xdt:dayTimeDuration?) as xs:integer? |
Returns an xs:integer representing the
days component in the canonical lexical representation
of the value of $srcval. The result may be
negative. If $srcval is the empty
sequence, returns the empty sequence.
fn:get-hours-from-dayTimeDuration( |
$srcval |
as xdt:dayTimeDuration?) as xs:integer? |
Returns an xs:integer representing the
hours component in the canonical lexical representation
of the value of $srcval. The result may be
negative. If $srcval is the empty
sequence, returns the empty sequence.
fn:get-hours-from-dayTimeDuration(xdt:dayTimeDuration("P3DT10H"))
returns 10.
fn:get-hours-from-dayTimeDuration(xdt:dayTimeDuration("P3DT12H32M12S"))
returns 12.
fn:get-hours-from-dayTimeDuration(xdt:dayTimeDuration("PT123H"))
returns 3.
fn:get-hours-from-dayTimeDuration(xdt:dayTimeDuration("-P3DT10H"))
returns -10.
fn:get-minutes-from-dayTimeDuration( |
$srcval |
as xdt:dayTimeDuration?) as xs:integer? |
Returns an xs:integer representing the
minutes component in the canonical lexical
representation of the value of $srcval.
The result may be negative. If $srcval is
the empty sequence, returns the empty sequence.
fn:get-seconds-from-dayTimeDuration( |
$srcval |
as xdt:dayTimeDuration?) as xs:decimal? |
Returns an xs:decimal representing the
seconds component in the canonical lexical
representation of the value of $srcval.
The result may be negative. If $srcval is
the empty sequence, returns the empty sequence.
fn:get-year-from-dateTime($srcval as xs:dateTime?) as xs:integer?
Returns an xs:integer representing the
year component in the normalized value of
$srcval. The result may be negative. If
$srcval is the empty sequence, returns the
empty sequence.
Assume that the evaluation context provides an implicit timezone value of -05:00.
fn:get-year-from-dateTime(xs:dateTime("1999-05-31T13:20:00-05:00"))
returns 1999.
fn:get-year-from-dateTime(xs:dateTime("1999-05-31T21:30:00-05:00"))
returns 1999.
fn:get-year-from-dateTime(xs:dateTime("1999-12-31T19:20:00-05:00"))
returns 2000.
fn:get-month-from-dateTime($srcval as xs:dateTime?) as xs:integer?
Returns an xs:integer between 1 and 12,
both inclusive, representing the month component in the
normalized value of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
fn:get-day-from-dateTime($srcval as xs:dateTime?) as xs:integer?
Returns an xs:integer between 1 and 31,
both inclusive, representing the day component in the
normalized value of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
fn:get-hours-from-dateTime($srcval as xs:dateTime?) as xs:integer?
Returns an xs:integer between 0 and 23,
both inclusive, representing the hours component in the
normalized value of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
Assume that the evaluation context provides an implicit timezone value of -05:00.
fn:get-hours-from-dateTime(xs:dateTime("1999-05-31T08:20:00-05:00"))
returns 13.
fn:get-hours-from-dateTime(xs:dateTime("1999-12-31T21:20:00-05:00"))
returns 2.
fn:get-hours-from-dateTime(xs:dateTime("1999-12-31T12:00:00"))
returns 17.
fn:get-minutes-from-dateTime($srcval as xs:dateTime?) as xs:integer?
Returns an xs:integer value between 0
and 59, both inclusive, representing the minute
component in the normalized value of
$srcval. If $srcval is the
empty sequence, returns the empty sequence.
fn:get-seconds-from-dateTime($srcval as xs:dateTime?) as xs:decimal?
Returns an xs:decimal value between 0
and 60.999..., both inclusive representing the seconds
and fractional seconds in the normalized value of
$srcval. Note that the value can be
greater than 60 seconds to accomodate occasional leap
seconds used to keep human time synchronized with the
rotation of the planet. If $srcval is the
empty sequence, returns the empty sequence.
fn:get-timezone-from-dateTime($srcval as xs:dateTime?) as xdt:dayTimeDuration?
Returns the timezone component of
$srcval. The result is an
xdt:dayTimeDuration that indicates
deviation from UTC; its value may range from +14:00 to
-14:00 hours, both inclusive. If $srcval
is the empty sequence, returns the empty sequence.
fn:get-year-from-date($srcval as xs:date?) as xs:integer?
Returns an xs:integer representing the
year in the normalized value of $srcval.
The value may be negative. If $srcval is
the empty sequence, returns the empty sequence.
fn:get-month-from-date($srcval as xs:date?) as xs:integer?
Returns an xs:integer between 1 and 12,
both inclusive, representing the month component in the
normalized value of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
fn:get-day-from-date($srcval as xs:date?) as xs:integer?
Returns an xs:integer between 1 and 31,
both inclusive, representing the day component in the
normalized value of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
fn:get-timezone-from-date($srcval as xs:date?) as xdt:dayTimeDuration?
Returns the timezone component in the normalized
value of $srcval. The result is an
xdt:dayTimeDuration that indicates
deviation from UTC; its value may range from +14:00 to
-14:00 hours, both inclusive. If $srcval
is the empty sequence, returns the empty sequence.
fn:get-hours-from-time($srcval as xs:time?) as xs:integer?
Returns an xs:integer between 0 and 23,
both inclusive, representing the value of the hours
component in the normalized value of
$srcval. If $srcval is the
empty sequence, returns the empty sequence.
fn:get-minutes-from-time($srcval as xs:time?) as xs:integer?
Returns an xs:integer value between 0
to 59, both inclusive, representing the value of the
minutes component in the normalized value of
$srcval. If $srcval is the
empty sequence, returns the empty sequence.
fn:get-seconds-from-time($srcval as xs:time?) as xs:decimal?
Returns an xs:decimal value between 0
and 60.999..., both inclusive, representing the seconds
and fractional seconds in the normalized value of
$srcval. Note that the value can be
greater than 60 seconds to accomodate occassional leap
seconds used to keep human time synchronized with the
rotation of the planet. If $srcval is the
empty sequence, returns the empty sequence.
fn:get-timezone-from-time($srcval as xs:time?) as xdt:dayTimeDuration?
Returns an xdt:dayTimeDuration
representing the timezone component of
$srcval. The result is a
xdt:dayTimeDuration that indicates
deviation from UTC; its value may range from +14:00 to
-14:00 hours, both inclusive. If $srcval
is the empty sequence, returns the empty sequence.
| Function | Meaning |
|---|---|
op:add-yearMonthDurations |
Adds two
xdt:yearMonthDurations. Returns an
xdt:yearMonthDuration. |
op:subtract-yearMonthDurations |
Subtracts one
xdt:yearMonthDuration from another.
Returns an xdt:yearMonthDuration. |
op:multiply-yearMonthDuration |
Multiplies a
xdt:yearMonthDuration by an
xs:decimal. Returns an
xdt:yearMonthDuration. |
op:divide-yearMonthDuration |
Divides an
xdt:yearMonthDuration by an
xs:decimal. Returns an
xdt:yearMonthDuration. |
op:add-dayTimeDurations |
Adds two
xdt:dayTimeDurations. Returns an
xdt:dayTimeDuration. |
op:subtract-dayTimeDurations |
Subtracts one
xdt:dayTimeDuration from another.
Returns an xdt:dayTimeDuration. |
op:multiply-dayTimeDuration |
Multiplies an
xdt:dayTimeDuration by a
xs:decimal. Returns an
xdt:dayTimeDuration. |
op:divide-dayTimeDuration |
Divides an
xdt:dayTimeDuration by an
xs:decimal. Returns an
xdt:dayTimeDuration. |
op:add-yearMonthDurations( |
$srcval1 |
as xdt:yearMonthDuration, |
$srcval2 |
as xdt:yearMonthDuration) as xdt:yearMonthDuration |
Returns the result of adding the value of
$srcval1 to the value of
$srcval2. Backs up the "+" operator on
xdt:yearMonthDuration values.
op:subtract-yearMonthDurations( |
$srcval1 |
as xdt:yearMonthDuration, |
$srcval2 |
as xdt:yearMonthDuration) as xdt:yearMonthDuration |
Returns the result of subtracting the value of
$srcval2 from the value of
$srcval2. Backs up the "-" operator on
xdt:yearMonthDuration values.
op:multiply-yearMonthDuration( |
$srcval1 |
as xdt:yearMonthDuration, |
$srcval2 |
as xs:decimal) as xdt:yearMonthDuration |
Returns the result of multiplying the value of
$srcval1 by $srcval2. The
result is rounded to the nearest month. For a value
v, 0 <= v < 0.5 rounds to 0;
0.5 <= v < 1.0 rounds to 1.
Backs up the "*" operator on
xdt:yearMonthDuration values.
op:divide-yearMonthDuration( |
$srcval1 |
as xdt:yearMonthDuration, |
$srcval2 |
as xs:decimal) as xdt:yearMonthDuration |
Returns the result of dividing the value of
$srcval1 by $srcval2. The
result is rounded to the nearest month. For a value
v, 0 <= v < 0.5 rounds to 0;
0.5 <= v < 1.0 rounds to 1.
Backs up the "div" operator on
xdt:yearMonthDuration values.
op:add-dayTimeDurations( |
$srcval1 |
as xdt:dayTimeDuration, |
$srcval2 |
as xdt:dayTimeDuration) as xdt:dayTimeDuration |
Returns the result of adding the value of
$srcval1 to the value of
$srcval2. Backs up the "+" operator on
xdt:dayTimeDuration values.
op:subtract-dayTimeDurations( |
$srcval1 |
as xdt:dayTimeDuration, |
$srcval2 |
as xdt:dayTimeDuration) as xdt:dayTimeDuration |
Returns the result of subtracting the value of
$srcval2 from the value of
$srcval2. Backs up the "-" operator on
xdt:dayTimeDuration values.
op:multiply-dayTimeDuration( |
$srcval1 |
as xdt:dayTimeDuration, |
$srcval2 |
as xs:decimal) as xdt:dayTimeDuration |
Returns the result of multiplying the value of
$srcval1 by $srcval2. Backs
up the "*" operator on xdt:dayTimeDuration
values.
| Function | Meaning |
|---|---|
fn:adjust-dateTime-to-timezone |
Adjusts an
xs:dateTime value to a specific
timezone, or to no timezone at all. |
fn:adjust-date-to-timezone |
Adjusts an
xs:date value to a specific timezone, or
to no timezone at all. |
fn:adjust-time-to-timezone |
Adjusts an
xs:time value to a specific timezone, or
to no timezone at all. |
For purposes of timezone adjustment, an
xs:date is treated as an
xs:dateTime with time
00:00:00.
fn:adjust-dateTime-to-timezone($srcval as xs:dateTime?) as xs:dateTime?
fn:adjust-dateTime-to-timezone( |
$srcval |
as xs:dateTime?, |
$timezone |
as xdt:dayTimeDuration?) as xs:dateTime? |
Adjusts an xs:dateTime value to a
specific timezone, or to no timezone at all. If
$timezone is the empty sequence, returns
an xs:dateTime without a timezone.
Otherwise, returns an xs:dateTime with a
timezone.
If $timezone is not specified, then
$timezone is the value of the implicit
timezone in the evaluation context.
If $srcval is the empty sequence, then
the result is the empty sequence.
A dynamic error is raised (invalid timezone value)
if $timezone is less than
-PT14H00M or greater than
PT14H00M.
If $srcval does not have a timezone
component and $timezone is the empty
sequence, then the result is $srcval.
If $srcval does not have a timezone
component and $timezone is not the empty
sequence, then the result is $srcval with
$timezone as the timezone component.
If $srcval has a timezone component and
$timezone is the empty sequence, then the
result is $srcval without its timezone
component.
If $srcval has a timezone component and
$timezone is not the empty sequence, then
the result is an xs:dateTime value with a
timezone component of $timezone that is
equal to $srcval.
Assume the evaluation context provides an implicit
timezone of -5:00 (-PT5H0M).
let $tz :=
xdt:dayTimeDuration("-PT10H")
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00"))
returns
2002-03-07T10:00:00-05:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00-07:00"))
returns
2002-03-07T12:00:00-05:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00"),
$tz) returns
2002-03-07T10:00:00-10:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00-07:00"),
$tz) returns
2002-03-07T07:00:00-10:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00-07:00"),
xdt:dayTimeDuration("PT10H")) returns
2002-03-08T03:00:00+10:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T00:00:00+01:00"),
xdt:dayTimeDuration("PT-8H")) returns
2002-03-06T15:00:00-08:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00"),
()) returns
2002-03-07T10:00:00
fn:adjust-dateTime-to-timezone(xs:dateTime("2002-03-07T10:00:00-07:00"),
()) returns
2002-03-07T10:00:00
fn:adjust-date-to-timezone($srcval as xs:date?) as xs:date?
fn:adjust-date-to-timezone( |
$srcval |
as xs:date?, |
$timezone |
as xdt:dayTimeDuration?) as xs:date? |
Adjusts an xs:date value to a specific
timezone, or to no timezone at all. If
$timezone is the empty sequence, returns
an xs:date without a timezone. Otherwise,
returns an xs:date with a timezone.
If $timezone is not specified, then
$timezone is the value of the implicit
timezone in the evaluation context.
If $srcval is the empty sequence, then
the result is the empty sequence.
A dynamic error is raised (invalid timezone value)
if $timezone is less than
-PT14H00M or greater than
PT14H00M.
If $srcval does not have a timezone
component and $timezone is the empty
sequence, then the result is $srcval.
If $srcval does not have a timezone
component and $timezone is not the empty
sequence, then the result is $srcval with
$timezone as the timezone component.
If $srcval has a timezone component and
$timezone is the empty sequence, then the
result is $srcval without its timezone
component.
If $timezone is not the empty sequence,
then the result is $srcval with
$timezone as its timezone component.
Assume the evaluation context provides an implicit
timezone of -5:00 (-PT5H0M).
let $tz :=
xdt:dayTimeDuration("-PT10H")
fn:adjust-date-to-timezone(xs:date("2002-03-07"))
returns 2002-03-07-05:00
fn:adjust-date-to-timezone(xs:date("2002-03-07-07:00"))
returns 2002-03-07-05:00
fn:adjust-date-to-timezone(xs:date("2002-03-07"),
$tz) returns
2002-03-07-10:00
fn:adjust-date-to-timezone(xs:date("2002-03-07-07:00"),
$tz) returns
2002-03-07-10:00
fn:adjust-date-to-timezone(xs:date("2002-03-07"),
()) returns 2002-03-07
fn:adjust-date-to-timezone(xs:date("2002-03-07-07:00"),
()) returns 2002-03-07
fn:adjust-time-to-timezone($srcval as xs:time?) as xs:dateTime?
fn:adjust-time-to-timezone( |
$srcval |
as xs:time?, |
$timezone |
as xdt:dayTimeDuration?) as xs:time? |
Adjusts an xs:time value to a specific
timezone, or to no timezone at all. If
$timezone is the empty sequence, returns
an xs:time without a timezone. Otherwise,
returns an xs:time with a timezone.
If $timezone is not specified, then
$timezone is the value of the implicit
timezone in the evaluation context.
If $srcval is the empty sequence, then
the result is the empty sequence.
A dynamic error is raised (invalid timezone value)
if $timezone is less than
-PT14H00M or greater than
PT14H00M.
If $srcval does not have a timezone
component and $timezone is the empty
sequence, then the result is $srcval.
If $srcval does not have a timezone
component and $timezone is not the empty
sequence, then the result is $srcval with
$timezone as the timezone component.
If $srcval has a timezone component and
$timezone is the empty sequence, then the
result is $srcval without its timezone
component.
If $srcval has a timezone component and
$timezone is not the empty sequence,
then:
Let $srcdt be an
xs:dateTime value, with an arbitrary
date for the date component and time and timezone
components that are the same as the time and
timezone components of $srcval.
Let $r be the result of
evaluating
The result of this function will be a time value
that has time and timezone components that are the
same as the time and timezone components of
$r.
Assume the evaluation context provides an implicit
timezone of -5:00 (-PT5H0M).
let $tz :=
xdt:dayTimeDuration("-PT10H")
fn:adjust-time-to-timezone(xs:time("10:00:00"))
returns 10:00:00-05:00
fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"))
returns 12:00:00-05:00
fn:adjust-time-to-timezone(xs:time("10:00:00"),
$tz) returns
10:00:00-10:00
fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"),
$tz) returns
07:00:00-10:00
fn:adjust-time-to-timezone(xs:time("10:00:00"),
()) returns 10:00:00
fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"),
()) returns 10:00:00
fn:adjust-time-to-timezone(xs:time("10:00:00-07:00"),
xdt:dayTimeDuration("PT10H")) returns
03:00:00+10:00
These functions support adding or subtracting a
duration value to or from an xs:dateTime, an
xs:date or an xs:time value.
Appendix E of [XML Schema Part 2:
Datatypes] describes an algorithm for performing such
operations.
If any of the arguments to the functions below is an
xs:dateTime, xs:date or
xs:time that does not contain an explicit
timezone then, for the purpose of the operation, an
implicit timezone, provided by the evaluation context, is
assumed to be present as part of the value.
| Function | Meaning |
|---|---|
fn:subtract-dateTimes-yielding-yearMonthDuration |
Returns the difference
between two xs:dateTimes as an
xdt:yearMonthDuration. |
fn:subtract-dateTimes-yielding-dayTimeDuration |
Returns the difference
between two xs:dateTimes as an
xdt:dayTimeDuration. |
op:subtract-dates |
Returns the difference
between two xs:dates as an
xdt:dayTimeDuration. |
op:subtract-times |
Returns the difference
between two xs:times as an
xdt:dayTimeDuration. |
op:add-yearMonthDuration-to-dateTime |
Returns the end of a time
period by adding an
xdt:yearMonthDuration to the
xs:dateTime that starts the period. |
op:add-dayTimeDuration-to-dateTime |
Returns the end of a time
period by adding an xdt:dayTimeDuration
to the xs:dateTime that starts the
period. |
op:subtract-yearMonthDuration-from-dateTime |
Returns the beginning of
a time period by subtracting an
xdt:yearMonthDuration from the
xs:dateTime that ends the period. |
op:subtract-dayTimeDuration-from-dateTime |
Returns the beginning of
a time period by subtracting an
xdt:dayTimeDuration from the
xs:dateTime that ends the period. |
op:add-yearMonthDuration-to-date |
Returns the end of a time
period by adding an
xdt:yearMonthDuration to the
xs:date that starts the period. |
op:add-dayTimeDuration-to-date |
Returns the end of a time
period by adding an xdt:dayTimeDuration
to the xs:date that starts the
period. |
op:subtract-yearMonthDuration-from-date |
Returns the beginning of
a time period by subtracting an
xdt:yearMonthDuration from the
xs:date that ends the period. |
op:subtract-dayTimeDuration-from-date |
Returns the beginning of
a time period by subtracting an
xdt:dayTimeDuration from the
xs:date that ends the period. |
op:add-dayTimeDuration-to-time |
Adds the value of the
hours, minutes and seconds components of an
xdt:dayTimeDuration to an
xs:time value. |
op:subtract-dayTimeDuration-from-time |
Subtracts the value of
the hours, minutes and seconds components of an
xdt:dayTimeDuration to an
xs:time value. |
fn:subtract-dateTimes-yielding-yearMonthDuration( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xs:dateTime) as xdt:yearMonthDuration |
Returns the xdt:yearMonthDuration that
corresponds to the difference between the normalized
value of $srcval1 and the normalized value
of $srcval2. If either argument is the
empty sequence, returns the empty sequence. If the
normalized value of $srcval1 precedes in
time the normalized value of $srcval2, the
returned value is a negative duration.
In general, the difference between two
xs:dateTime values will be a duration that
contains years and months as well as days, hours, etc.
In fact, it can be looked at as an
xdt:yearMonthDuration plus an
xdt:dayTimeDuration. This function returns
the result rounded to contain only years and months.
The calculation is as follows: first the duration is
calculated as the value of an
xdt:dayTimeDuration in seconds. Then,
starting from $srcval2, the maximum number
of months in the duration are calculated. If there is a
remaining number of days, they are discarded.
fn:subtract-dateTimes-yielding-dayTimeDuration( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xs:dateTime) as xdt:dayTimeDuration |
Returns the xdt:dayTimeDuration that
corresponds to the difference between the normalized
value of $srcval1 and the normalized value
of $srcval2. If either argument is the
empty sequence, returns the empty sequence. If the
normalized value of $srcval1 precedes in
time the normalized value of $srcval2,
then the returned value is a negative duration.
Assume that the evaluation context provides an implicit timezone value of -5:00.
fn:subtract-dateTimes-yielding-dayTimeDuration(xs:dateTime("2000-10-30T06:12:00"),
xs:dateTime("1999-11-28T09:00:00Z"))
returns an xdt:dayTimeDuration value
corresponding to 337 days, 2 hours and 12
minutes.
op:subtract-dates( |
$srcval1 |
as xs:date, |
$srcval2 |
as xs:date) as xdt:dayTimeDuration |
Returns the xdt:dayTimeDuration that
corresponds to the difference between the normalized
value of $srcval1 and the normalized value
of $srcval2. If either argument is the
empty sequence, returns the empty sequence. If the
normalized value of $srcval1 precedes in
time the normalized value of $srcval2,
then the returned value is a negative duration.
Backs up the subtract, "-", operator on
xs:date values.
op:subtract-times( |
$srcval1 |
as xs:time, |
$srcval2 |
as xs:time) as xdt:dayTimeDuration |
Returns the xdt:dayTimeDuration that
corresponds to the difference between the normalized
value of $srcval1 and the normalized value
of $srcval2. If either argument is the
empty sequence, returns the empty sequence. If the
normalized value of $srcval1 precedes in
time the normalized value of $srcval2,
then the returned value is a negative duration.
Backs up the subtract, "-", operator on
xs:time values.
op:add-yearMonthDuration-to-dateTime( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xdt:yearMonthDuration) as xs:dateTime |
Returns the xs:dateTime computed by
adding $srcval2 to the normalized value of
$srcval1 using the algorithm described in
Appendix E of [XML Schema Part 2:
Datatypes]. If $srcval2 is negative,
then the result xs:dateTime precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "+" operator on
xs:dateTime and
xdt:yearMonthDuration values.
op:add-dayTimeDuration-to-dateTime( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xdt:dayTimeDuration) as xs:dateTime |
Returns the xs:dateTime computed by
adding $srcval2 to the normalized value of
$srcval1 using the algorithm described in
Appendix E of [XML Schema Part 2:
Datatypes]. If $srcval2 is negative,
then the result xs:dateTime precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "+" operator on
xs:dateTime and
xdt:dayTimeDuration values.
op:subtract-yearMonthDuration-from-dateTime( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xdt:yearMonthDuration) as xs:dateTime |
Returns the xs:dateTime computed by
negating $srcval2 and adding the result to
the normalized value of $srcval1 using the
algorithm described in Appendix E of [XML Schema Part 2: Datatypes]. If
$srcval2 is negative, then the
xs:dateTime returned follows
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "-" operator on
xs:dateTime and
xdt:yearMonthDuration values.
op:subtract-dayTimeDuration-from-dateTime( |
$srcval1 |
as xs:dateTime, |
$srcval2 |
as xs:dayTimeDuration) as xs:dateTime |
Returns the xs:dateTime computed by
negating $srcval2 and adding the result to
the normalized value of $srcval1 using the
algorithm described in Appendix E of [XML Schema Part 2: Datatypes]. If
$srcval2 is negative, then the
xs:dateTime returned follows
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "-" operator on
xs:dateTime and
xdt:dayTimeDuration values.
op:add-yearMonthDuration-to-date( |
$srcval1 |
as xs:date, |
$srcval2 |
as xdt:yearMonthDuration) as xs:date |
Returns the xs:date computed by adding
$srcval2 to the normalized value of
$srcval1 using the algorithm described in
Appendix E of [XML Schema Part 2:
Datatypes]. If $srcval2 is negative,
then the xs:date returned precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "+" operator on
xs:date and
xdt:yearMonthDuration values.
op:add-dayTimeDuration-to-date( |
$srcval1 |
as xs:date, |
$srcval2 |
as xdt:dayTimeDuration) as xs:date |
Returns the xs:date computed by adding
$srcval2 to the normalized value of
$srcval1 using the algorithm described in
Appendix E of [XML Schema Part 2:
Datatypes]. If $srcval2 is negative,
then the xs:date returned precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "+" operator on
xs:date and
xdt:dayTimeDuration values.
op:subtract-yearMonthDuration-from-date( |
$srcval1 |
as xs:date, |
$srcval2 |
as xdt:yearMonthDuration) as xs:date |
Returns the xs:date computed by
negating $srcval2 and adding the result to
the normalized value of $srcval1 using the
algorithm described in Appendix E of [XML Schema Part 2: Datatypes]. If
$srcval2 is negative, then the
xs:date returned precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "-" operator on
xs:date and
xdt:yearMonthDuration values.
op:subtract-dayTimeDuration-from-date( |
$srcval1 |
as xs:date, |
$srcval2 |
as xdt:dayTimeDuration) as xs:date |
Returns the xs:date computed by
negating $srcval2 and adding the result to
the normalized value of $srcval1 using the
algorithm described in Appendix E of [XML Schema Part 2: Datatypes]. If
$srcval2 is negative, then the
xs:date returned precedes
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "-" operator on
xs:date and
xdt:dayTimeDuration values.
op:add-dayTimeDuration-to-time( |
$srcval1 |
as xs:time, |
$srcval2 |
as xdt:dayTimeDuration) as xs:time |
First, the days component in the canonical lexical
representation of $srcval2 is set to zero
(0) and the value of the resulting
xdt:dayTimeDuration is calculated.
Alternatively, the value modulus 86,400 is used. This
value is added to the normalized value of
$srcval1 and the result returned. Note
that the xs:time returned may occur in a
following or preceding day and may be less than
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "+" operator on
xs:time and
xdt:dayTimeDuration values.
op:add-dayTimeDuration-to-time(xs:time("11:12:00"),
xdt:dayTimeDuration("P3DT1H15M")) returns
a normalized xs:time value
corresponding to the lexical representation
"12:27:00".
op:add-dayTimeDuration-to-time(xs:time("23:12:00"),
xdt:dayTimeDuration("P1DT3H15M")) returns
a normalized xs:time value
corresponding to the lexical representation
"02:27:00".
op:subtract-dayTimeDuration-from-time( |
$srcval1 |
as xs:time, |
$srcval2 |
as xs:dayTimeDuration) as xs:time |
First, the days component in the canonical lexical
representation of $srcval2 is set to zero
(0) and the value of the resulting
xdt:dayTimeDuration is calculated.
Alternatively, the value modulus 86,400 is used. This
value is subtracted from the normalized value of
$srcval1 and the result returned. Note
that the xs:time returned may occur in a
preceding or following day and may be greater than
$srcval1.
The result has the same timezone as
srcval1. If srcval1 has no
timezone, the result has no timezone.
This functions backs up the "-" operator on
xs:time and
xdt:dayTimeDuration values.
op:subtract-dayTimeDuration-from-time(xs:time("11:12:00"),
xdt:dayTimeDuration("P3DT1H15M")) returns
a normalized xs:time value
corresponding to the lexical representation
"09:57:00".
op:subtract-dayTimeDuration-from-time(xs:time("08:20:00"),
xdt:dayTimeDuration("P23DT10H10M"))
returns a normalized xs:time value
corresponding to the lexical representation
"22:10:00".
Since the validity of a QName is situation dependent, there is no constructor function for QName defined in 5 Constructor Functions. Neither is casting defined for QName from any other type in 17 Casting Functions. This section defines constructor functions for QName as defined in [XML Schema Part 2: Datatypes]. Leading and trailing whitespace, if present, is stripped from string arguments before the result is constructed.
| Function | Meaning | |
|---|---|---|
fn:resolve-QName |
Returns an
xs:QName with the lexical form given in
the first argument. The prefix is resolved using the
in-scope namespaces for a given element. |
|
fn:expanded-QName |
Returns an
xs:QName with the namespace URI given in
the first argument and the local name in the second
argument. |
fn:resolve-QName($qname as xs:string, $element as element) as xs:QName
Returns an xs:QName value (that is, an
expanded QName) by taking an xs:string
that has the lexical form of an xs:QName
(a string in the form "prefix:local-name" or
"local-name") and resolving it using the in-scope
namespaces for a given element.
More specifically, the function searches the
namespace nodes of $element for a node
whose name matches the prefix of $qname,
or the zero-length string if it has no prefix, and
constructs an expanded QName whose local name is taken
from the supplied $qname, and whose
namespace URI is taken from the string value of the
namespace node.
If the $qname has a prefix and if there
is no namespace node for $element that
matches this prefix, then an error is raised ("no
namespace found for prefix").
If the $qname has no prefix, and there
is no unnamed namespace node for $element,
then the resulting expanded QName has no namespace
part.
Sometimes the requirement is to construct an
xs:QName without using the default
namespace. This can be achieved by writing:
if (contains($qname, ":") then fn:resolve-QName($qname, $element)
else fn:expanded-QName((), $qname)
If the requirement is to construct an
xs:QName using the namespaces in the
static context, then the xs:QName
constructor should be used.
Assume that the element bound to
$element has a single namespace node
bound to the prefix eg.
fn:resolve-QName("hello",
$element) returns a QName with local name
"hello" that is in no namespace.
fn:resolve-QName("eg:myFunc",
$element) returns an xs:QName
whose namespace URI is specified by the namespace
node corresponding to the prefix "eg" and whose
local name is "myFunc".
This section discusses functions on QNames as defined in [XML Schema Part 2: Datatypes].
| Function | Meaning |
|---|---|
op:QName-equal |
Returns true
if the local names and namespace URIs of the two
arguments are equal. |
fn:get-local-name-from-QName |
Returns an
xs:string representing the local part of
the xs:QName argument. |
fn:get-namespace-from-QName |
Returns the namespace URI
for the xs:QName argument. This may be
the empty sequence if the xs:QName is in
no namespace. |
fn:get-namespace-uri-for-prefix |
Returns the namespace URI of one of the in-scope namespaces for the given element, identified by its namespace prefix. |
fn:get-in-scope-namespaces |
Returns the prefixes of the in-scope namespaces for the given element. |
op:QName-equal($srcval1 as xs:QName, $srcval2 as xs:QName) as xs:boolean
Returns true if the namespace URIs of
$srcval1 and $srcval2 are
equal and the local-name parts of $srcval1
and $srcval2 are identical on a
codepoint-by-codepoint basis. Otherwise, returns
false. Two namespace URIs are considered
equal if they are either both absent or both present
and identical on a codepoint-by-codepoint basis. See
also 11.2
op:anyURI-equal.
Backs up the "eq" and "ne" operators on values of
type xs:QName.
fn:get-local-name-from-QName($srcval as xs:QName?) as xs:string?
Returns an xs:string representing the
local part of $srcval. If
$srcval is the empty sequence, returns the
empty sequence.
fn:get-namespace-from-QName($srcval as xs:QName?) as xs:string?
Returns the namespace URI for $srcval
as an xs:string. If $srcval
is the empty sequence, the empty sequence is returned.
If $srcval is in no namespace, the empty
sequence is returned.
fn:get-namespace-uri-for-prefix( |
$element |
as element, |
$prefix |
as xs:string) as xs:string? |
Returns the namespace URI of one of the in-scope
namespaces for $element, identified by its
namespace prefix.
If $element has an in-scope namespace
whose namespace prefix is equal to
$prefix, it returns the namespace URI of
that namespace. If $prefix is the
zero-length string, it returns the namespace URI of the
default (unnamed) namespace. Otherwise, it returns the
empty sequence.
Prefixes are equal only if their Unicode code-points match exactly.
fn:get-in-scope-namespaces($element as element) as xs:string*
Returns the prefixes of the in-scope namespaces for
$element. For namespaces that have a
prefix, it returns the prefix as an
xs:NCName. For the default namespace,
which has no prefix, it returns the zero-length
string.
This section specifies functions that take anyURI as arguments.
| Function | Meaning | |
|---|---|---|
fn:resolve-uri |
Returns an absolute
xs:anyURI given a base URI and a relative
URI. |
|
op:anyURI-equal |
Returns true
if the two arguments are equal. |
fn:resolve-uri($relative as xs:string) as xs:string
fn:resolve-uri($relative as xs:string, $base as anyURI) as xs:string
The second form of this function expects
$base to be an absolute URI and
$relative to be a relative URI. It resolves
the relative URI $relative against the
base-uri $base and returns the resulting
absolute URI. If $relative is an absolute
URI, it is returned unchanged. If $base is
not an absolute URI, a error is raised ("Relative URI
base argument to resolve-uri").
If $relative or $base is not
in the lexical space of xs:anyURI an error
is raised ("Invalid argument to resolve-uri").
The first form of this function resolves the relative
URI $relative against the value of the
base-uri property from the static context. If
$relative is an absolute URI, it is returned
unchanged. If the base-uri property is not initialized in
the static context an error is raised ("Base uri
undefined in the static context").
If the $relativeURI is the zero-length
string, returns the value of the base-uri property from
the static context in the first form and
$base in the second form.
Note:
Resolving a URI does not dereference it. This is merely a syntactic operation on two character strings.
op:anyURI-equal($srcval1 as xs:anyURI, $srcval2 as xs:anyURI) as xs:boolean
Returns true if $srcval1 and
$srcval2 compare equal on a
codepoint-by-codepoint basis. Otherwise, returns
false. This function backs up the "eq" and
"ne" operators on anyURI.
For more details on comparing URIs see [How to Compare URIs].
We define the following comparison operators on
xs:base64Binary and
xs:hexBinary values. Comparisons take two
operands of the same type; that is, both operands must be
xs:base64Binary or both operands may be
xs:hexBinary. Each returns a boolean
value.
| Function | Meaning |
|---|---|
op:hexBinary-equal |
Returns true
if the two arguments are equal. |
op:base64Binary-equal |
Returns true
if the two arguments are equal. |
op:hexBinary-equal( |
$value1 |
as xs:hexBinary, |
$value2 |
as xs:hexBinary) as xs:boolean |
Returns true if $value1
and value2 are of the same length and
contain the same code-points. Otherwise, returns
false.
This function backs up the "eq" and "ne" operators
on xs:hexBinary values.
op:base64Binary-equal( |
$value1 |
as xs:base64Binary, |
$value2 |
as xs:base64Binary) as xs:boolean |
Returns true if $value1
and value2 are of the same length and
contain the same code-points. Otherwise, returns
false.
This function backs up the "eq" and "ne" operators
on xs:base64Binary values.
This section discusses functions that take NOTATION as arguments.
| Function | Meaning |
|---|---|
op:NOTATION-equal |
Returns true
if the two arguments are equal. |
This section discusses functions and operators on nodes. Nodes are formally defined in [XQuery 1.0 and XPath 2.0 Data Model].
| Function | Meaning | |
|---|---|---|
fn:name |
Returns the name of the
context node or the specified node as an
xs:string. |
|
fn:local-name |
Returns the local name of
the context node or the specified node as an
xs:NCName. |
|
fn:namespace-uri |
Returns the namespace URI
as an xs:string for the
xs:QName of the argument node or the
context node if the argument is omitted. This may be
the zero-length string if the xs:QName
is in no namespace. |
|
fn:number |
Returns the value of the
context node or the specified item converted to an
xs:double. |
|
fn:lang |
Returns true
or false, depending on whether the
language of the context node, as defined using the
xml:lang attribute, is the same as, or a sublanguage
of, the language specified by the argument. |
|
op:node-equal |
Returns true
if the two arguments have the same identity. |
|
op:node-before |
Indicates whether one node appears before another node in document order. | |
op:node-after |
Indicates whether one node appears after another node in document order. | |
fn:root |
Returns the root of the tree to which the node argument belongs. |
For the illustrative examples below, assume an XQuery
operating on a Purchase Order document containing a
number of line-item elements. Each line-item has child
elements called description, quantity, etc. Quantity has
simple content of type decimal. Further assume that
variables $item1, $item2, etc.
are bound to the nodes for the line-item elements in the
document in sequence. Further, assume that the value of
the quantity child of the first line-item is
5.
fn:name() as xs:string
fn:name($srcval as node?) as xs:string
Returns the name of a node, as an
xs:string that is either the zero-length
string, or has the lexical form of an
xs:QName.
If the argument is omitted, it defaults to the context node. If there is no context node (that is, if there is no context item, or if the context item is not a node), the zero-length string is returned.
If the argument is supplied and is the empty sequence, the function returns the zero-length string.
If the target node has no name (that is, if it is a document node, a comment, a text node, or a namespace node having no name), the function returns the zero-length string.
Otherwise, the value returned is an
xs:string whose lexical form is an
xs:QName.
If $srcval is a processing instruction
or a namespace node, or if it is an element or
attribute node whose expanded-QName (as determined by
the dm:node-name accessor in the [XQuery 1.0 and XPath 2.0 Data
Model]) is in no namespace, then the function
returns the local part of the expanded-QName.
If $srcval is an element or attribute
whose expanded-QName is in a namespace, then a prefix
is determined using the same rules as those for
determining the prefix property when the element or
attribute node is mapped to an element or attribute
information item in the InfoSet. These rules are given
in [XQuery 1.0 and XPath 2.0 Data
Model]. This prefix is then combined with the local
part of the node's expanded-QName to form a string
which will take one of the forms "prefix:local-part"
(if the prefix is a non-zero length string) or
"local-part" (if the prefix is a zero-length
string).
fn:local-name() as xs:string
fn:local-name($srcval as node?) as xs:string
Returns the local part of the name of
$srcval as an xs:string that
will either be the zero-length string or will have the
lexical form of an xs:NCName.
If the argument is omitted, it defaults to the context node. If there is no context node (that is, if there is no context item, or if the context item is not a node), the zero-length string is returned.
If the argument is supplied and is the empty sequence, the function returns the zero-length string.
If the target node has no name (that is, if it is a document node, a comment, or a text node), the function returns the zero-length string.
Otherwise, the value returned will be the local part
of the expanded-QName of the target node (as determined
by the name accessor in the data model). This will be
an xs:string whose lexical form is an
xs:NCName.
fn:namespace-uri() as xs:string
fn:namespace-uri($srcval as node?) as xs:string
Returns the namespace URI of the QName of
$srcval as a, xs:string.
If the argument is omitted, it defaults to the context node. If there is no context node (that is, if there is no context item, or if the context item is not a node), the zero-length string is returned.
If $srcval is the empty sequence, the
zero-length string is returned.
If $srcval is neither an element nor an
attribute node, or if it is an element or attribute
node that has no QName or whose expanded-QName (as
determined by the dm:name accessor in the
[XQuery 1.0 and XPath 2.0 Data
Model]) is in no namespace, then the function
returns the zero-length string.
fn:number() as xs:double
fn:number($srcval as item?) as xs:double
Returns the value indicated by $srcval
or, if $srcval is not specified, the
context node, converted to an xs:double.
If there is no context node (that is, if there is no
context item, or if the context item is not a node),
NaN is returned.
If $srcval is the empty sequence,
returns the xs:double value
NaN.
If $srcval is atomic, returns the
value obtained by converting it to
xs:double following the rules of 17.8 Casting to
numeric types.
If $srcval is a node with an atomic
type, returns that value converted to
xs:double following the rules of 17.8 Casting to
numeric types.
Otherwise, converts $srcval to an