fn:iri-to-uri
Converts a string containing an IRI into a URI according to the rules of [RFC 3987].
Signature
fn:iri-to-uri($iri as xs:string?) as xs:string
Properties
This function is deterministic, context-independent, and focus-independent.
Rules
If $iri
is the empty sequence, the function returns the zero-length
string.
Otherwise, the function converts the value of $iri
into a URI according to
the rules given in Section 3.1 of [RFC 3987] by percent-encoding characters
that are allowed in an IRI but not in a URI. If $iri
contains a character
that is invalid in an IRI, such as the space character (see note below), the invalid
character is replaced by its percent-encoded form as described in [RFC 3986] before the conversion is performed.
Since [RFC 3986] recommends that, for consistency, URI producers and normalizers should use uppercase hexadecimal digits for all percent-encodings, this function must always generate hexadecimal values using the upper-case letters A-F.
Notes
The function is idempotent but not invertible. Both the inputs My Documents
and My%20Documents
will be converted to the output
My%20Documents
.
This function does not check whether $iri
is a valid IRI. It treats it as
an string and operates on the characters in the string.
The following printable ASCII characters are invalid in an IRI: "<", ">",
" (double quote), space, "{", "}", "|", "\", "^", and "`". Since these
characters should not appear in an IRI, if they do appear in $iri
they will
be percent-encoded. In addition, characters outside the range x20-x7E will be
percent-encoded because they are invalid in a URI.
Since this function does not escape the PERCENT SIGN "%" and this character is not allowed in data within a URI, users wishing to convert character strings (such as file names) that include "%" to a URI should manually escape "%" by replacing it with "%25".
Examples
The expression fn:iri-to-uri
("http://www.example.com/00/Weather/CA/Los%20Angeles#ocean")
returns "http://www.example.com/00/Weather/CA/Los%20Angeles#ocean"
.
The expression fn:iri-to-uri ("http://www.example.com/~bébé")
returns "http://www.example.com/~b%C3%A9b%C3%A9"
.