fn:starts-with

(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-Analyse

Herkunft: XPath 1.0

Rückgabewert: Ein Boolescher Wert; true oder false, je nachdem, ob der getestete String mit dem Vergleichsstring beginnt oder nicht.

Aufruf/Argumente:

fn:starts-with($teststring?, $vergleichsstring?, $collation-URI?)

$teststring:
Optional. Ein Eingabewert vom Typ String xs:string, für den überprüft werden soll, ob er mit dem als zweites Argument übergebenen Vergleichsstring beginnt. 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. In XPath 1.0 wird der Wert, falls es sich nicht um einen String handelt, nach den Regeln der Umwandlungsfunktion string() in einen String verwandelt.

$vergleichsstring:
Optional. Der String xs:string, auf dessen Vorkommen am Beginn des Teststrings des ersten Arguments getestet wird. 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. Für XPath 1.0 ist das Verhalten analog zu oben.

$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. Ist dies nicht der Fall, wird eine Fehlermeldung ausgegeben (»Invalid collationURI«). 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:

Der Rückgabewert von fn:starts-with() ist true, wenn der überprüfte String mit dem Vergleichsstring beginnt oder mit ihm identisch ist. Komplizierter ausgedrückt: Der getestete String muss mit einer zusammenhängenden Folge von Zeichen beginnen, deren Unicode-Werte den korrespondierenden Zeichen im Vergleichsstring entsprechen. In allen anderen Fällen ist der Rückgabewert der Funktion false.

Im einfachsten Fall werden unmittelbar zwei Strings übergeben:

fn:starts-with("abc","a") ergibt true.

Wird als Vergleichsstring der leere String übergeben, so ist der Rückgabewert immer true. Ist dagegen der getestete String selbst leer, so ist der Rückgabewert stets false – es sei denn, der Vergleichsstring ist gleichfalls leer.

Es ist möglich, mit Hilfe des optionalen dritten Funktionsarguments eine vordefinierte Vergleichsliste (Collation) für den Stringvergleich hinzuzuziehen – beispielsweise um »Fluß« und »Fluss«, »Jäger« und »Jaeger« als sinngemäß identisch erkennen zu können. Die Art und Weise, wie die Collation eingebunden wird, ist implementationsabhängig. Der String, der die Verknüpfung zur Collation herstellt, muss lexikalisch dem Typ xs:anyURI entsprechen, wird aber als xs:string übergeben.

Wird kein entsprechendes drittes Argument ü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:starts-with() 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 ist die Überprüfung nach Unicode-Wert auf Grund der Abwesenheit von Collations nicht in jedem Fall so eindeutig, wie es zu wünschen wäre: Zeichen, die Akzente, Tilden oder ähnliche Beifügungen enthalten, also als zusammengesetztes (composite) Zeichen vorliegen, können in Unicode auf verschiedene Arten ausgedrückt sein. Ein Zeichenvergleich schlägt jedoch für optisch identisch repräsentierte, aber unterschiedlich kodierte Zeichen fehl.

Falls das erste Argument ein leerer Nodeset ist (der in den leeren String umgewandelt wird) und das zweite Argument ein nicht leerer String, so wird für XPath 1.0 der Wert false zurückgegeben.

Beispiele:

Beispiel 1 – Test eines Strings auf Substring am Beginn:

fn:starts-with("Butterblume", "Butter")

gibt true zurück.

Der untersuchte String beginnt mit dem Vergleichsstring.

Beispiel 2 – Test eines Strings mit leerem Vergleichsstring:

fn:starts-with("Butterblume", "")

gibt true zurück.

Der Vergleichsstring ist leer, deshalb gibt die Funktion den Wert true zurück (der leere String ist sozusagen am Anfang des Strings enthalten).

Beispiel 3 – Erfolgloser Test eines Strings auf Beginn mit Vergleichsstring:

fn:starts-with("Butterblume", "blume")

gibt false zurück.

Der untersuchte String enthält zwar den Vergleichsstring, beginnt jedoch nicht damit. Die Funktion fn:starts-with() gibt daher false zurück.

Beispiel 4 – Filterung nach Anfangsbuchstaben eines Strings:

<xsl:template match="buch">
  <xsl:if test="fn:starts-with(autor/nachname, 'B')">
    <p><b>Titel: </b><xsl:value-of select="title"/><br/><i>Autor: </i><xsl:value-of select="autor"/>.</p>
  </xsl:if> 
</xsl:template>

Es werden Titel und Autor von Büchern ausgegeben, bei denen der Nachname des Autors mit 'B' beginnt.

Funktionsdefinition:

XPath 1.0:

starts-with(string, string) => boolean

XPath 2.0:

fn:starts-with($arg1 as xs:string?,
                     $arg2 as xs:string?)      as xs:boolean

fn:starts-with($arg1 as xs:string?,
                     $arg2 as xs:string?,
                     $collation as xs:string) as xs:boolean

   

<< 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