fn:id
Returns the sequence of element nodes that have an ID
value matching the
value of one or more of the IDREF
values supplied in $arg
.
Signatures
fn:id($arg as xs:string*) as element()*
fn:id(
$arg as xs:string*,
$node as node()
) as element()*
Properties
The one-argument form of this function is deterministic, context-dependent, and focus-dependent.
The two-argument form of this function is deterministic, context-independent, and focus-independent.
Rules
The function returns a sequence, in document order with duplicates eliminated,
containing every element node E
that satisfies all the following
conditions:
-
E
is in the target document. The target document is the document containing$node
, or the document containing the context item (.
) if the second argument is omitted. The behavior of the function if$node
is omitted is exactly the same as if the context item had been passed as$node
. -
E
has anID
value equal to one of the candidateIDREF
values, where:-
An element has an
ID
value equal toV
if either or both of the following conditions are true:-
The
is-id
property (See is-id Accessor.) of the element node is true, and the typed value of the element node is equal toV
under the rules of theeq
operator using the Unicode codepoint collation (http://www.w3.org/2005/xpath-functions/collation/codepoint
). -
The element has an attribute node whose
is-id
property (See is-id Accessor.) is true and whose typed value is equal toV
under the rules of theeq
operator using the Unicode code point collation (http://www.w3.org/2005/xpath-functions/collation/codepoint
).
-
-
Each
xs:string
in$arg
is parsed as if it were of typeIDREFS
, that is, eachxs:string
in$arg
is treated as a whitespace-separated sequence of tokens, each acting as anIDREF
. These tokens are then included in the list of candidateIDREF
s. If any of the tokens is not a lexically validIDREF
(that is, if it is not lexically anxs:NCName
), it is ignored. Formally, the candidateIDREF
values are the strings in the sequence given by the expression:for $s in $arg return fn:tokenize(fn:normalize-space($s), ' ')[. castable as xs:IDREF]
-
-
If several elements have the same
ID
value, thenE
is the one that is first in document order.
Error Conditions
A dynamic error is raised [ERRFODC0001] if
$node
, or the context item if the second argument is absent, is a node
in a tree whose root is not a document node.
The following errors may be raised when $node
is omitted:
If the context item is absent, dynamic error [ERRXPDY0002]
If the context item is not a node, type error [ERRXPTY0004].
Notes
The effect of this function is anomalous in respect of element nodes with the
is-id
property. For legacy reasons, this function returns the element
that has the is-id
property, whereas it would be more appropriate to return
its parent, that being the element that is uniquely identified by the ID. A new function
fn:element-with-id
has been introduced with the desired
behavior.
If the data model is constructed from an Infoset, an attribute will have the
is-id
property if the corresponding attribute in the Infoset had an
attribute type of ID
: typically this means the attribute was declared as an
ID
in a DTD.
If the data model is constructed from a PSVI, an element or attribute will have the
is-id
property if its typed value is a single atomic value of type
xs:ID
or a type derived by restriction from xs:ID
.
No error is raised in respect of a candidate IDREF
value that does not
match the ID
of any element in the document. If no candidate
IDREF
value matches the ID
value of any element, the
function returns the empty sequence.
It is not necessary that the supplied argument should have type xs:IDREF
or xs:IDREFS
, or that it should be derived from a node with the
is-idrefs
property.
An element may have more than one ID
value. This can occur with synthetic
data models or with data models constructed from a PSVI where the element and one
of its
attributes are both typed as xs:ID
.
If the source document is well-formed but not valid, it is possible for two or more
elements to have the same ID
value. In this situation, the function will
select the first such element.
It is also possible in a well-formed but invalid document to have an element or
attribute that has the is-id
property but whose value does not conform to
the lexical rules for the xs:ID
type. Such a node will never be selected by
this function.
Examples
let $emp :=
validate lax{
document{
<employee xml:id="ID21256"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<empnr xsi:type="xs:ID">E21256</empnr>
<first>John</first>
<last>Brown</last>
</employee>
}
}
The expression $emp/id('ID21256')/name()
returns "employee"
. (The xml:id
attribute has the is-id
property,
so the employee element is selected.)
The expression $emp/id('E21256')/name()
returns "empnr"
. (Assuming the empnr
element is given the type
xs:ID
as a result of schema validation, the element will have the
is-id
property and is therefore selected. Note the difference from
the behavior of fn:element-with-id
.)