Copyright © 2001 W3C® (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use, and software licensing rules 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 constructors, operators, and functions that are used in [XPath 2.0], [XQuery 1.0: An XML Query Language] and [XSLT 2.0]. The document is generally unconcerned with the specific syntax with which these constructors, operators, and functions will be used, and focuses instead on defining the semantics of them as precisely as feasible.
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 XML Schema Working Group (both part of the W3C XML Activity) and a second joint task force of the W3C XML Query Working Group and the W3C XSL Working Group (part of the W3C Style 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].
The following are identified as high priority issues. Reviewers are requested to provide feedback on these issues using the address below.
[Issue 135: Should we allow casting to/from derived types?]
[Issue 138: Need a table showing which functions an operator maps to.]
[Issue 139: Need a fuller treatment of error behaviour and possibly error handling.]
[Issue 147: The xf:document() function needs to be aligned with XSLT.]
[Issue 150: Should we support comparisons of date/time types that return indeterminate results?]
A list of current W3C Recommendations and other technical documents can be found at http://www.w3.org/TR/.
Comments on this document should be sent to the W3C mailing list www-xml-query-comments@w3.org (archived at http://lists.w3.org/Archives/Public/www-xml-query-comments/).
1 Introduction
1.1 Syntax
1.2 Notations
1.3 Namespace Prefix
2 Accessors
3 Constructors, Functions, and Operators on Numbers
3.1 Numeric Types
3.2 Numeric Constructors
3.2.1 xf:decimal
3.2.2 xf:integer
3.2.3 xf:long
3.2.4 xf:int
3.2.5 xf:short
3.2.6 xf:byte
3.2.7 xf:float
3.2.8 xf:double
3.3 Operators on Numeric Values
3.3.1 op:numeric-add
3.3.2 op:numeric-subtract
3.3.3 op:numeric-multiply
3.3.4 op:numeric-divide
3.3.5 op:numeric-mod
3.3.6 op:numeric-unary-plus
3.3.7 op:numeric-unary-minus
3.4 Comparisons of Numeric Values
3.4.1 op:numeric-equal
3.4.2 op:numeric-less-than
3.4.3 op:numeric-greater-than
3.4.4 op:numeric-less-than-or-equal
3.4.5 op:numeric-greater-than-or-equal
3.4.6 op:numeric-not-equal
3.5 Functions on Numeric Values
3.5.1 xf:floor
3.5.2 xf:ceiling
3.5.3 xf:round
4 Constructors and Functions on Strings
4.1 String Types
4.2 String Constructors
4.2.1 xf:string
4.2.2 xf:normalizedString
4.2.3 xf:token
4.2.4 xf:language
4.2.5 xf:Name
4.2.6 xf:NMTOKEN
4.2.7 xf:NCName
4.2.8 xf:ID
4.2.9 xf:IDREF
4.2.10 xf:ENTITY
4.3 Equality and Comparison of Strings
4.3.1 xf:compare
4.4 Functions on String Values
4.4.1 Usage Notes
4.4.2 xf:concat
4.4.3 xf:starts-with
4.4.4 xf:ends-with
4.4.5 xf:contains
4.4.6 xf:substring
4.4.7 xf:string-length
4.4.8 xf:substring-before
4.4.9 xf:substring-after
4.4.10 xf:normalize-space
4.4.11 xf:normalize-unicode
4.4.12 xf:upper-case
4.4.13 xf:lower-case
4.4.14 xf:translate
4.4.15 xf:string-pad
4.4.16 xf:match
4.4.17 xf:replace
5 Constructors, Functions and Operators on Booleans
5.1 Boolean Constructors
5.1.1 xf:true
5.1.2 xf:false
5.1.3 xf:boolean-from-string
5.2 Operators on Boolean Values
5.2.1 op:boolean-and
5.2.2 op:boolean-or
5.2.3 op:boolean-equal
5.3 Functions on Boolean Values
5.3.1 xf:not
5.3.2 xf:not3
6 Constructors, Functions, and Operators on Dates and Times
6.1 Duration and Datetime Types
6.2 Duration and Datetime Constructors
6.2.1 xf:duration
6.2.2 xf:dateTime
6.2.3 xf:date
6.2.4 xf:time
6.2.5 xf:gYearMonth
6.2.6 xf:gYear
6.2.7 xf:gMonthDay
6.2.8 xf:gMonth
6.2.9 xf:gDay
6.3 Comparisons of Duration and Datetime Values
6.3.1 op:duration-equal
6.3.2 op:duration-less-than
6.3.3 op:duration-greater-than
6.3.4 op:duration-less-than-or-equal
6.3.5 op:duration-greater-than-or-equal
6.3.6 op:duration-not-equal
6.3.7 op:datetime-equal
6.3.8 op:datetime-less-than
6.3.9 op:datetime-greater-than
6.3.10 op:datetime-less-than-or-equal
6.3.11 op:datetime-greater-than-or-equal
6.3.12 op:datetime-not-equal
6.4 Component Extraction Functions on Datetime Values
6.4.1 xf:get-Century-from-dateTime
6.4.2 xf:get-Century-from-date
6.4.3 xf:get-hour-from-dateTime
6.4.4 xf:get-hour-from-time
6.4.5 xf:get-minutes-from-dateTime
6.4.6 xf:get-minutes-from-time
6.4.7 xf:get-seconds-from-dateTime
6.4.8 xf:get-seconds-from-time
6.4.9 xf:get-timezone-from-dateTime
6.4.10 xf:get-timezone-from-date
6.4.11 xf:get-timezone-from-time
6.5 Arithmetic Functions on Dates
6.5.1 xf:add-days
6.6 Functions and Operators on TimePeriod Values
6.6.1 op:get-duration
6.6.2 op:get-end-dateTime
6.6.3 op:get-start-dateTime
7 Constructors and Functions on QNames
7.1 Constructors for QNames
7.1.1 xf:QName-from-uri
7.1.2 xf:QName-from-string
7.1.3 xf:QName
7.2 Functions on QNames
7.2.1 xf:get-local-name
7.2.2 xf:get-namespace-uri
8 Constructors, Functions, and Operators for anyURI
8.1 Constructor for anyURI
8.1.1 xf:anyURI
9 Functions and Operators on base64Binary and hexBinary
9.1 Comparisons of base64Binary and hexBinary Values
9.1.1 op:hex-binary-equal
9.1.2 op:base64-binary-equal
10 Constructors, Functions, and Operators on NOTATION
10.1 NOTATION Constructor
10.1.1 xf:NOTATION
11 Functions and Operators on Nodes
11.1 Functions and Operators on Nodes
11.1.1 xf:local-name
11.1.2 xf:number
11.1.3 op:node-equal
11.1.4 xf:deep-equal
11.1.5 op:node-before
11.1.6 op:node-after
11.1.7 xf:copy
11.1.8 xf:shallow
11.2 if-absent() and if-empty()
11.2.1 xf:if-absent
11.2.2 xf:if-empty
12 Constructors, Functions, and Operators on Sequences
12.1 Constructors on Sequences
12.1.1 op:to
12.2 Functions and Operators on Sequences
12.2.1 xf:boolean
12.2.2 op:concatenate
12.2.3 op:item-at
12.2.4 xf:index-of
12.2.5 xf:empty
12.2.6 xf:exists
12.2.7 xf:distinct-nodes
12.2.8 xf:distinct-values
12.2.9 xf:insert
12.2.10 xf:remove
12.2.11 xf:sublist
12.3 Equals, Union, Intersection and Except
12.3.1 xf:sequence-deep-equal
12.3.2 xf:sequence-node-equal
12.3.3 op:union
12.3.4 op:intersect
12.3.5 op:except
12.4 Aggregate Functions
12.4.1 xf:count
12.4.2 xf:avg
12.4.3 xf:max
12.4.4 xf:min
12.4.5 xf:sum
12.5 Functions that Generate Sequences
12.5.1 xf:id
12.5.2 xf:idref
12.5.3 xf:filter
12.5.4 xf:document
13 Context Functions
13.1 op:context-item
13.2 xf:position
13.3 xf:last
13.4 op:context-document
13.4.1 Semantics
13.5 xf:current-dateTime
13.5.1 Examples
14 Casting Functions
14.1 Casting to primitive types from primitive types
14.2 Casting from derived types to primitive types
14.3 Casting to string
14.4 Casting to numeric types
14.5 Casting to duration and date and time types
14.6 Casting to boolean
14.7 Casting to base64Binary, hexBinary
14.8 Casting to anyURI, QName and NOTATION
A References
A.1 Normative
A.2 Non-normative
B Functions and Operators Issues List (Non-Normative)
C ChangeLog (Non-Normative)
D Function and Operator Quick Reference (Non-Normative)
[XML Schema Part 2: Datatypes] defines a number of primitive and derived datatypes, collectively known as built-in datatypes. This document defines operations on those datatypes 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 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
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 above specifications 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 string arguments. This does not apply to operators such as "+" which may be overloaded. Functions with optional arguments are allowed. If optional arguments are omitted, omissions are assumed to begin from the right.
This document defines, among other things, constructors and other functions that apply to one or more data types. Each constructor and function is defined by specifying its signature, a description of each of its arguments, and its semantics. For many constructors and functions, examples are included to illustrate their use.
Each function's signature is presented in a form like this:
xf:function-name
(parameter-type
$parameter-name
, ...) =>
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 reference the parameter when the function's semantics are specified. 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.
The function name is a QName
as defined in [XML 1.0 Recommendation (Second Edition)]
and must adhere to it's syntatic 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, this may
have intercapitalized spelling and is used in the function name as such.
For example, xf:get-timezone-from-dateTime
.
As is customary, the parameter type name indicates that the function accepts arguments of that type in that position. If the parameter type name is one of the simple types defined in [XML Schema Part 2: Datatypes] the function also accepts arguments with types derived from that type. These may one of the derived types in [XML Schema Part 2: Datatypes] or they may be user-derived types.
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 type name with a question mark:
xf:function-name
(parameter-type?
$parameter-name
) =>
return-type?
The names of constructor functions have been chosen so that their local names are "spelled the same" as the local names of the types for which they are constructors. For example, the name of the constructor function that constructs values whose type is xsd:decimal
is xf:decimal
. Throughout this document, we typically omit the prefix xsd:
in the names of XML Schema types.
[Issue 133: Syntax for indicating that function accepts empty sequence is incorrect]
This document uses a functional notation to describe the arguments
and semantics of all the operations that it defines. Some of these functions
are not intented to be user-callable; instead, they are intended to be
bound to operators by the host language. For example, multiplication is
generally associated with the *
operator, but it is described
as a function in this document.
The signatures of these "operator functions" are identified with a special namespace prefix, "op:", as in this example:
op:multiply
(numeric
$operand1
, numeric
$operand2
) =>
numeric
The functions and operators discussed in this document are
contained in two namespaces and referenced using a qualified name.
The namespace prefix used in this document—merely for
illustrative purposes—is xf
for the user functions and
op
for the operator functions. The namespace
prefix for these functions can vary, as long as the prefix is bound to
the currect URI.
The actual namespaces (that is, the URI of the namespaces) are:
http://www.w3.org/2001/12/xquery-operators
for operators
http://www.w3.org/2001/12/xquery-functions
for functions.
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. They are listed below.
Function | Accessor | Accepts | Returns |
xf:node-kind | node-kind | any kind of node | string |
xf:name | name | any kind of node | zero or one QName |
xf:string | string-value | a sequence, a node of any kind, or a simple value | string |
xf:data | typed-value | any kind of node | sequence of zero or more typed simple values |
xf:base-uri | base-uri | Element or Document node | anyURI |
xf:unique-ID | unique-ID | Element node | zero or one ID |
This section discusses arithmetic operators on the numeric datatypes defined in [XML Schema Part 2: Datatypes]. It uses an approach that permits lightweight operations whenever possible.
The operators described in this section are defined on the following numeric types.
decimal | ||
integer | ||
int | ||
long | ||
short | ||
byte | ||
float | ||
double |
They also apply to user-defined types derived by restriction from these types.
The following constructors are defined on the above numeric types. Each constructor takes a single string
literal as argument. Leading and trailing whitespace, if present, is stripped from the literal
before the value is constructed.
Constructor | Meaning |
xf:decimal
| Produces a decimal value by parsing and interpreting a string. |
xf:integer
| Produces an integer value by parsing and interpreting a string. |
xf:long
| Produces a long value by parsing and interpreting a string. |
xf:int
| Produces an int value by parsing and interpreting a string. |
xf:short
| Produces a short value by parsing and interpreting a string. |
xf:byte
| Produces a byte value by parsing and interpreting a string. |
xf:float
| Produces a float value by parsing and interpreting a string. |
xf:double
| Produces a double value by parsing and interpreting a string. |
For float
and double
, the string
argument can indicate the special values: NaN
, INF
, -INF
, +0
, and -0
.
If the argument string passed to a constructor results in an error (for example, if it conatains a letter other than "E" or "e" or a string other than the special values named above), the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:decimal
(string
$srcval
) =>
decimal
Returns the decimal
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the decimal
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the number of characters contained in the value of $srcval
that are digits is greater than the maximum number of decimal digits supported by the implementation, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:decimal('123.5')
returns the decimal
value corresponding to one hundred twenty three and one-half.
xf:decimal('12.5E2')
returns the error value, since the use of the letter "E" is prohibited in the constructor for the decimal
type.
xf:decimal(' 12.5 ')
returns the decimal
value corresponding to twelve and one-half.
xf:integer
(string
$srcval
) =>
integer
Returns the integer
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the integer
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the number of characters contained in the value of $srcval
that are digits is greater than the maximum number of digits supported by the implementation, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:long
(string
$srcval
) =>
integer
Returns the long
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the long
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is greater than 9,223,372,036,854,775,807 or less than -9,223,372,036,854,775,808, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:int
(string
$srcval
) =>
integer
Returns the int
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the int
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is greater than 2,147,483,647 or less than -2,147,483,648, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:int('1235')
returns the int
value corresponding to one thousand two hundred thirty five.
xf:int('2147483648')
returns the error value, since the value two billion, one hundred forty seven million, four hundred eighty three thousand, six hundred forty eight is not a valid value for the short
type.
xf:short
(string
$srcval
) =>
integer
Returns the short
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the short
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is greater than 32,767 or less than -32,768, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:byte
(string
$srcval
) =>
integer
Returns the byte
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is not a valid lexical representation for the byte
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is greater than 127 or less than -128, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:float
(string
$srcval
) =>
float
Returns the float
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is
"NaN
", then the constructor returns the "not-a-number" value.
If the value of $srcval
is
"INF
" or
"+INF
", then the constructor returns the "positive infinity" value. If the value of $srcval
is
"-INF
", then the constructor returns the "negative infinity" value.
If the value of $srcval
is
"0
" or
"+0
", then the constructor returns the value positive zero. If the value of $srcval
is
"-0
", then the constructor returns the value negative zero.
If the value of $srcval
is not a valid lexical representation for the float
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is not a valid value for the float
type, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:float('510E2')
returns the float
value corresponding to fifty one thousand.
xf:float('15.25')
returns the float
value corresponding to fifteen and a quarter.
xf:float('51D1')
returns the error value, since the use of the letter "D" is prohibited in the constructor for the float
type.
xf:double
(string
$srcval
) =>
double
Returns the double
value that is represented by the characters contained in the value of $srcval
. For this constructor, $srcval
must be a
string literal.
If the value of $srcval
is
"NaN
", then the constructor returns the "not-a-number" value.
If the value of $srcval
is
"INF
" or
"+INF
", then the constructor returns the "positive infinity" value. If the value of $srcval
is
"-INF
", then the constructor returns the "negative infinity" value.
Note:
In XPath 1.0, double("INF")
returned the "not-a-number" value.
If the value of $srcval
is
"0
" or "+0
",
then the constructor returns the value positive zero. If the value of $srcval
is "-0
", then the constructor returns the value negative zero.
If the value of $srcval
is not a valid lexical representation for the double
type as specified in [XML Schema Part 2: Datatypes], then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of the number corresponding to the characters contained in the value of $srcval
is not a valid value for the float
type, then the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
xf:double('510E2')
returns the double
value corresponding to fifty one thousand.
xf:double('15.25')
returns the double
value corresponding to fifteen and a quarter.
xf:double('51D1')
returns the error value, since the use of the letter "D" is prohibited in the constructor for the double
type.
The arguments and return types for the arithmetic operators are the basic numeric types: decimal
, float
, and double
and types derived from them. For simplicity, each operator is defined to operate on operands of the same datatype and to return the same datatype. If the two operands are not of the same datatype, one operand is promoted to be the type of the other operand.
The type promotion scheme includes only two rules:
A derived type may be promoted its base type.
decimal
may be promoted to float
, and float
may be promoted to double
.
The result type of operations depends on their argument datatypes and is defined in the following table:
Operator | Returns |
op:operation(decimal, decimal) | decimal |
op:operation(float, float) | float |
op:operation(double, double) | double |
op:operation(decimal) | decimal |
op:operation(float) | float |
op:operation(double) | double |
These rules define any operation on any pair of arithmetic types. Consider the following example:
op:operation(int, double) => op:operation(double, double)
For this operation, int
must be converted to double
. This can be done, since by the rules above: int
can be promoted to integer
, integer
can be promoted to decimal
, decimal
can be promoted to float
, and float
can be promoted to double
. As far as possible, the promotions should be done in a single step.
As another example, a user may define height
as a derived type of 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, 2) => op:operation(decimal, decimal)
oddHeight
is first promoted to it's base type height
. height
is promoted to its base type integer
and integer
to it's base type decimal
.
[Issue 72: Effects of overflow and underflow unspecified]
[Issue 105: XPath 1.0 compatibility broken for div]
Finally, consider some examples involving special IEEE 754 numerics.
If either argument is "NaN", the result is "NaN".
If neither argument is "NaN", but either argument is "INF", the result is "INF".
If neither argument is "NaN" or "INF", but either argument is "-INF", the result is "-INF".
Note: In the case of multiplication and division, "INF" may become "-INF", and vice versa, as appropriate.
The functions op:numeric-add, op:numeric-subtract, op:numeric-multiply, op:numeric-divide and op:numeric-mod are each defined for three pairs of numeric operands of the same type: decimal, float and double. The functions op:numeric-unary-plus and op:numeric-unary-minus are defined for a single operand of the same three numeric types.
op:numeric-add
(numeric
$operand1
, numeric
$operand2
) =>
numeric
Backs up the "+" operator and returns the arithmetic sum of its operands:
($operand1
+ $operand2
).
op:numeric-subtract
(numeric
$operand1
, numeric
$operand2
) =>
numeric
Backs up the "-" operator and returns the arithmetic difference of its operands:
($operand1
- $operand2
).
op:numeric-multiply
(numeric
$operand1
, numeric
$operand2
) =>
numeric
Backs up the "*" operator and returns the arithmetic product of its operands:
($operand1
* $operand2
).
op:numeric-divide
(numeric
$operand1
, numeric
$operand2
) =>
numeric
Backs up the "div" operator and returns the arithmetic quotient of its operands:
($operand1
div $operand2
).
op:numeric-mod
(numeric
$operand1
, numeric
$operand2
) =>
numeric
Backs up the "mod" operator and returns the remainder after dividing the first operand by the second operand:
($operand1
mod $operand2
).
The result is of the same type as the operands after type promotion. The following rules apply:
If either operand is NaN, the result is NaN.
If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN.
If not NaN, the sign of the result equals the sign of the dividend.
If the dividend is finite and the divisor is an infinity, the result equals the dividend.
If the dividend is a zero and the divisor is finite, the result is the same as the dividend.
In the remaining cases, where neither an infinity, nor a zero, nor NaN is involved, the float or double remainder r from a dividend n and a divisor d is defined by the mathematical relation r = n .(d * q) where q is an integer that is negative only if n/d is negative and positive only if n/d is positive, and whose magnitude is as large as possible without exceeding the magnitude of the true mathematical quotient of n and d. This is truncating division, analogous to integer division, not [IEEE 754-1985] rounding division.
Evaluation of a floating-point mod never throws a run-time exception, even if the right-hand operand is zero. Overflow, underflow, or loss of precision cannot occur.
We define the following comparison operators on numeric values.
Comparisons take two arguments of the same type. If the arguments are
of different types, one argument is promoted to the type of the
other. Each comparison operator returns a boolean value. If either, or both, operands are "NaN", false
is returned.
[Issue 8: Relationships Between Some Numeric Types Should Be Reconsidered]
[Issue 113: Need more complete numeric comparison semantics]
op:numeric-equal
(numeric
$operand1
, numeric
$operand2
) =>
boolean
Returns true if and only if $operand1
is exactly
equal to $operand2
. This function backs up the "eq" operator on numeric values.
op:numeric-less-than
(numeric
$operand1
, numeric
$operand2
) =>
boolean
Returns true if and only if $operand1
is less
than $operand2
. This function backs up the "lt" operator on numeric values.
op:numeric-greater-than
(numeric
$operand1
, numeric
$operand2
) =>
boolean
Returns true if and only if $operand1
is greater
than $operand2
. This function backs up the "gt" operator on numeric values.
op:numeric-less-than-or-equal
(numeric
$operand1
, numeric
$operand2
) =>
boolean
Returns true if and only if $operand1
is less than or
equal to $operand2
. This function backs up the "le" operator on numeric values.
The following functions are defined on these numeric types. Each function returns an integer except:
If the argument is the empty sequence, the empty sequence is returned.
If the argument is "NaN", "NaN" is returned.
[Issue 79: How many digits of precision (etc.) are returned from certain functions?]
[Issue 142: Should floor ceiling and round return the same type as their argument? ]
xf:floor
(double?
$srcval
) =>
integer?
Returns the largest (closest to positive infinity) integer that is
not greater than the value of $srcval
. If the argument is the empty sequence, returns the empty sequence.
xf:ceiling
(double?
$srcval
) =>
integer?
Returns the smallest (closest to negative infinity) number that is not smaller than the value of $srcval
and that is an integer. If the argument is the empty sequnce, returns the empty sequence.
xf:round
(double?
$srcval
) =>
integer?
Returns the number that is closest to the argument and that is an
integer. More formally, round(x)
produces the same result
as floor(x+0.5)
. These semantics are consistent with
Java's semantics. If there are two such numbers, then the one that is
closest to positive infinity is returned. If the argument is NaN, then
NaN is returned. If the argument is positive infinity, then positive
infinity is returned. If the argument is negative infinity, then
negative infinity is returned. If the argument is positive zero, then
positive zero is returned. If the argument is negative zero, then
negative zero is returned. If the argument is less than zero, but
greater than or equal to -0.5, then negative zero is returned.
If the argument is the empty sequnce, returns the empty sequence.
This section discusses functions and operators on the [XML Schema Part 2: Datatypes] string datatype and the datatypes derived from string.
The operators described in this section are defined on the following string types.
string | |||||
normalizedString | |||||
token | |||||
language | |||||
NMTOKEN | |||||
Name | |||||
NCName | |||||
ID | |||||
IDREF | |||||
ENTITY |
They also apply to user-defined types derived by restriction from these types.
The following constructors are defined on string types. Each constructor takes a single string
literal as argument.
Constructor | Meaning |
xf:string
| Produces a string value by parsing and interpreting a supplied string. |
xf:normalizedString
| Produces a normalizedString — the XML Schema datatype — value by parsing and interpreting a string |
xf:token
| Produces a token value by parsing and interpreting a string. |
xf:language
| Produces a language value by parsing and interpreting a string. |
xf:Name
| Produces a Name value by parsing and interpreting a string. |
xf:NMTOKEN
| Produces an NMTOKEN value by parsing and interpreting a string. |
xf:NCName
| Produces an NCName value by parsing and interpreting a string. |
xf:ID
| Produces an ID value by parsing and interpreting a string. |
xf:IDREF
| Produces an IDREF value by parsing and interpreting a string. |
xf:ENTITY
| Produces an ENTITY value by parsing and interpreting a string. |
[Issue 14: Some function signatures are unclear about argument types]
[Issue 90: Constructors for id and idref need a document context for validity.]
[Issue 107: Notion of document context required?]
xf:string
(string
$srcval
) =>
string
Returns a string
value that is the value of $srcval
. This constructor is correctly perceived as a "no-op", but is included for the sake of orthogonality.
xf:string('abc')
returns "abc".
If the context of an XML document,
xf:string('Jérôme')
returns
"Jérôme". (The "̂"
is the numeric code reference for the Unicode character U+0302, called
"Combining Circumflex Accent". It is represented here with
a numeric character reference that must be expanded by the XML parser;
the constructors do not search for or replace numeric character references.)
Note:
The preceding semantic is correct if and only if this document requires the use of Unicode Normalization Form C (NFC) semantics for this constructor. [Character Model for the World Wide Web 1.0] requires normalization following certain operations, so it may be appropriate to mandate it here, too.
xf:normalizedString
(string
$srcval
) =>
normalizedString
Returns a normalizedString
— the XML Schema datatype — value that is the value of $srcval
. Every character contained in $srcval
that is a line feed (#xA) is removed from the returned value.
If the argument string passed to a constructor is not a valid value in the lexical space of normalizedString
as specified in [XML Schema Part 2: Datatypes], then the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model]. Note that the argument to construct a normalizedString
cannot contain the carriage return (#xD) or the tab (#x9) character.
xf:normalizedString('abc')
returns "abc".
In the context of an XML document,
xf:normalizedString('ab
cd')
returns "abcd".
(The "
"
is a numeric character reference that must be expanded by the XML parser.)
In the context of an XML document,
xf:normalizedString('ab
cd')
returns the error value.
(The "
"
is a numeric character reference that must be expanded by the XML parser.)
xf:token
(string
$srcval
) =>
token
Returns a token
value that is the value of $srcval
. Note that the argument to construct a token
must not contain the line feed (#xA) nor tab (#x9) characters, have no leading or trailing spaces (#x20), and must have no internal sequences of two or more spaces. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
[Issue 46: xf:token: Should other Unicode space characters be considered?]
xf:language
(string
$srcval
) =>
language
Returns a language
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type language
must be a valid language identifier as defined in the language identification section of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error (for example,
xyx
is not a valid language identifier), the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:Name
(string
$srcval
) =>
Name
Returns a Name
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type Name
must match the Name
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:NMTOKEN
(string
$srcval
) =>
NMTOKEN
Returns an NMTOKEN
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type NMTOKEN
must match the Nmtoken
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:NCName
(string
$srcval
) =>
NCName
Returns an NCName
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type NCName
must match the NCName
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:ID
(string
$srcval
) =>
ID
Returns an ID
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type ID
must match the NCName
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
The semantic correctness of ID values (that they must be unique within
a given document) is not enforced by the
xf:ID
function.
xf:IDREF
(string
$srcval
) =>
IDREF
Returns an IDREF
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type IDREF
must match the NCName
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
The semantic correctness of IDREF values (that there must be a
corresponding ID value in the same document) is not enforced by the
xf:IDREF
function.
xf:ENTITY
(string
$srcval
) =>
ENTITY
Returns an ENTITY
value that is the value of $srcval
. Note that the value of $srcval
to construct a value of type ENTITY
must match the NCName
production of [XML 1.0 Recommendation (Second Edition)]. If the argument string passed to a constructor results in an error, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
The [Character Model for the World Wide Web 1.0] discusses the fact that strings from a particular character set may need to be collated (sorted) differently for different applications. Thus, the collation needs to be taken into account when comparing strings in any context. Several functions in this and the following section make use of a collation.
In this document, we assume that collations can be named and the collation name, specified as a literal, is used as an argument to the comparison function. This document will also define the manner in which a default collation is determined, allowing the collation argument to be optional in the functions that allow it.
[Issue 44: Collations: URIs and URI references or short names?]
[Issue 70: How are "default" collations determined?]
Some collations can be "tailored" for various purposes. See [Unicode Collation Algorithm]. This document does not discuss tailoring. Instead, we assume that the collation argument to the various functions below is a tailored and named collation.
A specially named collation provides the ability to compare strings based on codepoint values.
A user who wishes to preserve the XPath 1.0 semantics of "<
" and
">
" can define a collation that converts each string to a number and then compares them numerically.
Collations can also 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). Thus, strings can be compared character-by-character or in a logical manner based on the collation.
[Issue 45: Collations: Is there a relationship to xml:lang?]
The [Character Model for the World Wide Web 1.0] recommends that all strings be subjected to Unicode normalization early and, thus, string comparisons need only be defined on normalized strings. If this is not the case, then we may also want to compare unnormalized strings based on their normalized representations.
Function | Meaning | Source |
xf:compare
| Compares two character strings; a collation may optionally be specified | XSLT 2.0, Req. 2.13 (Could) |
[Issue 73: Is a "between" function needed?]
[Issue 104: Need equality and inequality operators for strings.]
[Issue 140: Should the < and > operators apply to strings?]
xf:compare
(string?
$comparand1
, string?
$comparand2
) =>
integer?
xf:compare
(string?
$comparand1
, string?
$comparand2
, anyURI
$collationLiteral
) =>
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.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
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" operator on string values.
[Issue 141: Does string equality use the codepoint collation or the default collation?]
xf:compare('abc', 'abc')
returns 0.
xf: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.)
xf:compare('Strasse', 'Straße', anyURI('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.)
xf: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 4.3 Equality and Comparison of Strings for a discussion of collations.
Function | Meaning | Source |
xf:concat
| Concatenates two or more character strings. | XPath 1.0 |
xf:starts-with
| Indicates whether the value of one string begins with the characters of the value of another string. | |
xf:ends-with
| Indicates whether the value of one string ends with the characters of the value of another string. | |
xf:contains
| Indicates whether the value of one string contains the characters of the value of another string. A collation may optionally be specified. | XPath 1.0 |
xf:substring
| Returns a string located at a specified place in the value of a string. | XPath 1.0 |
xf:string-length
| Returns the length of the argument. | XPath 1.0 |
xf:substring-before
| Returns the characters of one string that precede in that string the characters in the value of another string. A collation may optionally be specified. | XPath 1.0 |
xf:substring-after
| Returns the characters of one string that precede in that string the characters in the value of another string. A collation may optionally be specified. | XPath 1.0 |
xf:normalize-space
| Returns the whitespace-normalized value of the argument. | XPath 1.0 |
xf:normalize-unicode
| Returns the normalized value of the first argument in the normalization form specified by the second argument. | XPath 2.0 Req 2.9 (Should) |
xf:upper-case
| Returns the upper-cased value of the argument. | XPath 2.0 Req 2.4.3 (Should) |
xf:lower-case
| Returns the lower-cased value of the argument. | XPath 2.0 Req 2.4.3 (Should) |
xf:translate
| Returns the first argument string with occurrences of characters in the second argument replaced by the character at the corresponding position in the third string. | XPath 1.0 |
xf:string-pad
| Returns a string composed of as many copies of its first argument as specified in its second argument. | XPath 2.0 Req 2.4.2, 4.4 (Should) |
xf:match
| Returns a sequence of integers indicating the positions in the value of the first argument that are matched by the regular expression that is the value of the second argument. | XPath 2.0 Req 3. (Must) |
xf:replace
| Returns the first argument with every substring matched by the second argument replaced by the value of the third argument. | XPath 2.0 Req 2.4.1. (Should) |
[Issue 23: "Returns a copy" is not appropriate wording]
[Issue 21: What is the precise type returned by each function?]
[Issue 37: Linguistic contains required?]
[Issue 94: Must allow searching for words near other words. ]
[Issue 143: Should we add a tokenize function to break a string into tokens?]
Note that the resulting string after operations such as concatenation or substring must be normalized. See [Character Model for the World Wide Web 1.0].
[Issue 108: Should strings always be returned in Unicode normalized form?]
Note also that when the above operators and functions are applied to datatypes derived from string
, they are guaranteeed to return legal strings, but they may not return legal value for the particular subtype to which they were applied.
xf:concat
() =>
string
xf:concat
(string?
$op1
) =>
string
xf:concat
(string?
$op1
, string?
$op2
, ...) =>
string
Accepts zero or more strings as arguments. Returns the string that is the concatenation of the values of its arguments. The resulting string might not be normalized in any Unicode or W3C normalization. If called with no arguments, returns the empty string. If any of the arguments is the empty sequence it is treated as the empty string.
The concat()
function is specified to allow an arbitrary number of string arguments that are concatenated together. This capability is retained for compatibility with [XPath 1.0] and is the only function specified in this document that has that characteristic.
[Issue 144: Should the concat function accept sequences as arguments? ]
xf:starts-with
(string?
$operand1
, string?
$operand2
) =>
boolean?
xf:starts-with
(string?
$operand1
, string?
$operand2
, anyURI
$collationLiteral
) =>
boolean?
Returns a 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 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
.
If the value of $operand1
or $operand2
is the empty sequence, the empty sequence is returned.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:ends-with
(string?
$operand1
, string?
$operand2
) =>
boolean?
xf:ends-with
(string?
$operand1
, string?
$operand2
, anyURI
$collationLiteral
) =>
boolean?
Returns a 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 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
.
If the value of $operand1
or $operand2
is the empty sequence, the empty sequence is returned.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:contains
(string?
$operand1
, string?
$operand2
) =>
boolean?
xf:contains
(string?
$operand1
, string?
$operand2
, anyURI
$collationLiteral
) =>
boolean?
Returns a 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 $operand1
according to the collation that is used.
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
.
If the value of $operand1
or $operand2
is the empty sequence, the empty sequence is returned.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:substring
(string?
$sourceString
, decimal?
$startingLoc
) =>
string?
xf:substring
(string?
$sourceString
, decimal?
$startingLoc
, decimal?
$length
) =>
string?
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
.
If the value of $startingLoc
is negative or greater than the
length of $sourceString
an error value as defined in [XQuery 1.0 and XPath 2.0 Data Model] is returned.
If $length
is not specified, then the substring identifies characters to the end of $sourceString
.
The value of $length
can be greater than the number of characters in the value of $sourceString
following the beginning position, in which case the substring identifies characters to the end of $sourceString
.
The first character of a string is located at position 1 (not position 0).
If the value of any of the three parameters is the empty sequence, the empty sequence is returned.
xf:string-length
(string?
$srcval
) =>
integer?
Returns an 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.
xf:substring-before
(string?
$operand1
, string?
$operand2
) =>
string?
xf:substring-before
(string?
$operand1
, string?
$operand2
, anyURI
$collationLiteral
) =>
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 the value of $operand2
is the zero-length string, then the function returns the value of $operand1
. If the value of $operand1
is the zero-length string and the value of $operand2
is the zero-length string, then the function returns the zero-length string.
If the value of $operand1
does not contain a string that is equal to the value of $operand2
, then the function returns the empty string.
If the value of $operand1
or $operand2
is the empty sequence, returns the empty sequence.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:substring-after
(string?
$operand1
, string?
$operand2
) =>
string?
xf:substring-after
(string?
$operand1
, string?
$operand2
, anyURI
$collationLiteral
) =>
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 the value of $operand2
is the zero-length string, then the function returns the value of $operand1
. If the value of $operand1
is the zero-length string and the value of $operand2
is the zero-length string, then the function returns the zero-length string.
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.
If the value of $operand1
or $operand2
is the empty sequence, returns the empty sequence.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:normalize-space
(string?
$srcval
) =>
string?
Returns the value of the string argument with whitespace normalized by stripping leading and trailing whitespace and replacing sequences of more than one whitespace character by a single space. If the value of $srcval
is the empty sequence, returns the empty sequence.
xf:normalize-unicode
(string?
$srcval
, string
$normalizationForm
) =>
string?
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 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 "W3C", then the value returned by the function is the value of $srcval
in W3C Normal Form.
If the effective value of the $normalizationForm
is other than the above three values, returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of $srcval
is the empty sequence, returns the empty sequence.
Note:
Are these forms sufficient, or are Unicode KC and KD (and perhaps other) forms also required?
xf:upper-case
(string?
$srcval
) =>
string?
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].
If the value of $srcval
is the empty sequence, returns the empty sequence.
xf:lower-case
(string?
$srcval
) =>
string?
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 output 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].
If the value of $srcval
is the empty sequence, returns the empty sequence.
xf:translate
(string?
$srcval
, string?
$mapString
, string?
$transString
) =>
string?
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
or $mapString
or $transString
is the empty sequence, returns the empty sequence.
xf:string-pad
(string?
$padString
, decimal?
$padCount
) =>
string?
Returns a string consisting of $padCount
copies of
$padString
concatenated together. Returns the empty
string if $padCount
is zero.
If the value of $padCount
is less than zero,
the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of $padString
or $padCount
is the empty sequence, returns the empty sequence.
xf:match
(string?
$srcval
, string?
$regexp
) =>
integer*
Returns a list of integers that identify the offset of the location within the value of $srcval
that is matched by the regular expression that is the value of $regexp
.
If there is no substring of $srcval
that matches the
regular expression, the empty sequence is returned. Otherwise, a sequence
of two integers is returned: the first integer is the position of the
start of the substring and the second integer is the length of the
substring that matches.
If the value of $srcval
or $regexp
is the empty sequence, returns the empty sequence.
Note:
What should be done about the distinction between maximal and minimal matches?
The regular expression in the value of $regexp
uses
the syntax of regular expressions specified in Appendix F of [XML Schema Part 2: Datatypes].
Comparisons of characters and character strings are compared on a character by character basis using the Unicode values for each character.
[Issue 74: Is a "match-exact()" function needed?]
[Issue 75: The semantics of match() and replace() are incompletely specified]
[Issue 81: What are the precise semantics of regular expressions?]
xf:replace
(string?
$srcval
, string?
$regexp
, string?
$repval
) =>
string?
Returns the value of $srcval
in which every substring of the value of $srcval
that is matched by the regular expression that is the value of $regexp
, has been replaced by a copy of the value of $repval
.
Ordinary regular expression semantics are used. Among other characteristics, if the value of $regexp
is an ordinary character string without any of the "special characters" that give regular expressions their semantics, then the phrase "matched by the regular expression" is equivalent in meaning to "equal to the string".
The value of $repval
may use the standard regular expression syntax of "$N"
(where N
is some integer) to represent the N-th part of the matched pattern indicated by parentheses in the value of $regexp
.
Comparisons of characters and character strings are compared on a character by character basis using the Unicode values for each character.
If the value of $srcval
or $regexp
or $repval
is the empty sequence, returns the empty sequence.
[Issue 75: The semantics of match() and replace() are incompletely specified]
This section discusses operators on the [XML Schema Part 2: Datatypes] boolean datatype.
The following constructors are defined on the boolean type.
Constructor | Meaning | Source |
xf:true
| boolean | XPath 1.0 |
xf:false
| boolean | XPath 1.0 |
xf:boolean-from-string
| boolean |
xf:boolean-from-string
(string
$srcval
) =>
boolean
Takes a single string
literal as argument.
Leading and trailing whitespace, if present, is stripped from the literal and
it is converted to upper case before the value is constructed. This is it's effective value. If the effective value of $srcval
is "TRUE", then this constructor returns the boolean value true
; if the effective value of $srcval
is "FALSE", then this constructor returns the boolean value false
.
If the effective value of $srcval
is any value other than "TRUE" or "FALSE", the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
[Issue 157: boolean-from-string should accept only 1, 0, true, false.]
The following operators are defined on these boolean types:
op:boolean-and
(boolean
$value1
, boolean
$value2
) =>
boolean
The arguments and return type are all boolean
.
The result is true
if both values are true
and false
if one of the values is false
. The second operand is not evaluated if the first operand evaluates to false
.
This function backs up the "and" operator
op:boolean-or
(boolean
$value1
, boolean
$value2
) =>
boolean
The arguments and return type are all boolean
. The result is false
if both values are false
and true
if one of the values is true
. The second operand is not evaluated if the first operand evaluates to true
.
This function backs up the "or" operator.
op:boolean-equal
(boolean?
$value1
, boolean?
$value2
) =>
boolean?
The arguments and return type are all 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
. Otherwise, returns the empty sequence.
This function backs up the "eq" operator on boolean values.
The following functions are defined on boolean types:
Function | Meaning | Source |
xf:not | Inverts the boolean value of the argument. A () argument returns true . | XPath 1.0 |
xf:not3 | The 3-valued not function. Inverts the boolean value of the argument. A () argument returns (). | XPath 1.0 |
xf:not
(boolean?
$srcval
) =>
boolean
Returns true
if the value of $srcval
is
false
and false
if the value of $srcval
is true
. Returns true
if the value of $srcval
is the empty sequence.
xf:not3
(boolean?
$srcval
) =>
boolean?
Implements the [SQL] NOT operator. Returns true
if the value of $srcval
is false
and false
if the value of $srcval
is true
. Returns the empty sequence if the value of $srcval
is the empty sequence.
xf:not3(xf:false())
returns true
.
xf:not3(())
returns ()
.
[Issue 134: What should be the name of the three-valued-logic NOT function?]
This section discusses operators on the [XML Schema Part 2: Datatypes] date and time types.
[Issue 109: Calendar context allows for non-Gregorian calendars]
[Issue 136: Should we allow casting a date/time from one timezone to another?]
[Issue 153: Should we add functions to add/subtract durations and multiply a duration by a number? ]
The operators described in this section are defined on the following duration and datetime types.
duration
dateTime
date
time
gYearMonth
gYear
gMonthDay
gMonth
gDay
CONFORMANCE NOTE
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 100 nanoseconds or eight digits (i.e. s.ssssssss). However, conforming processors may set larger application-defined limits on the maximum number of digits they support in these two situations, in which case those application-defined maximum numbers must be clearly documented.
[Issue 159: For fractional seconds precision use 6 digits to match SQL TIMESTAMP.]
The following constructors are defined on duration and datetime datatypes. Each constructor takes a single string
literal as argument. Leading and trailing whitespace, if present, is stripped from the literal
before the value is constructed.
Constructor | Meaning |
xf:duration
| Returns a duration type derived by parsing and interpreting a string value. |
xf:dateTime
| Returns a dateTime type derived by parsing and interpreting a string value. |
xf:date
| Returns a date type derived by parsing and interpreting a string value. |
xf:time
| Returns a time type derived by parsing and interpreting a string value. |
xf:gYearMonth
| Returns a gYearMonth type derived by parsing and interpreting a string value. |
xf:gYear
| Returns a gYear type derived by parsing and interpreting a string value. |
xf:gMonthDay
| Returns a gMonthDay type derived by parsing and interpreting a string value. |
xf:gMonth
| Returns a gMonth type derived by parsing and interpreting a string value. |
xf:gDay
| Returns a gDay type derived by parsing and interpreting a string value. |
xf:duration
(string
$srcval
) =>
duration
If the value of $srcval
conforms to the lexical representation of a duration
as defined in [XML Schema Part 2: Datatypes], the constructor returns the duration
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:dateTime
(string
$srcval
) =>
dateTime
If the value of $srcval
conforms to the lexical representation of a dateTime
as defined in [XML Schema Part 2: Datatypes], the constructor returns the dateTime
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:dateTime("1999-05-31T05:00:00")
returns a dateTime
value corresponding to the 31st. of May, 1999 at 5:00 AM in an unspecified timezone.
xf:dateTime("1999-05-31T13:20:00-05:00")
returns a dateTime
value corresponding to 1:20 pm on May the 31st, 1999 for a timezone which is 5 hours behind Coordinated Universal Time (UTC).
xf:date
(string
$srcval
) =>
date
If the value of $srcval
conforms to the lexical representation of a date
as defined in [XML Schema Part 2: Datatypes], the constructor returns the date
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:time
(string
$srcval
) =>
time
If the value of $srcval
conforms to the lexical representation of a time
as defined in [XML Schema Part 2: Datatypes], the constructor returns the time
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:time("11:33:24")
returns a time
value corresponding to 33 minutes and 24 seconds past 11 AM in an unspecified timezone.
xf:time("23:33:24.35-05:00")
returns a time
value corresponding to 33 minutes and 24.35 seconds past 11 PM for a timezone which is 5 hours behind Coordinated Universal Time (UTC).
xf:gYearMonth
(string
$srcval
) =>
gYearMonth
If the value of $srcval
conforms to the lexical representation of a gYearMonth
as defined in [XML Schema Part 2: Datatypes], the constructor returns the gYearMonth
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:gYear
(string
$srcval
) =>
gYear
If the value of $srcval
conforms to the lexical representation of a gYear
as defined in [XML Schema Part 2: Datatypes], the constructor returns the gYear
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:gMonthDay
(string
$srcval
) =>
gMonthDay
If the value of $srcval
conforms to the lexical representation of a gMonthDay
as defined in [XML Schema Part 2: Datatypes], the constructor returns the gMonthDay
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:gMonth
(string
$srcval
) =>
gMonth
If the value of $srcval
conforms to the lexical representation of a gMonth
as defined in [XML Schema Part 2: Datatypes], the constructor returns the gMonth
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:gDay
(string
$srcval
) =>
gDay
If the value of $srcval
conforms to the lexical representation of a gDay
as defined in [XML Schema Part 2: Datatypes], the constructor returns the gDay
corresponding to that representation. Otherwise, the constructor returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:gDay("13")
returns a gDay
corresponding to the thirteenth day in an unspecified month and year in an unspecified timezone.
xf:gDay("14+02:30")
returns a gDay
corresponding to the fourteenth day in an unspecified month and year in a timezone that is 2.5 hours ahead of Coordinated Universal Time (UTC).
The following operators are defined on dateTime and duration values. Each operator takes two operands of the same kind and returns a boolean result. As discussed in [XML Schema Part 2: Datatypes], the order relation on the duration and the dateTime datatypes is not a total order but, rather, a partial order. For this reason, operands to these operators are restricted as defined below to return a boolean result.
For the purpose of the operators defined in this section, durations are defined to be of two kinds: those that contain only years and months and those that contain only days, hours, minutes and seconds. In each case some fields may be omitted. These two kinds of durations correspond to the [SQL] interval types year-month interval and day-time interval.
In the same manner, two kinds of dateTimes are defined: those that have timezones and those that do not have timezones. If comparisons are restricted to like kinds of durations and dateTimes a boolean result is always returned. For the operators below, attempting to compare durations or dates of different kinds is an error.
If one or more operands is the empty sequence, the result is the empty sequence.
[Issue 151: Do we need comparison functions on other date and time types?]
op:duration-equal
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is exactly
equal to $operand2
. Returns false otherwise.
This function backs up the "eq" operator on duration values.
op:duration-less-than
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is less
than $operand2
. Returns false otherwise.
This function backs up the "lt" operator on duration values.
op:duration-greater-than
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is greater
than $operand2
. Returns false otherwise.
This function backs up the "gt" operator on duration values.
op:duration-less-than-or-equal
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is less than or
equal to $operand2
. Returns false otherwise.
This function backs up the "le" operator on duration values.
op:duration-greater-than-or-equal
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is greater than or
equal to $operand2
. Returns false otherwise.
This function backs up the "ge" operator on duration values.
op:duration-not-equal
(duration
$operand1
, duration
$operand2
) =>
boolean
Returns true if and only if $operand1
is not equal
to $operand2
. Returns false otherwise.
This function backs up the "ne" operator on duration values.
op:datetime-equal
(dateTime
$operand1
, dateTime
$operand2
) =>
boolean
Returns true if and only if $operand1
is exactly
equal to $operand2
. Returns false otherwise.
This function backs up the "eq" operator on dateTime values.
op:datetime-less-than
(dateTime
$operand1
, dateTime
$operand2
) =>
boolean
Returns true if and only if $operand1
is less
than $operand2
. Returns false otherwise.
This function backs up the "lt" operator on dateTime values.
op:datetime-greater-than
(dateTime
$operand1
, dateTime
$operand2
) =>
boolean
Returns true if and only if $operand1
is greater
than $operand2
. Returns false otherwise.
This function backs up the "gt" operator on dateTime values.
op:datetime-less-than-or-equal
(dateTime
$operand1
, dateTime
$operand2
) =>
boolean
Returns true if and only if $operand1
is less than or
equal to $operand2
. Returns false otherwise.
This function backs up the "le" operator on dateTime values.
The date and time datatypes may be considered to be composite datatypes in that they contain distinct components. The extraction functions specified below extract one component from a date or time value.
xf:get-Century-from-dateTime
(dateTime?
$srcval
) =>
integer?
Returns an integer representing the century component of the year identified in the value of $srcval
. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-Century-from-date
(date?
$srcval
) =>
integer?
Returns an integer representing the century component of the year identified in the value of $srcval
. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-hour-from-dateTime
(dateTime?
$srcval
) =>
integer?
Returns an integer representing the hour identified in the value of $srcval
. The hour value ranges from 0 to 23, inclusive. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-hour-from-time
(time?
$srcval
) =>
integer?
Returns an integer representing the hour identified in the value of $srcval
. The hour value ranges from 0 to 23, inclusive. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-minutes-from-dateTime
(dateTime?
$srcval
) =>
integer?
Returns an integer value representing the minute identified in the value of $srcval
. The minute value ranges from 0 to 59, inclusive. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-minutes-from-time
(time?
$srcval
) =>
integer?
Returns an integer value representing the minute identified in the value of $srcval
. The minute value ranges from 0 to 59, inclusive. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-seconds-from-dateTime
(dateTime?
$srcval
) =>
decimal?
Returns a decimal value representing the seconds and fractional seconds identified in the value of $srcval
. The value ranges from 0 to 60.999..., inclusive. The number of digits of fractional seconds precision is determined by the relevant facet of the argument. 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.
xf:get-seconds-from-time
(time?
$srcval
) =>
decimal?
Returns a decimal value representing the seconds and fractional seconds identified in the value of $srcval
. The value ranges from 0 to 60.999..., inclusive. The number of digits of fractional seconds precision is determined by the relevant facet of the argument. 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.
xf:get-timezone-from-dateTime
(dateTime?
$srcval
) =>
string?
Returns a string representing the timezone component of $srcval
. The result is a duration in "hh:mm" format with an optional leading minus (-) sign, indicating the deviation from GMT (UTC). If $srcval
does not contain a timezone, the result is the empty sequence. If $srcval
is the empty sequence, returns the empty sequence.
[Issue 110: No timezone: Empty sequence or empty string?]
[Issue 137: Should functions that return timezones return a duration?]
xf:get-timezone-from-date
(date?
$srcval
) =>
string?
Returns a string representing the timezone component of $srcval
. The result is a duration in "hh:mm" format with an optional leading minus (-) sign, indicating the deviation from GMT (UTC). If $srcval
does not contain a timezone, the result is the empty sequence. If $srcval
is the empty sequence, returns the empty sequence.
xf:get-timezone-from-time
(time?
$srcval
) =>
string?
Returns a string representing the timezone component of $srcval
. The result is a duration in "hh:mm" format with an optional leading minus (-) sign, indicating the deviation from GMT (UTC). If $srcval
does not contain a timezone, the result is the empty sequence. If $srcval
is the empty sequence, returns the empty sequence.
Function | Meaning |
xf:add-days
| Adds the number of days indicated by the second argument to the first argument. |
xf:add-days
(date?
$dateParam
, decimal?
$incrDays
) =>
date?
Adds the number of days indicated by the value of $incrDays
to the value of $dateParam
. The value of $incrDays
may be negative. If the value of $dateparam
has a timezone, it remains unchanged. The returned value is always normalized into a correct Gregorian calendar date. If either parameter is the empty sequence, returns the empty sequence.
Let us define a time period
as an interval or duration of time with a fixed start and end. Thus, time periods have three properties, two of which are independent. The three functions below take two of the properties as arguments and return the third.
These functions require add or subtracting a duration to or from a date. Appendix E of [XML Schema Part 2: Datatypes] describes an algorithm for adding durations to dates.
Function | Meaning |
op:get-duration
| Returns the difference between two dateTimes as a duration. The two arguments must both have a timezone or both have no timezone. |
op:get-end-dateTime
| Returns the end of a time period by adding a duration to the dateTime that starts the period. |
op:get-start-dateTime
| Returns the beginning of a time period by subtracting a duration from the the dateTime that ends the period. |
[Issue 25: Is a normalize function needed for duration types?]
[Issue 96: These functions on time-period values are better written using operators as in SQL.]
op:get-duration
(dateTime
$parameter1
, dateTime
$parameter2
) =>
duration
Returns the duration that corresponds to the difference between the value of $parameter1
and the value of $parameter2
. If the value of $parameter1
follows in time the value of $parameter2
, then the returned value is a negative duration. The two arguments must both have a timezone or both have no timezone.
This function backs up the "-" operator on dateTime values.
op:get-end-dateTime
(dateTime
$parameter1
, duration
$parameter2
) =>
dateTime
Returns the end of a time period by adding a duration ($parameter2
) to the dateTime that starts the period ($parameter1
). If the duration is negative, then the "end" of the period precedes the "start" of the period. If either parameter is the empty sequence, returns the empty sequence.
This function backs up the "+" operator on a dateTime value and a duration value. May be written as date + duration
or duration + date
.
xf:get-start-dateTime
(dateTime
$parameter1
, duration
$parameter2
) =>
dateTime?
Returns the start of a time period by subtracting the duration of the period ($parameter2
) from the dateTime that ends the period ($parameter1
). If the duration is negative, then the "start" of the period follows the "end" of the period. If either parameter is the empty sequence, returns the empty sequence.
This function backs up the "-" operator on a dateTime value and a duration value. May be written as date - duration
This section discusses constructors for QNames as defined in [XML Schema Part 2: Datatypes]. Each constructor takes one or more single string
literals as arguments. Leading and trailing whitespace, if present, is stripped from the literal before the value is constructed.
Function | Meaning | Source |
xf:QName-from-uri
| Returns a QName with the namespace URI given in the first argument and the local name in the second argument. | |
xf:QName-from-string
| Accepts a string with a single embedded colon and returns a QName with the namespace URI that maps to the substring in the argument before the colon and the local name in the substring following the colon. The prefix-to-URI mapping uses the namespaces in scope. | |
xf:QName
| Returns a QName in no namespace with the local name given in the argument. |
xf:QName-from-uri
(string
$paramURI
, string
$paramLocal
) =>
QName
Returns a QName with the namespace URI given in $paramURI
and the local name in $paramLocal
.
xf:QName-from-string
(string
$param
) =>
QName
Accepts an argument which is a string containing a single colon. The substring before the colon indicates the prefix and the substring following the colon indicates the local name. The two substrings must obey the lexical constraints for prefix and local name, respectively. Returns a QName with the namespace URI that maps to the prefix and the local name. The prefix to URI mapping uses the namespaces in scope.
xf:QName-from-string("ashok:person")
returns a QName with the namespace URI bound to the prefix "ashok" and local name = "person", provided the namespace URI is in scope. If the namespace URI is not in scope, then the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
This section discusses functions on QNames as defined in [XML Schema Part 2: Datatypes].
Function | Meaning | Source |
xf:get-local-name
| Returns a string representing the local part of the QName argument. | |
xf:get-namespace-uri
| Returns the namespace URI for the QName argument. This may be the empty sequence if the QName is in no namespace. |
xf:get-local-name
(QName?
$srcval
) =>
string?
Returns a string representing the local part of $srcval
. If $srcval
is the empty sequence, returns the empty sequence.
This section discusses a constructor for anyURI as defined in [XML Schema Part 2: Datatypes]. The constructor takes a single string
literal as argument.
Function | Meaning | Source |
xf:anyURI
| Returns an anyURI with a URI reference as given in the argument. |
We define the following comparison operators on base64Binary and hexBinary values. Comparisons take two operands of the same type i.e both operands must be base64Binary or hexBinary. Each returns a boolean value.
This section discusses a constructor for NOTATION as defined in [XML Schema Part 2: Datatypes]. The constructor takes a single string
literal as argument.
Function | Meaning | Source |
xf:NOTATION
| Returns a NOTATION with the value given in the argument. |
This section discusses functions and operators on nodes
. Nodes
are formally defined in [XQuery 1.0 and XPath 2.0 Data Model].
Function | Meaning | Source |
xf:local-name
| Returns the local name of the context node or the specified node as a QName. | XPath 1.0 modified |
xf:number
| Returns the value of the context node or the specified node converted to a number. | XPath 2.0 req 1.5 (Could) |
op:node-equal
| Returns true if the two arguments have the same identity. | Data Model |
xf:deep-equal
| Returns true if the two arguments have the same value. | Data Model |
op:node-before
| Indicates whether one node appears before another node in document order. | Data Model |
op:node-after
| Indicates whether one node appears before another node in document order. | Data Model |
xf:copy
| Returns a deep copy of a node. Not supported in XSLT. | Data Model |
xf:shallow
| Returns a shallow copy of a node. Not supported in XSLT. | Data Model |
[Issue 103: Need operators for BEFORE and AFTER.]
For the illustrative examples below, assume an XQuery operating on a Purchase Order document containing a number of item elements. Each 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 item elements in the document in sequence.
xf:local-name
() =>
string
xf:local-name
(node
$srcval
) =>
string
Returns a string whose value corresponds to the local name of the specified node (or, if no node is provided, the context node) as a string.
xf:number
() =>
anySimpleType
xf:number
(node
$srcval
) =>
anySimpleType
Returns the value of the node indicated by $srcval
or, if $srcval
is not specified, the context node, converted to a double. If the value of the node is not a valid lexical representation of a numeric simple type as defined in [XML Schema Part 2: Datatypes], then the function returns the error value as specified in [XQuery 1.0 and XPath 2.0 Data Model].
op:node-equal
(node
$parameter1
, node
$parameter2
) =>
boolean
If the node identified by the value of $parameter1
is the same node as the node identified by the value of $parameter2
(that is, the two nodes have the same identity), then the function returns true
; otherwise, the function returns false
.
This function backs up the "==" and "!==" operators on nodes.
xf:deep-equal
(node
$parameter1
, node
$parameter2
) =>
boolean
xf:deep-equal
(node
$parameter1
, node
$parameter2
, anyURI
$collation
) =>
boolean
If the node identified by the value of $parameter1
has the same value as the node identified by the value of $parameter2
, then the function returns true
; otherwise, the function returns false
.
We define deep-equality as follows. We assume equality over simple values is defined. Equality of string values is determined according to the collation that is used. Equality over all other data model values is defined recursively:
Given attributes a1 and a2,
xf:deep-equal
(a1,a2),
if and only if
xf:deep-equal
(name
(a1), name
(a2)) and
xf:deep-equal
(value
(a1), value
(a2)).
Given elements e1 and e2,
xf:deep-equal
(e1, e2),
if and only if
xf:deep-equal
(name
(e1), name
(e2)) and
xf:deep-equal
(attributes
(e1), attributes
(e2)) and
xf:deep-equal
(children
(e1), children
(e2)).
Given two sequences (u1, ...,
uj) and
(v1, ..., vk),
xf:deep-equal
((u1,
..., uj),
(v1, ...,
vk)) holds if and
only if j = k and xf:deep-equal
(ui,
vi) holds for all 1 <= i <=
n.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
[Issue 158: We need equality functions for all simple datatypes. See also, issue 151.]
op:node-before
(node
$parameter1
, node
$parameter2
) =>
boolean
If the node identified by the value of $parameter1
occurs in document order before the node identified by the value of $parameter2
, this function returns true
; otherwise, it returns false
. The rules determining the order of nodes within a single document and in different documents can be found in [XQuery 1.0 and XPath 2.0 Data Model]. This function backs up the "<<" operator.
op:node-after
(node
$parameter1
, node
$parameter2
) =>
boolean
If the node identified by the value of $parameter1
occurs in document after the node identified by the value of $parameter2
, this function returns true
; otherwise, it returns false
. The rules determining the order of nodes within a single document and in different documents can be found in [XQuery 1.0 and XPath 2.0 Data Model].
This function backs up the ">>" operator.
xf:copy
(node?
$srcval
) =>
node?
Returns a copy of the node that is the value of $srcval
including all its attributes and descendants; the copy has a different identity than the node indicated by the value of $srcval
.
Note:
XSLT will not support this function.
[Issue 60: What are the precise semantics of the copy() function?]
$var = xf:copy($item1)
creates a node that is a copy of the value of $item1, including its attributes and descendants, gives it a different identity, and sets the value of $var equal to it. Assume that the value of $item1
was the element node:
<family name='green'> <father>peter</father> <mother>mary<mother> <child>joseph</child> </family>
The value of $var
would be
<family name='green'> <father>peter</father> <mother>mary<mother> <child>joseph</child> </family>
xf:shallow
(node?
$srcval
) =>
node?
Returns a copy of the node that is the value of $srcval
including all its attributes but not its descendants; the copy has a different identity than the node indicated by the value of $srcval
.
Note:
XSLT will not support this function.
$var = xf:copy($item1)
creates a node that is a copy of $item1, including only its attributes and not its descendants, gives it a different identity, and sets the value of $var
equal to it. Assume that the value of $item1
was the element node:
<family name='green'> <father>peter</father> <mother>mary<mother> <child>joseph</child> </family>
The value of $var
would be
<family name='green'/>
Function | Meaning | Source |
xf:if-absent
| If first argument is the empty sequence, returns second argument; otherwise returns content of first argument. | XQuery |
xf:if-empty
| If first argument is the empty sequence or an element node with empty content, returns second argument; otherwise returns content of first argument. | XQuery |
It is sometimes desirable to write arithmetic expressions in which absent data will be replaced by a default value. For example, it might be desirable for the expression emp/(salary + bonus) to return the salary in the case where an employee has no bonus. The + operator will return the empty sequence in this case. The above functions address this problem.
xf:if-absent
((elementNode | attributeNode)?
$node
, anySimpleType
$value
) =>
(elementNode | attributeNode | anySimpleType)?
If the first argument is the empty sequence, if-absent() returns the second argument; otherwise it returns the content of the first argument.
xf:if-empty
((elementNode | attributeNode)?
$node
, anySimpleType
$value
) =>
(elementNode | attributeNode | anySimpleType)
If the first argument is the empty sequence or an element with empty content, if-empty() returns the second argument; otherwise it returns the content of the first argument.
[Issue 155: The term 'empty content' should be changed or, at least, be carefully defined.]
A sequence
is an ordered collection of zero or more items
. An item
is either a node or a value. The terms sequence
and item
are defined formally in [XQuery 1.0: An XML Query Language] and [XPath 2.0].
[Issue 82: Clarify distinction between node sets, lists, and sequences]
[Issue 89: Functions that have anyType in their return are problematic.]
The following constructors are defined for sequences.
Operator | Meaning |
op:to
| Returns the sequence containing every integer between the values of the operands. |
op:to
(decimal
$firstval
, decimal
$lastval
) =>
sequence
The effective values of $firstval
and $lastval
are computed as cast as
integer(floor($firstval))
and
cast as integer(floor($lastval))
.
Converts both its operands to integers and returns the sequence containing every integer whose value is between the effective value of $firstval
(inclusive) and the effective value of $lastval
(inclusive), in monotonic order. If the effective value of the first operand is less than the effective value of the second, the sequence is in increasing order, otherwise it is in decreasing order. If the effective value of the two operands is equal, a sequence containing a single integer equal to the effective value is returned.
This function backs up the "to" operator.
The following functions are defined on sequences.
Function | Meaning | Source |
xf:boolean
| Casts a sequence to a boolean. See also 14.6 Casting to boolean . | XPath 1.0 |
op:concatenate
| Concatenates two sequences. | XPath 1.0 |
op:item-at
| Returns the item at given index. | XPath 2.0 Req 4.4 (Should) |
xf:index-of
| Returns a sequence of unsignedInts, each of which is the index of a member of the specified sequence that is equal to the simple value or node that is the value of the second argument. If no members of the specified sequence are equal to the value of the second argument, the function returns an empty sequence. | XPath 2.0 Req 4.4 (Should) |
xf:empty
| Indicates whether or not the provided sequence is empty. | XPath 2.0 Req 4.4 (Should) |
xf:exists
| Indicates whether or not the provided sequence is not empty. | |
xf:distinct-nodes
| Returns a sequence in which all redundant duplicate elements, based on node identity, have been deleted. The specific node in a collection of redundant duplicate nodes that is retained in implementation-dependent. | XPath 2.0 Req 4.4 (Should) |
xf:distinct-values
| Returns a sequence in which all redundant duplicate elements, based on value equality, have been deleted. The specific node in a collection of redundant duplicate nodes that is retained in implementation-dependent. | XPath 2.0 Req 4.4 (Should) |
xf:insert
| Inserts an element or sequence of elements into a specified position of a sequence. | XPath 2.0 Req 2.4, 4.4 (Should) |
xf:sublist
| Returns a sequence located at a specified place in the value of a given sequence. | XPath 2.0 Req 4.4 (Should) |
[Issue 63: Do we need variations of index-of for values and identity?]
[Issue 66: A function to reorder a sequence into document order is needed]
As in the previous section, for the illustrative examples below, assume an XQuery operating on a Purchase Order document containing a number of item elements. The variable $seq
is bound to the sequence of item nodes in document order. The variables $item1
, $item2
, etc. are bound to individual item nodes in the sequence.
xf:boolean
(item*
$srcval
) =>
boolean
If $srcval
is the empty sequence, returns false
. If $srcval
is a sequence containing more than one item, a type exception is thrown. A sequence with a single item is equivalent to the single item. If this is an untyped node a type exception is thrown, otherwise its typed-value is accessed. The value is then converted to boolean as defined in 14.6 Casting to boolean .
[Issue 156: How should the boolean function be defined? Legacy XPath 1.0 function? ]
op:concatenate
(item*
$seq1
, item*
$seq2
) =>
item*
Returns a sequence consisting of the items in $seq1
followed by the items in $seq2
. This function backs up the infix operator ",". If either sequence is the empty sequence, the other operand is returned.
op:item-at
(item*
$seqParam
, decimal
$posParam
) =>
item?
Returns the item in $seqParam
that is located at the index that is the value of $posParam
.
If $seqParam
is the empty sequence, returns the empty sequence.
If the value of $posParam
is greater than the number of items in the sequence, or is less than or equal to zero, then the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
This function is used in the definition of the formal semantics of filter expressions, that is, expressions of the form expression-1[expression-2]
xf:index-of
(item*
$seqParam
, item
$srchParam
) =>
unsignedInt?
xf:index-of
(item*
$seqParam
, item
$srchParam
, anyURI
$collationLiteral
) =>
unsignedInt?
If the value of $seqParam
contains only simple values, then the function returns a sequence of unsigned integers indicating the indexes (positions) of items in the value of $seqParam
that are equal to the simple value of $srchParam
. If the data types of the simple values are strings, then equality is determined according to the collation that is used.
If the value of $seqParam
contains nodes, then the function returns a sequence of unsigned integers indicating the indexes (positions) of nodes whose string values are equal to the string value of the node in the second argument. Equality of string values is determined according to the collation that is used.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
The sequence must contain either simple values or nodes, not both. In addition, if the sequence
contains simple values $srchParam
must be a simple value and
if the sequence contains nodes $srchParam
must be a node.
If the above conditions are violated, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If the value of $seqParam
is the empty sequence, the empty sequence is returned.
The index is 1-based (not 0-based).
xf:empty
(item*
$srcval
) =>
boolean
If the the value of $srcval
is the empty sequence, the function returns true
; otherwise, the function returns false
.
xf:exists
(item*
$srcval
) =>
boolean
If the the value of $srcval
is not the empty sequence, the function returns true
; otherwise, the function returns false
.
xf:distinct-nodes
(node*
$srcval
) =>
node*
Returns the sequence that results from removing from $srcval
all but one of a set of nodes that have the same identity as one another, based on node identity (that is, using node-equal()
). The specific occurrence in a collection of identical nodes that is retained is implementation-dependent. If $srcval
is the empty sequence, returns the empty sequence.
If the sequence contains one or more simple values, then the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
[Issue 128: doc-order() function needed?]
[Issue 154: Should we define a second order distinct function?]
xf:distinct-values
(item*
$srcval
) =>
item*
xf:distinct-values
(item*
$srcval
, anyURI
$collationLiteral
) =>
item*
$srcval
must contain either simple values or nodes, not both. If the sequence contains both simple values and nodes, then the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If $srcval
contains only nodes, returns the sequence that results from removing from $srcval
all but one of a set of nodes that are equal to one other, based on the nodes' values (that is, using deep-equal()
). The specific node in a collection of nodes having equal values that is retained is implementation-dependent.
If $srcval
contains only values, returns the sequence that results from removing from $srcval
all but one of a set of values that are eq
to one other. Values of the same type must have a total order: date/time values must either all contain a timezone or all not contain a timezone; duration values must all contain either only years and months or only days, hours, minutes and seconds. If this condition is not satisfied, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
Equality of string values are determined according to the collation that is used. The specific node in a collection of values having equal values that is retained is implementation-dependent.
If $srcval
is the empty sequence, returns the empty sequence.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:insert
(item*
$target
, decimal
$position
, item*
$inserts
) =>
item*
Returns a new sequence constructed from the value of $target
with the value of $inserts
inserted at the position specified by the value of $position
. (The value of $target
is not affected by the sequence construction.)
Let the effective value of $position
be N computed as cast as
unsignedInt(floor($position))
.
If N is less than zero, the effective value of N is zero. If N is greater than the number of items in $target
, then the effective value of N is equal to the number of items in $target
plus 1.
The value returned by the function consists of all items of $target
whose index is less than or equal to N, followed by all items of $inserts
, followed by the remaining elements of $target
, in that sequence.
If $target
is the empty sequence, a copy of $inserts
is returned. If $inserts
is the empty sequence, a copy of $target
is returned.
xf:remove
(item*
$target
, decimal
$position
) =>
item*
Returns a new sequence constructed from the value of
$target
with the item
at the position specified by the value of $position
removed.
Let the effective value of $position
be N computed as cast as
unsignedInt(floor($position))
.
If N is less than 1 or greater than the number of items in
$target
, no action is taken. Otherwise, the value
returned by the function consists of all items of $target
whose index is less than N, followed by
all items of $target
whose index is greater than N. If $target
is the
empty sequence, the empty sequence is returned.
xf:sublist
(item*
$sourceSeq
, decimal
$startingLoc
) =>
item*
xf:sublist
(item*
$sourceSeq
, decimal
$startingLoc
, decimal
$length
) =>
item*
Returns the contiguous sequence of items in the value of $sourceSeq
beginning at the position indicated by the value of $startingLoc
and continuing for the number of items indicated by the value of $length
.
If $length
is not specified, then the sublist identifies items to the end of $sourceSeq
.
The value of $length
can be greater than the number of items in the value of $sourceSeq
following the beginning position, in which case the sublist identifies items to the end of $length
.
The first item of a sequence is located at position 1 (not position 0).
If $sourceSeq
is the empty sequence, returns the empty sequence.
Function | Meaning | Source |
xf:sequence-deep-equal
| Returns true if the two arguments have the same value. | Data Model |
xf:sequence-node-equal
| Returns true if the two arguments have the same nodes. | Data Model |
op:union
| Returns the union of the two sequence arguments, eliminating duplicates. | XPath 2.0 Req 1.5 (Should) |
op:intersect
| Returns the intersection of the two sequence arguments, eliminating duplicates. | XPath 2.0 Req 1.5 (Should) |
op:except
| Returns the difference of the two sequence arguments, eliminating duplicates. | XPath 2.0 Req 1.5 (Should) |
[Issue 91: Need value-based functions for Union, Intersect and Except.]
[Issue 132: union(), intersect(), and except(): only for simple values?]
As in the previous sections, for the illustrative examples below, assume a XQuery operating on a Purchase
Order document containing a number of item elements. The variables
$item1
, $item2
, etc. are bound to individual item nodes in the sequence. We shall use sequences of these nodes in the examples below.
xf:sequence-deep-equal
(item*
$parameter1
, item*
$parameter2
) =>
boolean?
xf:sequence-deep-equal
(item*
$parameter1
, item*
$parameter2
, anyURI
$collationLiteral
) =>
boolean?
If the sequences that are the values of $parameter1
and $parameter2
have the same values (that is, they have the same number of items and items in corresponding positions in the two sequences compare equal if they are values and deep-equal()
if they are nodes.), then the function returns true
; otherwise, the function returns false
. Returns the empty sequence if one or both of its arguments is the empty sequence.
String values are compared according to the collation that is used.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:sequence-node-equal
(item*?
$parameter1
, item*?
$parameter2
) =>
boolean?
If the sequences that are the values of $parameter1
and $parameter2
have the same nodes as content (that is, they have the same number of items and items in corresponding positions in the two sequences are the identical nodes), then the function returns true
; otherwise, the function returns false
. Returns the empty sequence if one or both of its arguments is the empty sequence.
The sequences must contain only nodes. If either sequence contains both simple values and nodes, then the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
op:union
(item*
$parameter1
, item*
$parameter2
) =>
item*
Constructs a sequence containing every element that occurs in the
values of $parameter1
or of $parameter2
,
eliminating duplicate items. Nodes are returned in document order. The order of simple values is implementation dependent.
Node items are equal if they are xf:node-equal()
; simple-values are
equal if they satisfy the eq
operator; nodes and simple values are never equal.
This function backs up the "union" or "|" operator.
op:intersect
(item*
$parameter1
, item*
$parameter2
) =>
item*
Constructs a sequence containing every item that occurs in the values of both $parameter1
and $parameter2
, eliminating duplicate items. Nodes are returned in document order. The order of simple values is implementation dependent.
If either operand is the empty sequence, the empty sequence is returned.
Node items are equal if they are xf:node-equal()
; simple-values are
equal if they satisfy the eq
operator; nodes and simple values are never equal.
This function backs up the "intersect" operator.
op:except
(item*
$parameter1
, item*
$parameter2
) =>
item*
Constructs a sequence containing every item that occurs in the values of $parameter1
, but not in the value of $parameter2
, eliminating duplicate items. Nodes are returned in document order. The order of simple values is implementation dependent.
If $parameter1
is the empty sequence, the empty sequence is
returned. If $parameter2
is the empty sequence, a copy of
$parameter1
is returned.
Node items are equal if they are xf:node-equal()
; simple-values are
equal if they satisfy the eq
operator; nodes and simple values are never equal.
This function backs up the "except" operator.
Aggregate functions take a sequence as argument and return a single value computed from values in the sequence. Except for xf:count, if the sequence contains nodes, the value is extracted from the node and used in the computation.
Function | Meaning | Source |
xf:count
| Returns the number of items in the sequence. | XPath 1.0 |
xf:avg
| Returns the average of a sequence of numbers. | XSLT 2.0 Req. 1.4 (Must) |
xf:max
| Returns the object with maximum value from a collection of comparable objects. | XSLT 2.0 Req. 1.4 (Must) |
xf:min
| Returns the object with minimum value from a collection of comparable objects. | XSLT 2.0 Req. 1.4 (Must) |
xf:sum
| Returns the sum of a sequence of numbers. | XSLT 1.0 |
xf:count
(item*
$srcval
) =>
unsignedInt
Returns the number of items in the value of $srcval
.
[Issue 67: Should duplicates be eliminated for count() and sum()?]
xf:avg
(item*
$srcval
) =>
double?
If $srcval
contains nodes, the value of each node is extracted using the xf:data() function. Values that equal the empty sequence are discarded. If after this, $srcval
contains only numbers, xf:avg() returns the average of the numbers (computed as sum($srcval) div count($srcval)
). If $srcval
is the empty sequence, the empty sequence is returned.
If, after extracting the values from nodes, $srcval
does not contain only numbers, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:max
(item*
$srcval
) =>
anySimpleType?
xf:max
(item*
$srcval
, anyURI
$collationLiteral
) =>
anySimpleType?
If $srcval
contains nodes, the value of each node is extracted using the xf:data() function. Values that equal the empty sequence are discarded. If, after this, $srcval
is the empty sequence, the empty sequence is returned. After extracting the values from nodes, $srcval
must contain only values of a single type. (For numeric values, the type promotion rules defined in
3.3 Operators on Numeric Values can be used to promote them to a single type.) In addition, the values in the sequence must have a total order: date/time values must either all contain a timezone or all not contain a timezone; duration values must all contain either only years and months or only days, hours, minutes and seconds. If either of these conditions is not true, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:max returns the item in the value of $srcval
whose value is greater than the value of every other item in the value of $srcval
. If there are two or more such items, then the specific item whose value is returned is implementation-dependent.
If the items in the value of $srcval
are strings, then the determination of the greatest item is made according to the collation that is used.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:min
(item*
$srcval
) =>
anySimpleType?
xf:min
(item*
$srcval
, anyURI
$collationLiteral
) =>
anySimpleType?
If $srcval
contains nodes, the value of each node is extracted using the xf:data() function. Values that equal the empty sequence are discarded. If, after this, $srcval
is the empty sequence, the empty sequence is returned. After extracting the values from nodes, $srcval
must contain only values of a single type. (For numeric values, the type promotion rules defined in
3.3 Operators on Numeric Values can be used to promote them to a single type.) In addition, the values in the sequence must have a total order: date/time values must either all contain a timezone or all not contain a timezone; duration values must all contain either only years and months or only days, hours, minutes and seconds. If either of these conditions is not true, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
xf:min returns the item in the value of $srcval
whose value is less than the value of every other item in the value of $srcval
. If there are two or more such items, then the specific item whose value is returned is implementation-dependent.
If the items in the value of $srcval
are strings, then the determination of the least item is made according to the collation that is used.
If $collationLiteral
is specified, then the value of $collationLiteral
must identify a collation that is supported in the environment in which the function is invoked. Either an absolute URI or a relative URI may be specified. The collation identified by $collationLiteral
, while effectively based on the Unicode Collation Algorithm, has implementation-defined semantics.
If no collation is specified, then the default collation is used. The default collation is determined according to the rules in TO BE DETERMINED.
xf:sum
(item*
$srcval
) =>
double?
If $srcval
contains nodes, the value of each node is extracted using the xf:data() function. Values that equal the empty sequence are discarded. If, after this, $srcval
contains only numbers, xf:sum() returns the sum of the numbers. If it is the empty sequence, the empty sequence is returned.
If, after extracting the values from nodes, $srcval
does not contain only numbers, the function returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
[Issue 67: Should duplicates be eliminated for count() and sum()?]
Function | Meaning | Source |
xf:id
| Returns the sequence of nodes having unique IDs that match the IDREFs represented by the argument sequence. | XPath 1.0 |
xf:idref
| Returns the sequence of nodes with IDREFs matching the items in the argument sequence. | XSLT 2.0 Req. 2.11 (Could) |
xf:filter
| Returns a shallow copy of the nodes that are selected by the expression argument, preserving any relationships that exist among these nodes. | XQuery |
xf:document
| Treats its string argument as a URI Reference and returns the document node of the referenced document. | XSLT 1.0 |
[Issue 68: The id-nodes() and id-NMTOKENS() functions must specify result documents]
xf:id
(IDREF*
$srcval
) =>
elementNode*
Returns the sequence of element nodes with ID values matching
the value of one of the IDREFs in the sequence argument. If the value of
$srcval
is a single IDREF, it behaves as though a sequence of length one of was supplied.
xf:idref
(string*
$srcval
) =>
elementNode*
Returns the sequence of element nodes with an IDREF value
matching the value of one of the items in the sequence argument or an IDREFS value containing an IDREF matching the value of one of the items in the sequence argument. If the value of $srcval
is a single string, it behaves as though a sequence of length one of strings was supplied. This function allows reverse navigation from IDs to IDREFs.
xf:filter
(expression
$srcval
) =>
node*
The filter function returns a sequence of nodes containing shallow copies of the nodes that are selected by expression that is the value of $srcval
, preserving any relationships that exist among these nodes.
Suppose that the argument to filter is a path expression that selects nodes X, Y, and Z from some document. Suppose that, in the original document, nodes Y and Z are descendants (at any level) of node X. Then the result of filter is a copy of node X, with copies of nodes Y and Z as its immediate children. Any other intervening nodes from the original document are not includeed in the result. The name filter suggests a function that operates on a document to extract the parts that are of interest and discard the remainder, while retaining the structure of the original document.
xf:document
(string?
$srcval
) =>
node?
Treats the string value of $srcval as a URI reference and returns the document node of the referenced document. Returns an error if the document cannot be accessed. [XSLT 1.0] allows many other kinds of arguments and returns a sequence of nodes.
The following functions are defined to obtain information from the evaluation context.
Function | Meaning | Source |
op:context-item
| Returns the context item. | XPath 1.0 |
xf:position
| Returns the position of the context item within the sequence of items currently being processed. | XPath 1.0 |
xf:last
| Returns the number of items in the sequence of items currently being processed. | XPath 1.0 |
op:context-document
| Returns the source document currently being processed. | XPath 1.0 |
xf:current-dateTime
| Returns the current dateTime. | XPath 1.0 |
Returns the context item i.e. the item currently being processed. This is the function behind the "." operator.
Returns an unsignedInt indicating the position of the context item within the sequence of items currently being processed.
Returns an unsignedInt indicating the number of items in the sequence of items currently being processed.
Returns the dateTime that is current at some time during the evaluation of the XQuery or XPath expression in which currentDateTime()
is executed. All invocations of current-dateTime()
that are executed during the course of a single outermost XQuery or XPath expression return the same value. The precise instant during that XQuery or Xpath expression's evaluation represented by the value of current-dateTime()
is implementation-defined.
Cast functions or cast operators take an expression as their argument and return a value of a given type. There are two basic differences from constructor: casting takes an expression rather than a literal as argument, and validity checking is done at run time rather than at compile time.
This specification starts by defining casting between the 19 primitive types defined in [XML Schema Part 2: Datatypes]. The type conversions that are supported are indicated in the table below. In this table, there is a row for each primitive with that type as the source of the conversion and there is a column for each primitive type as the target of the conversion. The intersections of rows and columns contain one of three characters: "Y" indicates that a conversion from values of the type to which the row applies to the type to which the column applies is supported; "N" indicates that there are no supported conversions from values of the type to which the row applies to the type to which the column applies; and "M" indicates that a conversion from values of the type to which the row applies to the type to which the column applies may be supported, subject to restrictions dicsussed in this section.
[Issue 135: Should we allow casting to/from derived types?]
In the following tables, the columns and rows are identified by short codes that identify simple types as follows:
aURI = anyURI
b64 = base64Binary
bool = boolean
dat = date
Day = gDay
dbl = double
dec = decimal
dT = dateTime
dur = duration
flt = float
hxB = hexBinary
MD = gMonthDay
Mon = gMonth
NOT = NOTATION
QN = Qname
str = string
tim = time
YM = gYearMonth
Yr = gYear
In each of the following tables, the notation "S\T" indicates that the source ("S") of the conversion is indicated in the column below the notation and that the target ("T") is indicated in the row to the right of the notation.
The following table covers casting from primitive types to primitive types.
S\T | str | flt | dbl | dec | dur | dT | tim | dat | YM | Yr | MD | Day | Mon | Bool | b64 | hxB | aURI | QN | NOT |
str | Y | M | M | M | M | M | M | M | M | M | M | M | M | M | N | N | M | M | N |
flt | Y | Y | Y | M | N | N | N | N | N | N | N | N | N | M | N | N | N | N | N |
dbl | Y | Y | Y | M | N | N | N | N | N | N | N | N | N | M | N | N | N | N | N |
dec | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | M | N | N | N | N | N |
dur | Y | N | N | N | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | N |
dT | Y | N | N | N | N | Y | N | N | N | N | N | N | N | N | N | N | N | N | N |
tim | Y | N | N | N | N | N | Y | N | N | N | N | N | N | N | N | N | N | N | N |
dat | Y | N | N | N | N | N | N | Y | Y | N | N | N | N | N | N | N | N | N | N |
YM | Y | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N | N | N | N |
Yr | Y | N | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N | N | N |
MD | Y | N | N | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N | N |
Day | Y | N | N | N | N | N | N | N | N | N | N | Y | N | N | N | N | N | N | N |
Mon | Y | N | N | N | N | N | N | N | N | N | N | N | Y | N | N | N | N | N | N |
bool | Y | Y | Y | Y | N | N | N | N | N | N | N | N | N | Y | N | N | N | N | N |
b64 | Y | N | N | N | N | N | N | N | N | N | N | N | N | M | Y | N | N | N | N |
hxB | Y | M | M | M | N | N | N | N | N | N | N | N | N | M | N | Y | M | N | N |
aURI | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | Y | N | N |
QN | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | Y | N |
NOT | Y | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | N | Y |
Casting from a derived type to its base type is always permitted. No other casting from a derived type is supported.
Casting is permitted from any primitive to the primitive type string
.
When a value of any simple type is cast to string
, the derivation of the string
value TV depends on the source type ST and on the source value SV, as follows.
If ST is string
,
TV is SV.
If ST is float
, double
, or decimal
then TV is the canonical representation of SV, as defined by [XML Schema Part 2: Datatypes].
If ST is duration
, then TV is the lexical representation of SV, as defined by [XML Schema Part 2: Datatypes], in which each integer and decimal component is expressed in its canonical representation.
If ST is dateTime
or time
, then TV is the canonical representation of SV, as defined by [XML Schema Part 2: Datatypes].
If ST is date
, gYearMonth
, gYear
, gMonthDay
, gDay
, or gMonth
, then TV is the lexical representation of SV, as defined by [XML Schema Part 2: Datatypes].
If ST is boolean
, then TV is "true" if SV is true and "false" if SV is false.
If ST is hexBinary
, then TV is the canonical representation of SV, as defined by [XML Schema Part 2: Datatypes].
If ST is anyURI
, then TV is the lexical representation of SV, as defined in [XML Schema Part 2: Datatypes], with each space replaced by the sequence "%20".
If ST is QName
or NOTATION
, then TV is SV.
As specified in the preceding table, conversion from various simple types to the various numeric types (that is, float
, double
and decimal
depends on factors considered below.
When a value of any simple type is cast to float
, the float
value TV is derived from the source type ST and the source value SV as follows:
If ST is float
, then TV is SV and the conversion is complete.
If ST is double
and SV cannot be represented in the value space of float
as defined in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is double
and SV can be represented in the value space of float
as defined in [XML Schema Part 2: Datatypes], then TV is SV and the conversion is complete.
If ST is decimal
or a type derived from decimal
, then TV is xf:float(cast as string(
SV
))
and the conversion is complete.
SV is converted to an intermediate value IV of type token
.
If the value of xf:upper-case(
IV
)
is INF
, -INF
, or NAN
, then TV is positive infinity, negative infinity, or not-a-number, respectively, and the conversion is complete.
If IV does not match the lexical structure of NumericLiteral
as defined in [XQuery 1.0: An XML Query Language], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
Otherwise, let NL be a NumericLiteral
comprising the same sequence of characters as IV. TV is xf:float(
NL
)
.
When a value of any simple type is cast to double
, the double
value TV is derived from the source type ST and the source value SV as follows:
If ST is double
, then TV is SV and the conversion is complete.
If ST is float
or decimal
or types derived from them, then TV is xf:double(cast as string(
SV
))
and the conversion is complete.
SV is converted to an intermediate value IV of type token
.
If the value of xf:upper-case(
IV
)
is INF
, -INF
, or NAN
, then TV is positive infinity, negative infinity, or not-a-number, respectively, and the conversion is complete.
If IV does not match the lexical structure of NumericLiteral
as defined in [XQuery 1.0: An XML Query Language], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
Otherwise, let NL be a NumericLiteral
comprising the same sequence of characters as IV. TV is xf:double(
NL
)
.
When a value of any simple type is cast to decimal
, the decimal
value TV is derived from the source type ST and the source value SV as follows:
If ST is decimal
, or a type derived from decimal
, then TV is decimal(cast as string(
SV
))
and the conversion is complete.
If ST is float
or double
, then TV is decimal(cast as string(xf:round(
SV
)))
and the conversion is complete.
SV is converted to an intermediate value IV of type token
.
If IV does not match the lexical structure of NumericLiteral
as defined in [XQuery 1.0: An XML Query Language], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
Otherwise, let NL be a NumericLiteral
comprising the same sequence of characters as IV. TV is decimal(cast as string(xf:round(
NL
)))
.
Conversion from primitive types to duration and date and time types depends on factors considered below.
When a value of any primitive type is cast to duration
, the duration
value TV is derived from the source type ST and the source value SV as follows:
If ST is duration
, then TV is SV.
If ST is string
or a type derived from string
, then TV is xf:duration(cast as string(
SV
))
.
When a value of any primitive type is cast to dateTime
, time
, date
, gYearMonth
, gYear
,
gMonthDay
, gDay
, or gMonth
, let CYR be cast as string( xf:get-Year( xf:currentDateTime() ) )
, let CMO be cast as string( xf:get-month( xf:currentDateTime() ) )
, and let CDA be cast as string( xf:get-day( xf:currentDateTime() ) )
.
When a value of any primitive type is cast to dateTime
, the dateTime
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
, then TV is SV.
If ST is time
, then let SHR be cast as string( xf:get-hour(
SV
) )
, let SMI be cast as string( xf:get-minute(
SV
) )
, and let SSE be cast as string( xf:get-second(
SV
) )
; TV is xf:dateTime( xf:concat(
CYR
, '-',
CMO
, '-',
CDA
, 'T',
SHR
, ':',
SMI
, ':',
SSE
) )
.
If ST is date
, then let SYR be cast as string( xf:get-Year(
SV
) )
, let SMO be cast as string( xf:get-month(
SV
) )
, and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-',
SMO
, '-',
SDA
, 'T00:00:00') )
.
If ST is gYearMonth
, then let SYR be cast as string( xf:get-Year(
SV
) )
and let SMO be cast as string( xf:get-month(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-',
SMO
, '-01T00:00:00') )
.
If ST is gYear
, then let SYR be cast as string( xf:get-Year(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-01-01T00:00:00') )
.
If ST is gMonthDay
, then let SMO be cast as string( xf:get-month(
SV
) )
and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:dateTime( xf:concat(
CYR
, '-',
SMO
, '-',
SDA
, 'T00:00:00') )
.
If ST is gDay
, then let SDA be cast as string(
SV
)
; TV is xf:dateTime( xf:concat(
CYR
, '-',
CMO
, '-',
SDA
, 'T00:00:00') )
.
If ST is gMonth
, then let SMO be cast as string(
SV
)
; TV is xf:dateTime( xf:concat(
CYR
, '-',
SMO
, '-01T00:00:00') )
.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for dateTime
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for dateTime
as specified in [XML Schema Part 2: Datatypes], then TV is xf:dateTime(
SV
)
.
When a value of any primitive type is cast to time
, the time
value TV is derived from the source type ST and the source value SV as follows:
If ST is time
, then TV is SV.
If ST is dateTime
, then TV is xf:time( xf:concat( cast as string( xf:get-hour(
SV
) ), ':', cast as string( xf:get-minute(
SV
) ), ':', cast as string( xf:get-second(
SV
) ) ) )
.
If ST is string
or a type derived from string
and SV is a valid lexical representation for time
as specified in [XML Schema Part 2: Datatypes], then TV is xf:time(
SV
)
.
When a value of any primitive type is cast to date
, the date
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
, then let SYR be cast as string( xf:get-Year(
SV
) )
, let SMO be cast as string( xf:get-month(
SV
) )
, and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-',
SMO
, '-',
SDA
) )
.
If ST is date
, then TV is SV.
If ST is gYearMonth
, then let SYR be cast as string( xf:get-Year(
SV
) )
and let SMO be cast as string(xf:get-month(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-',
SMO
, '-01') )
.
If ST is gYear
, then let SYR be cast as string( xf:get-Year(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-01-01') )
.
If ST is gMonthDay
, then let SMO be cast as string( xf:get-month(
SV
) )
and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:dateTime( xf:concat(
CYR
, '-',
SMO
, '-',
SDA
) )
.
If ST is gDay
, then let SDA be cast as string(
SV
)
; TV is xf:dateTime( xf:concat(
CYR
, '-',
CMO
, '-',
SDA
) )
.
If ST is gMonth
, then let SMO be cast as string (
SV
)
; TV is xf:dateTime( xf:concat(
CYR
, '-',
SMO
, '-01') )
.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for date
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for date
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV
)
.
When a value of any primitive type is cast to gYearMonth
, the gYearMonth
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
or date
, then let SMO be cast as string( xf:get-month(
SV
) )
and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:gYearMonth( xf:concat(
SMO
, '-',
SDA
) )
.
If ST is gYearMonth
, then TV is SV.
If ST is gYear
, then let SYR be cast as string( xf:get-Year(
SV
) )
; TV is xf:dateTime( xf:concat(
SYR
, '-01') )
.
If ST is gMonthDay
or gMonth
, then let SMO be cast as string( xf:get-month(
SV
) )
; TV is xf:dateTime( xf:concat(
CYR
, '-',
SMO
) )
.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for gYearMonth
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for gYearMonth
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV
)
.
When a value of any primitive type is cast to gYear
, the gYear
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
, date
, or gYearMonth
then let SYR be cast as string( xf:get-Year(
SV
) )
; TV is xf:gYear(
SYR
)
.
If ST is gYearMonth
, then TV is SV.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for gYear
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for gYear
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV
)
.
When a value of any primitive type is cast to gMonthDay
, the gMonthDay
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
or date
, then let SMO be cast as string( xf:get-month(
SV
) )
and let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:gYearMonth( xf:concat(
SMO
, '-',
SDA
) )
.
If ST is gYearMonth
, then let SMO be cast as string( xf:get-month(
SV
) )
; TV is xf:dateTime( xf:concat(
SMO
, '-01') )
.
If ST is gMonthDay
, then TV is SV.
If ST is gDay
, then let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:dateTime( xf:concat(
CMO
,
CDA
) )
.
If ST is gMonth
, then let SMO be cast as string( xf:get-month(
SV
) )
; TV is xf:dateTime( xf:concat(
SMO
, '-01') )
.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for gMonthDay
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for gMonthDay
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV
)
.
When a value of any primitive type is cast to gDay
, the gDay
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
, date
, or gMonthDay
, then let SDA be cast as string( xf:get-day(
SV
) )
; TV is xf:gDay(
SDA
)
.
If ST is gDay
, then TV is SV.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for gDay
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for gDay
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV
)
.
When a value of any primitive type is cast to gMonth
, the gMonth
value TV is derived from the source type ST and the source value SV as follows:
If ST is dateTime
, date
, gYearMonth
, or gMonthDay
, then let SMO be cast as string( xf:get-month(
SV
) )
; TV is xf:gMonth(
SMO
)
.
If ST is gMonth
, then TV is SV.
If ST is string
or a type derived from string
and SV is not a valid lexical representation for gMonth
as specified in [XML Schema Part 2: Datatypes], then the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
If ST is string
or a type derived from string
and SV is a valid lexical representation for gMonth
as specified in [XML Schema Part 2: Datatypes], then TV is xf:date(
SV )
.
When a value of any primitive type is cast to boolean
, the boolean
value TV is derived from the source type ST and the source value SV as follows:
If ST is string
and xf:upper-case(
SV
)
is "
TRUE
" or "
1
", then TV is true
; if ST is string
and xf:upper-case(
SV
)
is "
FALSE
" or "
0
", then TV is false
.
If ST is float
, double
, decimal
and SV is 0, +0, -0 or NaN then TV is false
.
If ST is float
, double
, decimal
and SV is not one of the above values then TV is true
.
If ST is boolean
, then TV is SV.
If ST is base64Binary
or hexBinary
and SV is "
1
", then TV is true
; if ST is base64Binary
or hexBinary
and SV is "
0
", then TV is false
.
Otherwise, the error value is returned as specified in [XQuery 1.0 and XPath 2.0 Data Model].
Casting from any other simple type to base64Binary
and hexBinary
is not supported.
Casting to anyURI
, or QName
is possible only from the same type or possibly from string
.
When a value of any primitive type is cast to anyURI
, the anyURI
value TV is derived from the source type ST and the source value SV as follows:
If ST is string
or normalizedString
and SV conforms to the format of a Uniform Resource Identifier Reference as specified in [XML Schema Part 2: Datatypes], then TV is SV.
Otherwise, the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
When a value of any primitive type is cast to QName
, the QName
value TV is derived from the source type ST and the source value SV as follows:
If ST is string
or normalizedString
and SV conforms to the format of a QName as specified in [XML Schema Part 2: Datatypes], then TV is SV.
Otherwise, the cast returns the error value as defined in [XQuery 1.0 and XPath 2.0 Data Model].
It is not possible to cast values of any other type to NOTATION
because the validity of a NOTATION
value is context dependent and cannot, in general, be determined.
This section contains the current issues related to the operators specification.
Originator: | Operator Editors |
Locus: | Syntax |
The mechanism of determining the precise XML Schema type of a numeric literal value has not yet been determined. The two broad approaches are (1)to determine the absolute value of the literal and determine its Schema type based on the range of values into which it falls, versus (2) to use additional syntax in the style of the C or Java programming languages to specify the Schema type.
Resolution:
Numeric literals' types are determined by their syntax, not by their values.
Originator: | Andrew Eisenberg |
Locus: | Syntax |
We include the "<" operator in this table. "<" followed by a letter, a "_", or a "." is an element constructor. Does this mean that "<" followed by whitespace (or any other character) is the less-than operator?
Resolution:
"<" is acceptable as the less-than operator as long as it is not followed by a character that can start an XML identifier.
Originator: | Andrew Eisenberg |
Locus: | Syntax |
We state that decimal op decimal returns decimal. Don't we need to be taking precision and scale into account (this issue applies to the constructors as well)? If my expression is 4.5 * 2.11, SQL would state that the operands are DECIMAL (2,1) and DECIMAL (3,2), and the result is DECIMAL (*,3), where * is implementation-defined.
Resolution:
It is not necessarily the case that there will be facets, so numeric types do not necessarily have to capture precision and scale (which are, in fact, facets). When operations among numeric types are performed, facet information is lost.
Originator: | Michael Kay |
Locus: | Syntax |
The document doesn't seem to address conversion between types, e.g., integer to string, boolean to number.
Resolution:
The document now has support for casting, using the syntax provided in [XQuery 1.0: An XML Query Language].
Originator: | Michael Kay |
Locus: | Syntax |
Why is the relationship of float to double not the same as the relationship of int (and short, etc) to decimal? It seems that all operations on floats should produce a double, just as all operations on integers produce a decimal; and also that the default type for, say, 1.0E6 should be double rather than float. (In fact, some think it amazing that the schema group found a reason to support single-precision float at all; why would anyone want it? And, for that matter, why do they want byte, short, etc?).
Resolution:
None recorded.
This issue occurs in 3.4 Comparisons of Numeric Values
Originator: | Michael Kay |
Locus: | Syntax |
Does it make any difference whether the constructor "2" produces a byte, an int, or a decimal? There does not seem to be any operator or function in this document that produces a different answer depending on which it is. So why not make it a decimal?
Resolution:
There are different constructors for each of several type.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
What should this version of the document do about complex types? Should they be covered in V1 or deferred to a future version? Or should they just never be part of this specification.
At the very minimum, this version of this document must contain a statement confirming that complex types are not covered in the current version of the document.
Resolution:
RESOLUTION: We will not support complex types.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Prominent mentions of various schema types should be transformed into links into the Schema document(s). This may also be true of other items in this document regarding links to other documents.
Resolution:
Links to Schema and other relevant documents are found throughout this document.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
It is appropriate for many names (e.g., function names) specified in this document to be Qnames that are qualified by a namespace appropriate to this use. Some of the names in the current document are qualified with the identifier "xsd", which is probably inappropriate because that identifier is often used for the XML Schema namespace. Furthermore, having just an identifier is insufficient: a complete URI is required.
Resolution:
See section 1.3 Namespace Prefix.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
A function signature like "make_string(string)" is misleading since it implies that the argument might have to be of most specific type "string" as opposed to IDREF. This document must make it clear that other types (e.g., subtypes of "string", or derived types derived from "string", such as "token" are acceptable. Question arose about whether there should also be a version of "make-string" with a "number" argument, as opposed (or in addition to) to explicit and/or implicit "cast" functions. The intent is to have "make-string(string)" only for symmetry, not to allow for subtypes.
Resolution:
None recorded.
This issue occurs in 4.2 String Constructors
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Several participants feel that there are three sorts of ways to "create" values of various types: (1)literals, (2)constructors, and (3)casting. There seems to be broad agreement on (1) and (3), but there are questions about the "meaning" of (2).
In particular, are constructors really functions, or do they use functional notation without actually being functions? If they are actual functions, it would appear that their function bodies are unlikely to be much more than a CAST. That sheds some doubt on the requirement to have constructor functions.
Resolution:
There is much similarity between constructors and casting, but there appears to be sufficient value in distinguishing them. Therefore, the constructors will be retained. See for more information.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
CAST behaves in many ways like an operator or a function that is defined to operate on instances of several types. Should the definition of CAST be moved to this document (and eliminated from the XQuery document)?
Resolution:
XQuery will define syntax of cast. Paradigm and semantics in this document.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Should a constructor be as liberal as CAST in "fixing up" the contents of source data being transformed into another data type? Or should they be more rigid, as suggested in the current document, and require that source data be in precisely the proper "shape"?
Resolution:
Discussion: The discussion indicates that the input values should be extremely close to what schema validation supplies, although allowing things like the terminating "L" for "long literals" might be acceptable. Therefore, "long(3.5)" should be a syntax error rather than a compile-time round/truncate. Require the specified value to be "of the proper type" per Schema (with a few enhancements such as "L").
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
There is general agreement that character strings must be compared using a collation that gives culturally-correct results. However, there is sometimes the need to determine whether two character strings are "distinguishable" (meaning that they are to be compared without use of a collation).
Furthermore, it is possible to build collations that are "parameterized", perhaps allowing case-sensitive and case-insensitive (or accent-sensitive versus accent-insensitive comparisons) by providing a parameter to the collation when it is invoked. Should such a facility be provided in this specification? If so, how far should it be taken?
Resolution:
All string functions take an optional collation. Codepoint compare can be used to distinguish strings. Decided not to support parameterized collations.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Many uses of the word "character" in this specification would probably be better if changed to "codepoint" to make it clear precisely what Unicode concept is meant.
Resolution:
None recorded.
This issue occurs in 4.4.1 Usage Notes
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
What is the precise type returned by various functions? Is the specific type of the argument the returned type, or does it get "upcast" to "string"? Some operations might not be able to keep the most specific type (e.g., SUBSTRING(NCNAME,2) may not be a NCNAME!)
Resolution:
None recorded.
This issue occurs in 4.4 Functions on String Values
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
This specification appears to have assumed that "normalize" means "NFC". Should it support other forms (NFD, compatibility variants) in addition to NFC? Instead of NFC?
Resolution:
Added the normalization form as second argument to the function
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Currently, the specification uses the phrase "...returns a copy" in several locations. That phrase is not appropriate and the wording should be changed to accurately describe the intended semantics.
Resolution:
None recorded.
This issue occurs in 4.4 Functions on String Values
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
For various numeric and datetime types, and possibly others as well, the document must address the facets of those types, specifying precisely what effect the facets have on the operators being defined.
Resolution:
RESOLVED: No explicit support for facets in v1 at least.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Should this specification provide a function that normalizes timeDuration types so that the month/day boundary is not violated?
Resolution:
None recorded.
This issue occurs in 6.6 Functions and Operators on TimePeriod Values
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
Is the Gregorian calendar adequate for V1? What about durations in specific additional (e.g., banking) calendars based on Gregorian?
Resolution:
For the first version of this document, only the Gregorian calendar is supported (particularly since XML Schema offers support for no other calendar).
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
What is the schema type returned by the datetime "contains" operator? It's not Boolean, since "indeterminate" is a possible returned value. Is it, for example, an enumerated type?
Resolution:
RESOLVED. We have redefined the contains functions to return a boolean value.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
What sorts of function overloading do we assume? None, number of arguments, declared types of parameters, or most-specific runtime types of arguments? What about user-defined types derived from a schema type (or from another user-defined type)?
Temporarily, it has been determined that functions can be overloaded only by the number of parameters and not by the data types of the parameters.
Resolution:
Limited overloading supported for now. See 1.1 Syntax. Need to clarify.
This issue is not referenced!
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
This specification should probably contain a table, such as the one in the SQL standard, indicating what the valid combinations of source type and target type are for the CAST operation.
Resolution:
Such a table (four of them, actually) are now present in this document.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
This specification must distinguish between constructing a value from a lexical representation (that is, literals) and invoking a constructor function (e.g., "make-date(string)"). Of course, it must also have run-time type conversions ("cast", whether using the currently-proposed CAST AS syntax or some implicit function invocation as in SQL's user-defined type capability).
Some participants suggest that there might be only numeric literals and string literals and everything else (datetime, Booleans, lists) don't have literals but have constructors instead. Others asked why we don't do just what the XQuery document does today (literals for only a few types and constructors and/or casts for everything else).
Resolution:
The document currently provides literals for many data types, constructors for others, and casting for others.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
In addition to, or instead of, constructors for datetime and timeDuration types, should there be a form of literal (such as is done in the SQL standard)?
Resolution:
The literals that look a lot like SQL's literals are too similar to the constructors, so there is no gain. Microsoft's approach of using square brackets to delimit them conflicts with XPath's use of square brackets. Resolved: No, there will not be literals; the constructors will be the closest we provide.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
The type signature of functions will have a significant impact on some decisions about the type interpreted for numeric literals.
Resolution:
There should not be any influence on the types of literals caused by function signatures.
Originator: | Operators Task Force F2F 2001-03-21 |
Locus: | Syntax |
The operators document has to address the required capabilities, but might not immediately prescribe the concrete syntax used to produce those capabilities.
Resolution:
RESOLVED: Syntax for operators in the XQuery/XPath documents.
Originator: | Michael Kay (member only message) |
Locus: | Syntax |
The functions contains(), substring-before(), and substring-after() [spelt thus] rely on equality matching of substrings. They are therefore locale sensitive in the same way as "=" comparison. Arguably each of these functions needs a version that uses Unicode codepoint comparison, a version that uses a defined collation, and a version that does case-folded comparison.
Resolution:
Collations are always used for string comparisons and ordering. Another issue ([Issue 70: How are "default" collations determined?]) has been raised to capture questions about collations, default collation selection, and locales.
Originator: | Michael Kay (member only message) |
Locus: | Syntax |
Perhaps we need a "linguistic contains" as in free text searching, e.g. contains-word(., "England"). Would we then want to define the word-breaking, stemming, and matching rules, or leave it to the implementor? See also the Library of Congress Use Cases in e-mail: (member-only message)
Resolution:
None recorded.
This issue occurs in 4.4 Functions on String Values
Originator: | Mary Fernandez (member only message) |
Locus: | Syntax |
The operators document has to address the required capabilities, but might not immediately prescribe the concrete syntax used to produce those capabilities.
Resolution:
The operands are restricted to be values of the same kind so indeterminate results never arise.
Originator: | Jim Melton |
Locus: | Syntax |
This document offers support for 8 numeric types. Should support be explicitly provided for the remaining numeric types defined by XML Schema ([XML Schema Part 2: Datatypes])?
It has been suggested (see (member-only message)) that the "type promotion" scheme in this document implicitly means that the operators and functions already implicitly support all of XML Schema's numeric types.
Resolution:
RESOLVED: We support integer, decimal, float, double. Others can be constructed and used by type promotion.
Originator: | Jim Melton |
Locus: | Syntax |
Some of the numeric constructors have return types that are unexpected and counter-intuitive. For example, xo:long(string)
returns an integer
instead of a long
. Shouldn't constructors return the type they claim to be constructing?
Resolution:
RESOLVED: We agreed at recent F2F to return limited types, and Norm has implemented. This decision was motivated by the fact that the data model includes only a few numeric types.
Originator: | Operator Editors |
Locus: | Syntax |
XPath 1.0 has a function string(node)
, described thus: "Returns a string representation of the argument".
On 2001-07-17, the Operators Task Force F2F determined that the document will not (at this time) support function overloading solely by argument data type.
This document includes a constructor function string(string)
whose signature is identical to the XPath 1.0 function except for the data type of the argument. This function has been stated to be desirable for reasons of orthogonality.
The names of all constructor functions presently in the document are the same as the names of the types for which they are constructors.
There appears to be a conflict between (1)the presence of string(string)
, (2)the decision to prohibit overloading by argument type, and (3)the XPath 1.0 function string(node)
. How shall this conflict be resolved? (Incidentally, a previous version of this document included a function string(node)
with similar or identical functionality to the XPath 1.0 function; that function has been renamed string-value(node)
to remove its overloading and to preserve the characteristic that the name of constructor functions is the same as the name of the type being constructed.
Resolution:
RESOLVED: Inconsistencies have been reconciled.
Originator: | Operator Editors |
Locus: | Syntax |
On 2001-07-17, the Operators Task Force agreed that there will be no function overloading based solely on the data types of arguments, further deciding to rename all functions currently overloaded in this way by adopting the convention of prefixing their names with the names of the "primary" data type to which they apply. Therefore, "concat(string, string+)" became string-concat(string, string+)
. But the name of the corresonding XPath 1.0 function that requires us to keep a variable number of arguments is just string
.
What, then, is the most appropriate name for the string concatenation function?
Resolution:
named "concat" for XPath compatibility.
Originator: | Operator Editors |
Locus: | Syntax |
This document specifies constructor functions named ID
and IDREF
. It also specifies functions named id
and idref
that return sets of nodes identified from the argument values.
Is it confusing to have two (pairs of) functions whose names are so similar, differing only in the case of their names, and is it thus appropriate to consider renaming the latter two to something possibly more descriptive?
Resolution:
RESOLVED: Yes, its unfortunate! Constructors follow Schema datatypes names.The id/idref function names follow XPath existing names.
Originator: | Michael Sperberg-McQueen |
Locus: | Syntax |
In a presentation at the July, 2001 F2F, it was said that collations would be referred to by URI references. Michael Rys said one rationale is to allow relative URI(-reference)s so one can refer to "French" rather than http://www.example.com/i18n/collation-sequences/case-sensitive/French, and so on. There may be negative impacts on the interoperability results caused by allowing relative URI referneces for this function. It is tempting to suggest requiring collation names to be absolute URIs without fragment identifiers. If brevity is really important, perhaps we should invent a way to assign short names to collations.
Issue resulted from e-mail: Michael Sperberg-McQueen (member-only message)
Resolution:
None recorded.
This issue occurs in 4.3 Equality and Comparison of Strings
Originator: | Michael Sperberg-McQueen |
Locus: | Syntax |
The relation of collation-sequence selection to xml:lang labeling of the data needs to be addressed explicitly, even if there is none. (Steve Zilles suggested that since nothing was said about getting defaults from xml:lang values, it was clear that xml:lang does not affect the selection of collation sequences. But earlier, people had said an implementation was clearly free to take a default-collation value from the user's locale, if one was available, on the grounds that nothing was said about it and thus nothing prevents it. We can't argue both that silence in the discussion allows implementors to do anything they like as regards the user's locale, and that it requires implementors to do nothing as regards xml:lang.
So I argue that if we want there to be no interaction with xml:lang, or if we want such an interaction to be legal but not required, or if we want it to be required, we ought to say explicitly what we want.
Issue resulted from e-mail: Michael Sperberg-McQueen (member-only message)
Resolution:
None recorded.
This issue occurs in 4.3 Equality and Comparison of Strings
Originator: | Anders Berglund |
Locus: | Syntax |
The semantics of xf:token() explicitly calls out #x20 as the only space character that is prohibited in the string that is an argument to the function. What about the "other" Unicode space characters, such as 00A0 NO-BREAK SPACE, 1361 ETHIOPIC WORDSPACE, 1680 OGHAM SPACE MARK, 2002 EN SPACE, 2003 EM SPACE, 2004 THREE-PER-EM SPACE, 2005 FOUR-PER-EM SPACE, 2006 SIX-PER-EM SPACE, 2007 FIGURE SPACE, 2008 PUNCTUATION SPACE, 2009 THIN SPACE, 200A HAIR SPACE, 200B ZERO WIDTH SPACE, 202F NARROW NO-BREAK SPACE, 3000 IDEOGRAPHIC SPACE, 303F IDEOGRAPHIC HALF FILL SPACE, and FEFF ZERO WIDTH NO-BREAK SPACE?
Issue resulted from e-mail: Anders Berglund (member-only message)
Resolution:
None recorded.
This issue occurs in 4.2.3 xf:token
Originator: | Anders Berglund |
Locus: | Syntax |
The requirement is to have an underlying design that permits (either in version 1.0, or at least permits a natural extension to) supporting:
Converting a "date" to a string in a non-Gregorian calendar.
Converting a string, in an appropriate format for a non Gregorian calendar, to a "date".
Comparisons of "dates" where the XML has these expressed in non-Gregorian calendar(s).
The range of supported calendars should probably be left to the implementation.
A possible design approach could be to:
Keep the schema/ISO-8601 date as the "hub" datatype.
Change some of the existing constructors by adding a "calendar" parameter, which would default to Gregorian.
Add some "date" to string functions for presenting non-Gregorian calendar dates.
A comparison of, say, two BE years would be achieved by
-- Year("2544", "BE") > Year("2540", "BE")
Naturally there is no requirement that the two calendars match, so a comparison
-- Year("2544", "BE") > Year("1374", "AH")
would be perfectly reasonable.
There are some issues that need solving/clear definition. These include:
What to do if the calendars do not match, for example a year in a lunar calendar (where a year is shorter than a Gregorian year) typically corresponds to two Gregorian years and arithmetic can become very interesting and certain functions may well need to be changed to accomodate this. This applies to calendars in use today.
Should country and date variations be taken into account? For example in some countries using the Julian calendar the year started September 1st (many of these countries changed it later to January 1st). This applies to "historic" dates.
Should "calendar change over" effects be taken into account? For example if a country had a "Gregorian April" with more than 30 days the year a switch from Julian to Gregorian calendar took place should this be reflected in the conversion? This applies to "historic" dates.
Issue resulted from member-only e-mail: Anders Berglund (member-only message) and subsequently amended by(member-only message)
Resolution:
None recorded.
This issue occurs in 6 Constructors, Functions, and Operators on Dates and Times
Originator: | Anders Berglund |
Locus: | Syntax |
The various get-timezone-from-*()
functions will not really work for those areas that still use "sun time" (Saudi Arabia at least used to). Thus better to have "get-timezone" return a string and e.g. get-timezone-difference-from-GMT give a duration, which for sun time would vary.
Issue resulted from e-mail: Anders Berglund (member-only message)
Resolution:
None recorded.
This issue is not referenced!
Originator: | Michael Kay |
Locus: | Syntax |
(a) the syntax doesn't agree with the XPath grammar.
(b) having a leading minus or plus sign as part of the literal isinconsistent with having it as a unary operator in front of the literal.
(c) I see no need to define special literal formats for a "long", alone among all the derived numeric types. 3L and 3 are the same value: the value space of int is a subset of the value space for long, so 3 is both an int and a long.
(d) 1.0e6 should be a double, not a float. Users who take the trouble to use floating point are more likely to want double precision than single precision; if they want single precision, they can use a constructor.
Resolution:
Literals have been removed from this document.
Originator: | Michael Kay, Steve Tolkin |
Locus: | Syntax |
I'm less sure whether it's right that xf:double('ZZZZZ')
should return an error value, rather than NaN. In XPath 1.0 it's a general principle that NaN is used as a kind of null value for numbers: anything which would normally produce a number, produces NaN when no number is appropriate. But I can live with it.
Similarly, cast as float('ZZZZZ')
is currently defined to return an error value, but could instead return NaN.
Issue resulted from e-mail: (member-only message)
Resolution:
RESOLVED. An error should be returned in the same way as an error is returned for other constructors. Meeting 12/5/2001.
Originator: | Michael Kay |
Locus: | Syntax |
In Xpath 1.0, "mod" is an operator, while it is defined in this document as a function. It should be redefined to be an operator, which will require moving it to a different section of the document.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue is not referenced!
Originator: | Michael Kay |
Locus: | Syntax |
Section 2.6.2 - 2.6.4 (floor(), ceiling(), and round()). A complete treatment of these functions requires consideration of negative zero, NaN, Infinity, etc. This is all covered in XPath 1.0.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED. XPath 1.0 definitions used for these functions.
Originator: | Michael Kay |
Locus: | Syntax |
General: there do not seem to be equivalents to the XPath 1.0 functions number(), boolean(), and string(), with all argument combinations, e.g. no function to convert a number to a boolean.
In addition, other possible desirable functions (e.g., abs()
) are not specified and it should be determined how to decide what functions are to be included and what ones are not to be included.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED. number(), boolean() and string() added. It was decided not to add abs().
Originator: | Michael Kay |
Locus: | Syntax |
Section 3.3: As discussed, I don't think xf:ID, xf:IDREF, or xf:ENTITY make sense.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue occurs in 4.1 String Types
Originator: | Michael Kay |
Locus: | Syntax |
Section 3.5, the "Source" column has many inaccuracies. Many of the functions attributed to XPath 1.0 are new.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED. Erroneous references to XPath 1.0 removed from table.
Originator: | Michael Kay |
Locus: | Syntax |
Some functions (e.g., string-pad-beginning and string-pad-end?) seem to be composite functions that could more usefully be composed from concat() and a primitive pad(char, integer).
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: Functions have been removed.
Originator: | Michael Kay |
Locus: | Syntax |
AND and OR should be and and or. NOT should be not. For completeness, the semantics of these operators should be given. (Note this isn't trivial, because of the rules for whether the second argument is evaluated or not).
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: Changed names of the functions. Added explanation of semantics.
Originator: | Michael Kay |
Locus: | Syntax |
Section 9.1, I think perhaps xf:name() should return the name as a QName, not as a string. This needs exploring, especially the semantics for comparing a Qname with a string, e.g. if (name(x) = 'foo:bar'). (For that matter, do we define "=" on two QNames?) This and several other functions return "" if the node has no name.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
name returns a QName.
Originator: | Michael Kay |
Locus: | Syntax |
Section 9.9: I would like to see the operators "=" assigned to "value-equal", and "is" assigned to "node-equal".
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: Operators to be defined in XQuery/XPath.
Originator: | Michael Kay |
Locus: | Syntax |
We need to specify which aspects of the newly constructed node are the same as the original. E.g. does it have the same name? string-value? namespaces? parent? children? This is the only function in this document with side-effects, so it needs special care. How does it relate to the node-construction functions defined in the data model?
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue occurs in 11.1.7 xf:copy
Originator: | Michael Kay |
Locus: | Syntax |
"node sequences", "user defined list types": we only have sequences.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: The definition of sequences has been generalized to clear up the ambiguity.
Originator: | Michael Kay |
Locus: | Syntax |
I'm not sure about NMTOKENS, etc. Perhaps we should simply provide a tokenize() on these that turns the NMTOKENS value into a sequence?
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: There is no longer special mention of NMTOKENS
Originator: | Michael Kay |
Locus: | Syntax |
index-of. Need find-by-value and find-by-identity.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue occurs in 12.2 Functions and Operators on Sequences
Originator: | Michael Kay |
Locus: | Syntax |
reverse-sort() looks like a composite function that could and should be defined in terms of reverse() and sort(): so replace it with a new primitive function reverse().
If there were an xf:reverse() function, would xf:reverse(xf:sort(x,y)) = xf:reverse-sort(x,y)?
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
Sort and reverse-sort are removed but there is still no reverse() function.
This issue is not referenced!
Originator: | Michael Kay |
Locus: | Syntax |
sublist-before() etc. need "by value" and "by identity" variants. So it might be better to rely on index-of() and sublist() which can be used to compose these functions.
Similarly, a primitive pad-sequence(item, integer) would be more useful. (Having to write pad-end( (), 3, 'x') is silly!
truncate-beginning and end seem not especially useful, and can easily be composed from sublist().
resize-beginning and -end: I haven't begun to work out how these might be used, but they don't seem very primitive to me.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
RESOLVED: Said functions removed.
Originator: | Michael Kay (member-only message). |
Locus: | Syntax |
Need a simple function to sort a sequence in document order (equivalent to union( (), $x )). See also item 20 in member-only e-mail from Don Chamberlin: http://lists.w3.org/Archives/Member/w3c-xml-query-wg/2001Aug/0216.html
Resolution:
None recorded.
This issue occurs in 12.2 Functions and Operators on Sequences,
Originator: | Michael Kay |
Locus: | Syntax |
I think it may be important for 1.0 compatibility for count() and sum() to remove duplicate nodes first. This depends on the decision we make on the "/" operator.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue occurs in 12.4.1 xf:count, 12.4.5 xf:sum
Originator: | Michael Kay |
Locus: | Syntax |
id(), need to say which documents the returned nodes come from.
Issue resulted from e-mail: Michael Kay (member-only message)
Resolution:
None recorded.
This issue occurs in 12.5 Functions that Generate Sequences
Originator: | Michael Kay, Mary Fernandez |
Locus: | Syntax |
This idref() function does what id() does in XPath 1.0.
We do not understand what these functions mean. What is the 'node' argument to xf:id? Why does xf:idref return a sequence of nodes when its argument is a singleton IDREF. Also, the type to xf:idref is wrong: it should be xsd:IDREF.
We would expect to have a function with the following signature:
xf:id(xsd:IDREF)
Returns the node having the unique ID represented by the IDREF argument or or the empty sequence (or ERROR) if no such node exists.
Issue resulted from e-mail: Michael Kay (member-only message) and Mary Fernandez (member-only message)
Resolution:
Function names and signatures have been changed. Except that we made the argument to ID a string* rather than an IDREF for convenience.
Originator: | Steve Zilles and F2F 2001-07-17 |
Locus: | Syntax |
The binary comparison operations determine a "default" collation to use. These operators (and related string "operations" such as sort) must specify how the default collation is determined.
The rules for default collation should specify how "locale" information is taken into account in determining the default.
The rules for default collation should specify how any collation information associated with the data is merged with any other default collation specifications.
The F2F on 2001-07-17 agreed that it should be desirable to specify a default collation in a query (XQuery, at least) preamble, but that explicit specification of a collation in a function invocation overrides that default. The F2F also agreed that the Schema WG should be requested to reconsider whether it should be possible to specify default collations on schema and element (and type) definitions in an XML Schema; those default collations would be used in the absence of a query-level or a function invocation-level specification of a collation. The F2F further agreed that the "ultimate fallback" for a default collation must always be the Unicode Collation Algorithm. Finally, the Function and Operators F2F recognizes the value of allowing collations to be specified (or implied) by a client locale in many instances, but also firmly believes that many data-management situations preclude absolute dependence on locale as the governing factor for ordering decisions.
Issue resulted from e-mail: Steve Zilles (member-only message)
Resolution:
None recorded.
This issue occurs in 4.3 Equality and Comparison of Strings,
Originator: | Andrew Eisenberg |
Locus: | Syntax |
I believe that we are stating that xf:decimal (" 12.5 ") will generate an error. We should be much more explicit about this. A negative example in the text would help. (Similar comments apply to other numeric constructors.)
Issue resulted from e-mail: Andrew Eisenberg (member-only message)
Resolution:
RESOLVED. Leading and trailing whitespace stripped from literal strings passed to constructors except for string constructors.
Originator: | Andrew Eisenberg |
Locus: | Syntax |
I believe that we need to say something about numeric overflow and underflow in this section. In section 6, we may need to say something about overflow on date/time operations as years are restricted to 4 digits and fractional seconds to 8 digits.
Issue resulted from e-mail: Andrew Eisenberg (member-only message)
Resolution:
None recorded.
This issue occurs in 3.3 Operators on Numeric Values
Originator: | Andrew Eisenberg |
Locus: | Syntax |
I believe that we should have an xf:compare-between function (analogous to SQL's BETWEEN predicate, allowing quick determination of whether one value lies between two other values).
Issue resulted from e-mail: Andrew Eisenberg (member-only message)
Resolution:
None recorded.
This issue occurs in 4.3 Equality and Comparison of Strings
Originator: | Andrew Eisenberg |
Locus: | Syntax |
I was surprised that match is defined to see that match returns a list of offsets where a pattern is found.
Let's suppose that I'd like to know whether $x is a phone number (for which I have some pattern defined). If I test for xf:match ($x, $phone) = 1, then $x may have many extraneous trailing characters.
If we retain xf:match as it is specified, then I suggest an xf:exact-match function as well. Similar comment for xf:replace.
Issue resulted from e-mail: Andrew Eisenberg (member-only message)
Resolution:
None recorded.
This issue occurs in 4.4.16 xf:match,
Originator: | Andrew Eisenberg |
Locus: | Syntax |
This definition includes the following: "... that is the value of the second argument, or is matched by the regular expression that is the second argument, ...".
This seems ill-defined; perhaps two functions are needed.
It seems necessary to say something about the matching that is going on here.
xf:replace ("acadae", "a(.*)a", "b$1b") => "bcbdae" or "bcadbe"
The match could be to the shortest string that qualifies, or the longest string that qualifies.
It seems like I will need a special ("escape") mechanism to be able to include "$1" as actual replacement text in the third argument.
Issue resulted from e-mail: Andrew Eisenberg (member-only message)
Resolution:
None recorded.
This issue occurs in 4.4.16 xf:match, 4.4.17 xf:replace,
Originator: | Ashok Malhotra |
Locus: | Syntax |
I had a question from one of our developers re. the "type" function on Node. Does this return the type of the node i.e. element-node, attribute-node, etc. or does it return the Schema type i.e. definition of that node? Since this function merely reflects an accessor in the data model draft, I checked that document. It says that the function returns a Schema component. So we need to make the text clearer to say that the "type" function returns the Schema definition of the node.
Resolution:
RESOLVED. The XPath taskforce decided on 7/24/2001 to remove the xf:type function.
[Issue 77: Should there be a function to convert characters to strings?]
Originator: | Mary Fernandez |
Locus: | Syntax |
Jerome and I are working on the mapping from XQuery to the core. We want to know whether there should be any operators defined on individual characters or whether all operators are on strings. At a minimum, we think we need a constructor that takes an individual character and returns a string.
Issue resulted from e-mail: Mary Fernandez (member-only message)
Resolution:
None recorded.
Originator: | Steve Tolkin |
Locus: | Syntax |
In one place, the type promotion rules say that any type may be promoted to the type of its "primitive ancestor", while in another, the phrase used is "most primitive ancestor". This discrepancy is confusing; is there intended to be a difference in semantics implied by the different wording?
In addition, two paragraphs claims that "one operand is promoted to be the type of the other operand", while the remainder of the section discussion promoting types to their "primitive ancestor".
Issue resulted from marked-up copy of Version 0.6.
Resolution:
RESOLVED: Inconsistent wording was changed
Originator: | Steve Tolkin |
Locus: | Syntax |
The xf:numeric-mod()
function, the div
operator, and others do not specify what the required number of digits of precision is in the result.
Issue resulted from marked-up copy of Version 0.6.
Resolution:
None recorded.
This issue occurs in 3.5 Functions on Numeric Values
Originator: | Steve Tolkin |
Locus: | Syntax |
The constructor normalizedString()
requires that the value of the supplied string
argument conform to the lexical requirements of a normalizedString
. Is there a function or constructor that will normalized a non-normalized string and return a normalizedString
?
Issue resulted from marked-up copy of Version 0.6.
Resolution:
RESOLVED. Yes, its called normalize-space. Tkes a string as argument returns a normalized string. Casting from string to normalizedString will perform a similar function.
Originator: | Paul Biron |
Locus: | Syntax |
The precise semantics of regular expressions are not clear. The definition of regular expressions in XML Schema are somewhat ambiguous and, in addition, it is not completely clear what semantics would best benefit XQuery. One issue (just as an example): XML Schema's regular expressions do not support "$n" placeholders, even though the examples in this document depend on them.
Another example: Although the XML Schema definition of regular expressions provides a "greedy" algorithm that attempts to match the longest possible strings, the use cases for defining a subset of a datatype's lexical space, on the one hand, and on matching a string against a pattern, on the other hand, are different...and one might want different behavior. Meaning that one might want a variation that is not as "greedy".
See also [Issue 74: Is a "match-exact()" function needed?] and [Issue 75: The semantics of match() and replace() are incompletely specified].
Issue resulted from private e-mail exchange.
Resolution:
None recorded.
This issue occurs in 4.4.16 xf:match
Originator: | Steve Tolkin |
Locus: | Syntax |
This document must properly align with [XQuery 1.0 and XPath 2.0 Data Model] when dealing with node sets (which are defined in [XPath 1.0]), lists, and sequences. The current wording in this document is sometimes confused about the distinctions.
Issue resulted from marked-up copy of Version 0.6.
Resolution:
None recorded.
This issue occurs in 12 Constructors, Functions, and Operators on Sequences
Originator: | Steve Tolkin |
Locus: | Syntax |
The tables would be much more useful if these names grouped by "family" (e.g., all numeric types started with the letter "n", all date and time types with "d", string-like types with "s", and binary types with "b"). (Of course, boolean could go either in with the numeric types or in with the binary types.) Then the tables could be sorted alphabetically. There is already a system: the types cast to in the next few sections.
Issue resulted from marked-up copy of Version 0.6.
Resolution:
None recorded.
This issue is not referenced!
Originator: | Steve Tolkin |
Locus: | Syntax |
The current definition of casting to token
states that all line feed codes and all tab characters are removed, after which leading and trailing spaces are deleted and multiple spaces are replaced with a single space. Shouldn't line feed codes and tabs be converted to spaces instead of simply deleted?
Issue resulted from marked-up copy of Version 0.6.
Resolution:
None recorded.
This issue is not referenced!
Originator: | Jim Tivy and the WG telcon on 8/1 |
Locus: | Syntax |
Do the node accessor functions such as name(), string-value(), typed-value(), parent(), children(), node-kind() belong in this document or the datamodel document? Similarly, do the kind tests text(), noder() belong in this document or the XQuery document?
Resolution:
RESOLVED: Added sections showing accessors and kind tests that are exposed to the user as functions
Originator: | Andrew Eisenberg (member-only message) |
Locus: | Syntax |
Do the node accessor functions such as string-value(), typed-value(), parent(), children(), node-kind(), node(), text() and data() belong in this document or the datamodel document?.
Resolution:
This issue occurs in 3.4 Comparisons of Numeric Values, 4.3 Equality and Comparison of Strings
Originator: | Michael Rys on the August 15, 2001 telcon. |
Locus: | Syntax |
Should the input parameters to these operators be restricted so that indeterminate values never arise. For example, when comparing dateTimes etc. both arguments either must or must not have a timezone. When comparing durations, both arguments mest be either year-month or day-hour-minute-sceond. This is what SQL allows.
Resolution:
The operands are restricted to be values of the same kind so indeterminate results never arise.
Originator: | Phil Wadler (member-only message) |
Locus: | Syntax |
Functions with AnyType in the return are problematic for two reasons. To be concrete, I discuss the following.
-- xf:item-at(anyType* $seqParam, decimal $posParam) => anyType
(1) Note that the types anyType* and anyType are equivalent, which suggests that the typing here is not quite right. We should define
-- define group AnyItem = AnyElement | AnyAttribute | AnySimpleType
and then give the above the type
-- xf:item-at(anyItem* $seqParam, decimal $posParam) => anyItem
(2) Even having made the above change, the type is too broad to be useful, and one will almost always have to cast the result of calling xf:item-at (and similarly for other functions with anyItem or anyType in the result).
Instead, we should allow parametric polymorphism when specifying the signatures of built-in functions.
-- xf:item-at($anyItem* $seqParam, decimal $posParam) => $anyItem
Here $anyItem is a type variable which ranges over any group $anyItem such that $anyItem <: AnyItem. (Recall that s <: t if the extent of type s is a subset of the extent of type t, where the extent of a type is the set of values that have that type.)
Here are two examples of functions written with the current signature.
-- define function second-integer (integer* $integer-sequence) integer { treat as integer (xf:item($integer-sequence, 2)) }
-- define function third-book (Book* $book-sequence) book { treat as Book (xf:item($book-sequence, 3)) }
Here are two examples of functions that would type check under this scheme.
-- define function second-integer (integer* $integer-sequence) integer { xf:item($integer-sequence, 2) }
-- define function third-book (Book* $book-sequence) book { xf:item($book-sequence, 3) }
The definitions are easier to write and more efficient to execute (since no "treat as" needs to check the structure of the result).
Parametric polymorphism would also be useful for user-defined functions, it were clear how to define it for user-defined functions in general. But at the very least, we should allow parametric polymorphism for the built-in functions defined in the functions and operators document.
Resolution:
This issue occurs in 12 Constructors, Functions, and Operators on Sequences
Originator: | Norm Walsh (member-only message). |
Locus: | Syntax |
The constructor functions for ID and IDREF need a document context for validity.
Resolution:
This issue occurs in 4.2 String Constructors
Originator: | Steve Tolkin in August 15, 2001 telcon. |
Locus: | Syntax |
There also need to be be versions of UNION, INTERSECT, and EXCEPT that work on value equality rather than node identity. See also the XQuery Issue 63: Set operations based on value (xquery-set-operators-on-values).
See also [Issue 132: union(), intersect(), and except(): only for simple values?].
Resolution:
This issue occurs in 12.3 Equals, Union, Intersection and Except,
Originator: | Steve Tolkin (member-only message). |
Locus: | Syntax |
The abs(), absolute, function is required. The question is, what should the return type be?
If there were a single type at the top of the numericv type hierarchy that would be a reasonable choice. But there isn't -- decimal, float and double are siblings.
A better answer is the return type is the type of the argument, e.g., abs(-1) is 1, abs(-2L) is 2L, abs(-3.4) is 3.4 etc. This implies function overloading. But I think thus is OK because this is a system defined function.
Resolution:
No support from taskforce.
Originator: | Steve Tolkin (member-only message). |
Locus: | Syntax |
For example a search for the string "bronte" should find the string "Bronté"
In earlier versions of this Functions and Operators document there were special functions that did this Then a decision was made that this should instead be based on a named collation. However at the moment there does not seem to be any vendor who supports a named collation that has this behavior. Nor does XQuery provide any way for a user to define a collation.
Assuming that such a collation exists we also need to clarify how (or if) a query can specify that it applies to string comparison done with the = operator.
Also the each of the two existing xf:substring functions should have a variant that takes a collation argument.
Resolution:
Named collations can be used for this purpose.y
Originator: | Steve Tolkin (member-only message). |
Locus: | Syntax |
Systems that search text often provide a function to search for several terms that are near one another. Often this function is named NEAR and allows an argument to specify the maximum distance allowed between the terms. (Generally it only allow two terms, but sometimes it allows more).
XQuery should provide a standard function to achieve this. To avoid the difficult problem of deciding what is a word boundary etc. it should be defined instead on a sequence of nodes, and search their content.
One possible signature would be within-window(node* node-sequence, int size, string* strings, boolean order-matters)
The last argument order-matters is optional and if true the strings arguments would have to match in the order given.
A function like this could be used to answering the Library of Congress use cases at http://lcweb.loc.gov/crsinfo/xml/lc_usecases.html
It also could be used to answer the question of how to search for the sequence of pitches: C, D, E, C. as discussed in the memeber-only e-mail http://list3.w3.org/Archives/Member/w3c-xml-query-wg/2001Jul/0085.html
First the user would remove the extraneous ancestor nodes caused by the measures, leaving a sequence of note nodes. Then the essence of the query is simply: within-window(note-sequence, 4, make-list-of-strings("C","D","E","C"), true) where the 3rd argument is hypothetical syntax for constructing a list of strings.
Issue resulted from member-only e-mail http://lists.w3.org/Archives/Member/w3c-xml-query-wg/2001Jul/0127.html
Resolution:
This issue occurs in 4.4 Functions on String Values
Originator: | Steve Tolkin (member-only message). |
Locus: | Syntax |
Users will need to test for absent elements, and optionally provide a value for them. (There is no support in XML Schema for a default value for absent elements.) Writing this function is quite complex -- perhaps too complex to expect from XQuery users -- and too verbose to include in every query that needs it. It should be provided as a built-in function.
The following code was provided by Mary Fernandez; see more in the e-mail cited below.
define function if_absent ( xs:AnyElement? $e, xs:AnySimpleType $s ) return xs:AnySimpleType { typeswitch ($e) as $v case () return $s case xs:AnyElement return (typeswitch ($v) case ELEMENT * { xs:AnySimpleType } return data($v) default return error ) default return error
Similarly users will need to be able to translate an empty element to an element with a particular value. This could be a separate issue, but for now we can keep it as part of this issue. The e-mail cited below has even more complex code for this function.
There should also be a way to test for an absent attribute. This might be a separate function, or combined into this function.
Issue resulted from member-only e-mail http://lists.w3.org/Archives/Member/w3c-xml-query-wg/2001Jul/0171.html
Resolution:
RESOLVED: Functions added.
Originator: | Don Chamberlin (member-only message; Items 13 and 14) |
Locus: | Syntax |
Section 5.7 describes three functions named get-duration(), get-end-dateTime(), and get-start-dateTime() whose purpose is to compute sums and differences of dates and durations. This purpose would be served in a much more readable way by using arithmetic operators, as in SQL. For example, get-end-dateTime(time1, duration2) could be better expressed as time1+duration2.
Section 5.7 also describes three functions named temporal-dateTimes-contains, temporal-dateTimeDuration-contains, and temporal-durationDateTimes-contains whose purpose is to test whether a time is contained in an interval. This purpose would be served in a much more readable way by using comparison operators. For example, temporal-dateTimeDuration-contains(time1, duration2, time3) could be better expressed as time3 >= time1 AND time3 <= time1 + duration2.
Resolution:
This issue occurs in 6.6 Functions and Operators on TimePeriod Values
Originator: | Don Chamberlin (member-only message; Item 16) |
Locus: | Syntax |
This section lists two equality-tests between nodes, called "node-equal" and "value-equal". Value-equal is defined to ignore nested markup, as in XPath 1.0. We also need a comparison-test, possibly called "deep-equal", which respects nested markup, requiring the nodes being compared to have the matching descendant-subtrees with corresponding nodes equal in name and content. For example, consider a book with author "Mark Twain" and title "Tom Sawyer", and another book with title "Mark Twain" and author "Tom Sawyer". These books would be value-equal (according to XPath 1.0) but not deep-equal.
Resolution:
RESOLVED: We now have deep-equals. The above example will not compare deep-equal.
Originator: | Dana Florescu (member-only message). |
Locus: | Syntax |
We need head() and tail functions on sequences. Some disagreement from Denise Draper in member-only message : http://lists.w3.org/Archives/Member/w3c-xml-query-wg/2001Aug/0247.html
Resolution:
RESOLUTION: WG decided that head() and tail() were not required for sequences. Count() and item-at() were sufficient.
Originator: | Don Chamberlin (member-only message; Item 20). |
Locus: | Syntax |
Remove sort and reverse-sort-functions. They are covered by SORTBY operator in the language.
Resolution:
Done! But see issue 64.
Originator: | Don Chamberlin (member-only message; Item 20) |
Locus: | Syntax |
last() is not correctly described. In the XPath 1.0 function library, last() takes no arguments, and it returns the "context size from the expression evaluation context". This terminology doesn't fit XQuery very well.
position() is not correctly described. In the XPath 1.0 function library, position() takes no arguments, and it returns the "context position from the expression evaluation context". This terminology doesn't fit XQuery very well.
Resolution:
RESOLVED: Functions removed and added to a new section on context function
Originator: | Don Chamberlin (member-only message; Item 9) |
Locus: | Syntax |
The WG has decided that if a function expects a scalar value and it is called with an empty sequence, an error results. But many functions are defined that expect scalar values. As specified, none of these functions can be safely used in a path expression. Consider floor(decimal) as an example. Consider the path expression //emp/floor(bonus). This expression will raise an error if any employee does not have a bonus. This is clearly not what is intended. Nearly all of the parameter declarations should be edited to allow for empty sequences.
Resolution:
RESOLVED: Functions that accept empty sequences should indicate this in their signature.
Originator: | Don Chamberlin (member-only message; Item 1 (e)). |
Locus: | Syntax |
We need operators for UNION, INTERSECT and EXCEPT; these are operators in XQuery. They can be implemented by mapping to the functions but should be added to the document.
Resolution:
XPath/XQuery will define them.
Originator: | Don Chamberlin (member-only message; Item 1 (f)) |
Locus: | Syntax |
We need operators for BEFORE and AFTER. They can be implemented by mapping to the functions but should be added to the document.
Resolution:
This issue occurs in 11.1 Functions and Operators on Nodes
Originator: | Don Chamberlin (member-only message; Item 10) |
Locus: | Syntax |
XPath 1.0 supports six comparison operators between string-values. None of these are listed in this document. You should list them, and raise an issue about their meaning, since the XPath definition is probably no longer appropriate.
Resolution:
This issue occurs in 4.3 Equality and Comparison of Strings
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
A compatibility issue exists with the div
operator. When XPath 1.0 semantics are used, 1 div 4
returns 0.25
, but the current specification apparently returns zero.
Resolution:
This issue occurs in 3.3 Operators on Numeric Values
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
The examples may have to be changed, since expansion of character references is performed by a preprocessing step that may happen in some contexts (e.g., as part of an XML document), but not in others (e.g., when used in a Java application).
Resolution:
Appropriate wording added.
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
It is not clear that many functions can make sense without some notion of document context. Perhaps those functions should have an optional context argument of some sort. What does it mean to have an XML ENTITY value without some notion of the document in which it occurs?
Resolution:
This issue occurs in 4.2 String Constructors
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
When does it make sense for a function to return a string that is in a form other than some Unicode normalized form?
Resolution:
This issue occurs in 4.4.1 Usage Notes
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
Some sort of (defaulted) calendar context is required for all these functions to allow for future support of non-Gregorian calendars.
Resolution:
This issue occurs in 6 Constructors, Functions, and Operators on Dates and Times
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
"...does not contain a timezone, the result is the empty sequence" should be "...does not contain a timezone, the result is the empty string". Whatever we do, the result should be consistent with other such decisions e.g. what does the name accessor return if the node has no name.
Resolution:
This issue occurs in 6.4.9 xf:get-timezone-from-dateTime
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
The functions xf:get-end() and xf:get-start() should have more unique names, perhaps xf:get-end-dateTime() and xf:get-start-dateTime.
Resolution:
The names of the functions have been changed as suggested.
Originator: | Norm Walsh (member-only message) |
Locus: | Syntax |
How can QName-from-uri operate without some sort of context?
What is a QName in no namespace?
Resolution:
This issue occurs in 7.1.1 xf:QName-from-uri, 7.1.3 xf:QName
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
The document does not specify the complete semantics of numeric comparisons. For example, is -0.0e1 equal to +0.0e1? Is NaN equal to Nan?
Resolution:
This issue occurs in 3.4 Comparisons of Numeric Values
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
It would be simpler to provide codepoint-compare() by defining a standard collation name that represents "Unicode codepoint order". This would avoid the need for codepoint-substring-after(), etc.
Resolution:
RESOLVED: Functions changed to reflect this viewpoint.
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
Users might reasonably expect us to provide a QName constructor that takes as input the string "prefix:local-name".
Resolution:
RESOLVED: Constructor added.
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
It might be more user-friendly to return an empty string if the name is in no namespace, since an empty string can never be used as a namespace URI.
Resolution:
This issue occurs in 7.2.2 xf:get-namespace-uri
Originator: | Mike Kay (member-only message) |
Locus: | Syntax |
These sections state that, if the nodes are in different documents, the results are implementation-dependent. This is unnecessary, since [XQuery 1.0 and XPath 2.0 Data Model] defines what document order means in these cases.
Resolution:
RESOLVED. Wording changed.
Originator: | Don Chamberlin (member-only message) |
Locus: | Syntax |
string(node) contains the XPath 1.0 definition of the string() function. This definition is based on the type system of XPath 1.0, which has only four types, and it should be reconsidered for XQuery. For example, the definition says that a sequence is converted to a string by returning the string-value of the first item in the sequence. This conflicts with our general policy of raising an error if a scalar function is called with a sequence of length greater than one.
Resolution:
This issue is not referenced!
Originator: | Don Chamberlin (member-only message) |
Locus: | Syntax |
The XPath 1.0 definition of the boolean() function is based on the type system of XPath 1.0, which has only four types, and it should be reconsidered for XQuery. For example, the definition says that a sequence is true if and only if it is non-empty. But in XQuery we believe that a sequence that contains the single Boolean value False should in fact be False, not True.
Resolution:
RESOLVED. Part of resolution of implicit conversions.
Originator: | Don Chamberlin (member-only message) |
Locus: | Syntax |
The union-all, intersect-all, and except-all functions return their results in document order. These functions should return their results in implementation-defined order. The union, intersect, and except operators (like path-steps) eliminate duplicates and sort in document order. This is expensive. The "-all" versions of these operators should take the "cheap" strategy: don't eliminate duplicates and don't sort in document order. If the user has a need for either duplicate elimination or sorting, orthogonal functions are (or should be) available for this purpose (see [Issue 66: A function to reorder a sequence into document order is needed]).
Resolution:
RESOLVED. Functions removed.
Originator: | Don Chamberlin (member-only message) |
Locus: | Syntax |
Comparison of datetime values describes six comparison operators that return true, false, or "indeterminate", said to be represented by the symbol "<>
". All other comparison operators in the language represent the unknown truth value by an empty sequence. The operators in that section should be defined consistently with the rest of the language. This issue is not adequately described by , which deals with indeterminate date/time values (in the new issue, we need to represent an unknown truth-value, not an indeterminate date/time.)
Resolution:
The operands are restricted to be values of the same kind so indeterminate results never arise.
Originator: | Don Chamberlin (member-only message) |
Locus: | Syntax |
Section 6.1.2.4 refers to namespace URI's as being "in scope". I do not understand what this means. XQuery has a concept of a scope for namespace prefixes, but as far as I know we have not defined the concept of scope for URI's.
Resolution:
This issue is not referenced!
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
Comparisons of Duration and Datetime values: Should these be functions or operators?
Resolution:
Comparison of duration and dateTimes are defined as operators.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
add-months() is incompletely specified. What is February 28th, 2001 + 1 month? Does the result always have the same value for DD? Or is there a standard length month? add-years() is also incompletely specified. Is leap-year taken into account? Does the result have the same values for MM and DD?
Resolution:
RESOLVED: These functions have been removed.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
Since these are essentially blobs, does it make sense to define comparators on them?
Resolution:
RESOLVED: Deleted. Only equal and not-equal remain.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
We need to carefully consider which boolean conversions make sense.
Resolution:
Subsumed by issue 156.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
This document is missing the distinct() function used in the XQuery document. We have added xf:distinct-values() - I think it would be best to remove this latter function and add the former, which occurs liberally in our use cases and XQuery spec.
Resolution:
RESOLVED. We now have distinct-nodes and distinct-values.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
This document is missing a function to put nodes in document order, eliminating duplicates by identity. This has been called xf:doc-order() in some emails. I am not sure that we need xf:distinct-nodes(). If we have xf:doc-order() and xf:distinct(), that should be enough.
Resolution:
This issue occurs in 12.2.7 xf:distinct-nodes
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
I also question the utility of the following: xf:sort() Why not use SORTBY instead? xf:reverse-sort() Again, use SORTBY.
Resolution:
RESOLVED. Functions removed.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
xf:position(), xf:sublist-before(), xf:sublist-after(), xf:sequence-pad-beginning(), xf:sequence-pad-end(), xf:truncate-beginning(), xf:truncate-end(), xf:resize-beginning(), xf:resize-end()
All of these rely on complex deep comparisons of nodes. But we will probably need to supply more than one way of comparing nodes. None of these feel like they fall on the right side of the 80/20 decision.
A complete specification of these functions is complex, and there are many different ways we might choose to define the comparisons that all make sense.
If we do choose to keep these functions, I would argue that they should be second order functions, where the user specifies the comparison function. Since we have agreed not to do second-order functions in Level 1.0, that would mean postponing it until Level 2.0.
Resolution:
RESOLVED: Most functions deleted; position is context function now.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
xf:insert() - This is easy to do without the function.
xf:insert($target, $position, $inserts) => $target[1 to $position], $inserts, $target[($position+1) to last()]
Do we really need a function for this?
Resolution:
RESOLVED: WG voted to keep insert.
Originator: | Jonathan Robie (member-only message) |
Locus: | Syntax |
Since there is no one right way to compare nodes by value, this makes sense only for simple types. See also [Issue 91: Need value-based functions for Union, Intersect and Except.].
Resolution:
This issue occurs in 12.3 Equals, Union, Intersection and Except,
Originator: | (member-only message) Minutes of 10/31 Query telcon. |
Locus: | Syntax |
The ? is used in the XML EBNF to indicate that a token is optional. Using the ? after a type name in a function signature to indicate that the empty sequence is allowed uses the ? to indicate a quite different semantic. This may be confusing to users.
Resolution:
This issue occurs in 1.2 Notations
Originator: | (member-only message) Minutes of 10/31 Query telcon. |
Locus: | Syntax |
What should be the name of the three-valued NOT function?
Resolution:
This issue occurs in 5.3.2.1 Examples
Originator: | (member-only message) Don Chamberlin. |
Locus: | Syntax |
According to the rules in section 15.2.1, dollars can be cast into rubles and inches can be cast into meters as long as they have compatible base types (no actual conversion is performed; 100 dollars simply becomes 100 rubles with no warning.) I have misgivings about this.
Resolution:
This issue occurs in , 14 Casting Functions
Originator: | (member-only message) Anders Berglund. |
Locus: | Syntax |
Should we have functions that convert a date/time time value from one timezone to another? If the original value has no timezone, the timezone is added. If it hasa timezone, the value is changed to conform to the specified timezone. Perhaps an alternate signature takes a timezone delta.
Resolution:
This issue occurs in 6 Constructors, Functions, and Operators on Dates and Times
Originator: | Andrew Eisenberg. (member-only message) |
Locus: | Syntax |
"Should the functions that return timezones return a duration rather than a string?"
Resolution:
This issue occurs in 6.4.9 xf:get-timezone-from-dateTime
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
We need a table showing the mapping of operators to functions. Which document should contain it?"
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
The documents talk vaguely about throwing errors, type errors, an error object; MFF suggested an error function. We need a comprehensive treatment of error behaviour and possibly error handling."
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should > and < operators apply to strings? In the sense that do these operations make sense for strings?"
Resolution:
This issue occurs in 4.3 Equality and Comparison of Strings
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Does string equality use the codepoint collation or the default collation. Note that we decided that codepoint comparisons would be done via a special collation.
Resolution:
This issue occurs in 4.3.1 xf:compare
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
What do floor, ceiling and round return? The document says integer. But NaN and the empty sequnce are allowed. Should they return the same type as their operand (without a fractional part)? This allows them to operate on numbers larger than a decimal or integer can accomodate.
Resolution:
This issue occurs in 3.5 Functions on Numeric Values
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should we add a function to tokenize a string, breaking on a specified character?"
Resolution:
This issue occurs in 4.4 Functions on String Values
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should the concat function accept sequences as arguments? Should sequences of strings be flattened? Should string-values be used if the items in the sequence are not strings?
Resolution:
This issue occurs in 4.4.2 xf:concat
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
We need to specify minimum conformance requirements based on resource limitations such as the maximum number of nodes in a sequence, number of text nodes in a document, etc."
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Need to align the node-before and node-after functions with the precedes, follows, << and >> operators inn the XPath/XQuery documents.
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
The xf:document() function needs to be aligned with XSLT.
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should the F&O document imply any type promotions at all or should all of the numeric type promotion material in section 3.3 be in the language documents?
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Either the constructor functions should allow dynamic expressions or the syntax should be changed so that they do not appear to be functions.
Resolution:
This issue occurs in 3.2 Numeric Constructors
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Comparisons of durations that contain both months and days can return indeteriminate results as defined by XML Schema. Similarly, date/time times that may or may not have a timezone specified return indeterminate results. Should such comparisons be supported?
Resolution:
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
We document currently defines comparison functions on durations and dateTime. Do we need comparison functions for other date/time types. See also, issue 150.
Resolution:
This issue occurs in 6.3 Comparisons of Duration and Datetime Values
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
The document will be made more complete and smaller by having a single extraction function for each date/time datatype that takes as a parameter the name of the bfield it extracts. Break timezone into timezone hours and timezone minutes or extract as) duration.
Resolution:
This issue occurs in 6.4 Component Extraction Functions on Datetime Values
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should we add functions to add/subtract durations and multiply a duration by a number?
Resolution:
This issue occurs in 6 Constructors, Functions, and Operators on Dates and Times
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Should we define a second order distinct function where the comparison function is passed as an argument? Mike Kay to write a proposal.
Resolution:
This issue occurs in 12.2.7 xf:distinct-nodes
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
The term 'empty content' should be changed or, at least, be carefully defined. Is an attribute node with the value of the empty string empty content?
Resolution:
This issue occurs in 11.2.2 xf:if-empty
Originator: | (member-only message) Minutes of December 5, 2001 meeting. |
Locus: | Syntax |
Why is the definition of boolean() different from the rules for converting a sequence into a boolean? One possibility is to consider this a legacy function that performs the XPath 1.0 test. Should this function be moved into the XSLT document in that case? This needs to be synchronized with the fallback conversions for boolean in XPath 2.0.
Resolution:
This issue occurs in 12.2.1 xf:boolean
Originator: | Andrew Eisenberg. (member-only message) |
Locus: | Syntax |
boolean-from-string should accept only 1, 0, true, false. This is what XML Schema allows and that's all we need.
Resolution:
This issue occurs in 5.1.3 xf:boolean-from-string
Originator: | Don Chamberlin. (member-only message) |
Locus: | Syntax |
We need equality functions for all datatypes. Currently, we are lacking equality functions for some date and time types (Issue 151), QNames, URI and NOTATION.
Resolution:
This issue occurs in 11.1.4 xf:deep-equal
Originator: | Andrew Eisenberg. (member-only message) |
Locus: | Syntax |
For fractional seconds precision we should choose a limit that matched SQL's TIMESTAMP data type, which is 6 digits of fractional seconds precision.
Resolution:
This issue occurs in 6.1 Duration and Datetime Types
This appendix tracks gross changes in the document; it is not intended to provide a fine-grained revision history.
08 Oct 2001 (ndw): Removed
xf:get-Century-from-gYear
,
xf:get-Century-from-gYearMonth
,
xf:get-gYear-from-dateTime
,
xf:get-gYear-from-date
,
xf:get-gYear-from-gYearMonth
,
xf:get-gMonth-from-dateTime
,
xf:get-gMonth-from-date
,
xf:get-gMonth-from-gYearMonth
,
xf:get-gMonth-from-gMonthDay
,
xf:get-gDay-from-dateTime
,
xf:get-gDay-from-date
,
xf:get-gDay-from-gMonthDay
,
xf:get-timezone-from-gYear
,
xf:get-timezone-from-gYearMonth
,
xf:get-timezone-from-gMonth
,
xf:get-timezone-from-gMonthDay
,
xf:get-timezone-from-gDay
,
xf:add-months
,
xf:add-years
,
xf:add-gMonth
,
xf:add-gYear
,
xf:sublist-before
,
xf:sublist-after
,
xf:sequence-pad-beginning
,
xf:sequence-pad-end
,
xf:truncate-beginning
,
xf:truncate-end
,
xf:resize-beginning
,
xf:resize-end
,
xf:unordered
,
xf:union-all
,
xf:intersect-all
, and
xf:except-all
.
09 Oct 2001 (ndw): Replaced
string-pad-beginning
and
string-pad-end
with
string-pad
.
09 Oct 2001 (ndw): Reworked definition for xf:match
.
09 Oct 2001 (ndw): Removed references to functions we've removed.
09 Oct 2001 (ndw): Added experimental "operators as functions" syntax.
26-Oct-2001 (AM) Added section showing exposed functions from accessors and kind tests.
26-Oct-2001 (AM) Changed comparison functions on dateTime and duration to accept only those arguments that would return a determinate result. Closed issues on indeterminate results.
26-Oct-2001 (AM) Added NOT3 function. Added issue on name of this function.
26-Oct-2001 (AM) Added if-absent() and if-empty() functions.
31Oct-2001 (AM) Added issue on syntax used to indicate that a function accepts a empty sequence.
31-Oct-2001 (AM) Added section with four context functions.
31-Oct-2001 (AM) Changed section on functions on sequences to discuss heterogeneous sequences. Changed aggregate function definitions accordingly.
31-Oct-2001 (AM) Added wording to say that constructors accept only literals as per Reston minutes.
1-Nov-2001 (AM) Rewrote notations section to add note on derived types.
1-Nov-2001 (AM) Rewrote match and replace functions to remove optional collation argument and use codepoint comparisons.
1-Nov-2001 (AM) Removed operators on nodes.
1-Nov-2001 (AM) Changed operators on hexBinary and base64Binary to functions.
2-Nov-2001 (AM) Changed operators on boolean to functions.
21-Nov-2001 (AM) Added issue on whether casting to derived types should be permitted.
25-Nov-2001 (AM) Added material on which functions back up which operators.
10-Dec-2001 (AM) Removed get-QName-from-prefix.
10-Dec-2001 (AM) Removed xf:temporal-dateTimes-contains, xf:temporal-dateTimeDuration-contains and xf:temporal-durationDateTimes-contains.
10-Dec-2001 (AM) Added issues, normal and high priority, as recorded in minutes of the 12/5 meeting: http://lists.w3.org/Archives/Member/w3c-xml-query-wg/2001Dec/0023.html
xf:if-absent
((elementNode | attributeNode)?
$node
, anySimpleType
$value
) =>
(elementNode | attributeNode | anySimpleType)?
xf:if-empty
((elementNode | attributeNode)?
$node
, anySimpleType
$value
) =>
(elementNode | attributeNode | anySimpleType)