fn:encode-for-uri

(Auszug aus "XSLT 2.0 & XPath 2.0" von Frank Bongers, Kapitel 5.)

A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z

   

Kategorie: Stringfunktionen – URI-Konvertierung

Herkunft: XPath 2.0

Rückgabewert: Ein String xs:string, in dem Sonderzeichen (reserved characters) gemäß der Regeln des URI-Encodings encodiert sind.

Aufruf/Argumente:

fn:encode-for-uri($eingabestring)

$eingabestring:
Eine Eingabestring xs:string, innerhalb dessen Sonderzeichen für die Verwendung als URI nach den Regeln der URI-Encodings (siehe RFC 3986, Abschnitt 2) kodiert werden soll. Für eine leere Eingabesequenz gibt die Funktion den leeren String zurück.

Verwendungszweck:

Die Funktion fn:encode-for-uri() verarbeitet einen ihr übergebenen String und gibt ihn in encodierter Form zurück, sodass er als URI-String vewendet werden kann. Reservierte Zeichen werden durch eine hexadezimal kodierte Escapesequenz ersetzt – das Leerzeichen beispielsweise durch %20. Hierbei ist zu beachten, dass nur diejenigen Zeichen nicht maskiert werden, die als "nicht reserviert" gelten. Dies sind Zahlen, Buchstaben und verschiedene innerhalb von URI-Strings engesetzte Interpunktionszeichen wie Tilde, Unterstrich, Bindestrich-Minus und Punkt:

unreserved  = ALPHA / DIGIT / "-" / "." / "_" / "~"

Andere, als Delimiter eingesetzte Zeichen, wie Doppelpunkt und Slash werden hingegen escaped – die Funktion gilt daher als "nicht idempotent", d.h. sie kann nicht gefahrlos mehrfach hintereinander auf den gleichen String angewendet werden (wie dabei die Escape-Sequenzen wiederum escaped werden):

fn:encode-for-uri(fn:encode-for-uri($string)) => Problem!

Dasselbe Problem tritt auf, wenn ein bereits escapter String übergeben wird, ein String mit Slash als Pfaddelimiter oder ein absoluter URI-String:

fn:encode-for-uri('http://www.beispiel.org/') ergibt ungewollt 'http%3A%2F%2Fwww.beispiel.org%2F', da die im String enthaltenen Slashes und der Doppelpunkt durch Escape-Sequenzen ersetzt werden.

Da das Prozentzeichen ebenfalls nicht zu den nichtreservierten Zeichen gehört, wird es im Zweifelsfalle ecsaped, auch wenn es Teil einer Escapesequenz ist:

fn:encode-for-uri('ein%20Beispiel') ergibt 'ein%2520Beispiel', wobei das Prozentzeichen mit dem die Escape-Sequenz für ein Leerzeichen beginnt, erneut maskiert wird.

Die Funktion gibt also einen korrekten URI-String nicht transparent weiter. Sie sollte nur im Rahmen der Konstruktion eines URIs eingesetzt werden, der beispielsweise durch Verbindung zweier Teilstrings erfolgt, von denen der eine bereits ein absoluter oder relativer URI ist und lediglich der zweite, mit diesem verkette String, escapt zu werden braucht:

fn:concat( 'http://www.beispiel.org/',
                encode-for-uri('~mein account')
  )

ergibt 'http://www.beispiel.org/~mein%20account'.

Funktionsdefinition:

XPath 1.0:

Funktion nicht verfügbar

XPath 2.0:

fn:encode-for-uri($uri-part as xs:string?) as xs:string

   

<< zurück vor >>
Tipp der data2type-Redaktion:
Zum Thema XSLT bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © Galileo Press, Bonn 2008
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XSLT 2.0 & XPath 2.0 ― Das umfassende Handbuch" denselben Bestimmungen wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Galileo Press, Rheinwerkallee 4, 53227 Bonn