fn:substring-after
(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 – Manipulation
Herkunft: XPath 1.0
Rückgabewert: Ein String xs:string; ein Teilstring eines Eingabestrings, beginnend mit dem ersten Zeichen nach dem ersten Auftreten eines ebenfalls übergebenen Vergleichsstrings bis zum Ende des Eingabestrings.
Aufruf/Argumente:
fn:substring-after($eingabe, $vergleichsstring, $collation-URI?)
$eingabe:
Obligatorisch. Der zu untersuchende String xs:string. Handelt es sich bei dem Argument nicht um einen String, so wird ein Typfehler gemeldet. Die leere Sequenz ist als Wert zugelassen und wird wie der leere String behandelt.
$vergleichsstring:
Obligatorisch. Ein String xs:string, nach dessem ersten Auftreten im Eingabestring gesucht wird. Der Teilstring ab dem ersten Auftreten des Vergleichsstrings bis zum Ende des Eingabestrings wird ausgegeben. Handelt es sich bei dem Argument nicht um einen String, so wird ein Typfehler gemeldet. Die leere Sequenz ist als Wert zugelassen (wenn auch wenig sinnvoll) und wird wie der leere String behandelt.
$collation-URI: (neu in XPath 2.0)
Optional. Das dritte Argument besteht aus einem String xs:string, der den URI-String der anzuwendenden Collation benennt. Der Wert muss lexikalisch dem Typ xs:anyURI entsprechen. Wird kein drittes Argument übergeben, so wird für den Vergleich die Unicode Codepoint Collation herangezogen. Dieses Argument steht in XPath 1.0 nicht zur Verfügung.
Verwendungszweck:
Die Funktion fn:substring-after() gibt denjenigen Teil eines Eingabestrings zurück, der dem ersten Vorkommen eines Vergleichsstrings im Eingabestring folgt. Der Vergleichsstring sollte aus mindestens einem einzelnen Zeichen oder einer Zeichenkette bestehen. Falls der Vergleichsstring im untersuchten String mehrmals auftritt – zum Beispiel ein Trennsymbol in einer als Einzelstring vorliegenden Liste –, wird nur sein erstes Vorkommen berücksichtigt. Dies kann durch mehrmalige rekursive Verarbeitung berücksichtigt werden (Beispiel 2). Alternativ kann die Funktion fn:tokenize() eingesetzt werden.
Ist der als zweites Argument übergebene Teststring nicht im Eingabestring enthalten oder ist der Eingabestring leer (bzw. als erstes Argument wurde die leere Sequenz übergeben), so wird ein leerer String zurückgegeben.
Dasselbe passiert aber auch, wenn der Eingabestring mit dem Vergleichsstring endet. Um diesen Umstand zu überprüfen, kann man fn:contains() zu Hilfe nehmen. Falls der Vergleichsstring selbst leer ist oder als zweites Argument die leere Sequenz übergeben wurde, wird der vollständige Eingabestring ausgegeben.
Wird der Funktion kein drittes Argument zur Nennung einer Collation übergeben, so findet der Stringvergleich anhand der Unicode Codepoint Collation statt. Es wird also ausdrücklich nicht die Default-Collation des Systems herangezogen. Das Verhalten von fn:substring-after() geht damit konform mit denjenigen Stringfunktionen, die reguläre Ausdrücke verwenden, also fn:matches(), fn:replace() und fn:tokenize().
Verhalten unter XPath 1.0:
In XPath 1.0 werden die Argumente, falls es sich nicht um Strings handelt, nach den Regeln der Umwandlungsfunktion string() automatisch in Strings verwandelt. Ist das erste Argument ein leerer Nodeset, so wird ein leerer String zurückgegeben. In XPath 2.0 wird dagegen eine leere Sequenz () zurückgegeben, wenn ein beliebiger der ersten zwei Operanden die leere Sequenz ist.
Beispiele:
Beispiel 1 – Einfache Anwendung auf zwei Strings:
fn:substring-after('Das ist ein Beispiel', 'ist')
ergibt ' ein Beispiel'
Es wird der unmittelbar auf den Vergleichsstring folgende Substring des Eingabestrings zurückgegeben, in diesem Fall mit führendem Leerzeichen. (Keine automatische Normalisierung!)
Beispiel 2 – Leerer String als Vergleichsstring:
fn:substring-after('Das ist ein Beispiel', '')
ergibt 'Das ist ein Beispiel'
Es wird der gesamte Eingabestrings zurückgegeben. Dies beruht auf der Prämisse, dass am Beginn jedes Strings ein leerer String existiert.
Beispiel 3 – Anwendung bei rekursiver Stringverarbeitung:
Grundsätzlich ist fn:substring-after() nützlich, wenn in einem längeren String Trennzeichen (delimiter) enthalten sind. Die Funktion findet allerdings nur das erste Auftreten eines Trennzeichens, muss also rekursiv angewendet werden, falls der Delimiter mehrmals auftritt. In einer durch Leerzeichen o. Ä. getrennten Liste von Token ist dies oft der Fall.
Ein komplexes Vorgehen, wie in diesem Beispiel beschrieben, war in XPath 1.0 unumgänglich – in XPath 2.0 kann man alternativ einfach die Funktion fn:tokenize() anwenden.
Im folgenden Beispiel wird eine als String vorhandene durch Leerzeichen getrennte Tokenliste in eine durch HTML-Breaks getrennte Liste umgewandelt. Hierfür werden zwei Templates benötigt, von denen das zweite sich selbst wieder aufruft und die eigentliche Arbeit verrichtet.
Zunächst aber muss die Tokenliste »vorbereitet« werden:
<!-- erstes Template erzwingt folgendes Leerzeichen: -->
<xsl:template select="tokenliste">
<xsl:variable name="die_tokenliste" select="fn:concat(fn:normalize-space(.),' ')"/>
<xsl:call-template name="listenausgabe">
<xsl:with-param name="liste" select="$die_tokenliste"/>
</xsl:call-template>
</xsl:template>
Damit die Umwandlung fehlerfrei funktioniert, wird in dem vorangeschalteten Template sichergestellt, dass in der Tokenliste maximal ein Leerzeichen in Folge auftritt (also müssen auch Tabulatoren und Zeilenumbrüche entfernt werden) und hinter dem letzten Token ebenfalls ein Leerzeichen steht.
Dies wird erreicht durch den Einsatz der Funktionen fn:normalize-space() zur Entfernung überschüssiger Leerzeichen und fn:concat(), um ein Leerzeichen an den Schluss anzuhängen. Würde man dies unterlassen, so würde die letzte Anwendung von fn:substring-before() das letzte Token nicht erkennen, da diesem kein Leerzeichen folgt. Das Anhängen des Leerzeichens muss nach der Normalisierung erfolgen, da es sonst gleich wieder entfernt würde.
<!-- zweites Template gibt die Liste aus: -->
<xsl:template name="listenausgabe">
<xsl:param name="liste"/>
<xsl:variable name="token" select="fn:substring-before($liste, ' ')"/>
<xsl:variable name="rest" select="fn:substring-after($liste, ' ')"/>
<!-- Ausgabe des ersten Teils der Liste: -->
<xsl:value-of select="$token"/>
<!-- prüfen, ob Rest geblieben ist ... -->
<xsl:if test="$rest">
<!-- Break ausgeben: -->
<br/>
<!-- ... und Template wieder aufrufen: -->
<xsl:call-template name="listenausgabe">
<!-- Rest der Liste wird neuer Anfangswert: -->
<xsl:with-param name="liste" select="$rest"/>
</xsl:call-template>
</xsl:if>
<xsl:template>
Das erste Listenelement wird mit fn:substring-before() abgetrennt und unmittelbar danach ausgegeben. Mit <xsl:if test="$rest"> wird überprüft, ob von der Liste ein nicht leerer Rest geblieben ist.
Die Rekursivität wird erreicht, indem sich das benannte Template selbst mit xsl:call-template erneut aufruft und sich den mit fn:substring-after() erzeugten Rest der Liste als neuen Anfangswert übergibt.
Funktionsdefinition:
XPath 1.0:
substring-after(string, string) => string
XPath 2.0:
fn:substring-after($arg1 as xs:string?,
$arg2 as xs:string?) as xs:string
fn:substring-after($arg1 as xs:string?,
$arg2 as xs:string?,
$collation 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