fn:contains
(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 in Abhängigkeit davon, ob ein Teststring im getesteten Ausdruck enthalten ist oder nicht.
Aufruf/Argumente:
fn:contains($teststring?, $vergleichsstring?, $collation-URI?)
$teststring:
Optional. Ein Eingabewert vom Typ String xs:string, für den überprüft werden soll, ob in ihm der als zweites Argument übergebene Vergleichsstring als Substring enthalten ist. Handelt es sich bei dem Argument nicht um einen String, so wird ein Typfehler gemeldet. Die leere Sequenz als Argument wird wie der leere String behandelt. Ist $teststring der leere String, so gibt die Funktion den Wert false zurück. (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, der auf Vorkommen als Substring im String des ersten Arguments getestet wird. Handelt es sich bei dem Argument nicht um einen String, so wird ein Typfehler gemeldet. Die leere Sequenz wird wie der leere String behandelt. Ist $vergleichsstring der leere String, so gibt die Funktion den Wert true zurück (der leere String ist in einem anderen String stets enthalten, sofern dieser nicht selbst leer ist).
$collation-URI:
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. (XPath 1.0 kennt keine Collations und nimmt dementsprechend kein drittes Argument entgegen.)
Verwendungszweck:
Der Rückgabewert von fn:contains() ist true, wenn der überprüfte String den Teststring enthält oder mit ihm identisch ist. Formal ausgedrückt, muss der getestete String eine zusammenhängende Folge von Zeichen aufweisen, deren Unicode-Werte den korrespondierenden Zeichen im Teststring entsprechen. In allen anderen Fällen ist der Rückgabewert der Funktion false.
Im einfachsten Fall werden unmittelbar zwei Strings übergeben:
fn:contains("abc","b") ergibt true
Sonderfälle und Anmerkungen:
Wird als Vergleichsstring der leere String oder – gleichwertig – die leere Sequenz übergeben, so ist der Rückgabewert immer true. Ist dagegen der getestete String selbst leer bzw. wird als erstes Argument die leere Sequenz übergeben, so ist der Rückgabewert stets false – es sei denn, der Vergleichsstring wäre gleichfalls ein leerer String.
Es ist möglich, mit Hilfe des optionalen dritten Funktionsarguments eine vordefinierte Vergleichsliste (Collation) für den Textvergleich heranzuziehen – 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 nicht die Default-Collation des Systems verwendet. Das Verhalten von fn:contains() geht damit konform mit denjenigen Stringfunktionen, die reguläre Ausdrücke verwenden, wie fn:matches(), fn:replace() und fn:tokenize(). Jene Funktionen arbeiten ebenfalls auf Basis der Unicode Codepoint Collation, bei ihnen kann jedoch keine andere Collation zugewiesen werden.
Beispiele:
Beispiel 1 – Vergleichsstring im Eingabestring enthalten:
fn:contains('Beispiel', 'eis')
gibt true zurück.
Der Vergleichsstring ist im Eingabestring enthalten – die Funktion gibt daher den booleschen Wert true zurück.
Beispiel 2 – Vergleichsstring im Eingabestring nicht enthalten:
fn:contains('Beispiel', 'nein')
gibt false zurück.
Der Vergleichsstring ist im Eingabestring nicht enthalten – die Funktion gibt daher den Booleschen Wert false zurück.
Beispiel 3 – Vergleichsstring ist der leere String:
fn:contains('Beispiel', '')
gibt true zurück.
Der Vergleichsstring ist der leere String. Dieser gilt als in einem beliebigen Teststring enthalten – die Funktion gibt daher den booleschen Wert true zurück. Dies gilt auch dann, wenn der Teststring ebenfalls leer ist:
fn:contains('', '')
gibt ebenfalls true zurück.
Beispiel 4 – Verwendung einer Collation:
Wird zur Auswertung des Textvergleichs eine Collation als Textvergleichsanweisung hinzugezogen, die bestimmte Zeichen als "zu ignorieren" festlegt, so werden diese vor dem Vergleich aus dem zweiten Argumentstring entfernt.
fn:contains('Beispiel', '-e-i-s-', BeispielCollation)
gibt true zurück. Angenommen, der Bindestrich wird innerhalb von BeispielCollation als "zu ignorieren" definiert, so wird der String '-e-i-s-' als 'eis' interpretiert. Der hier vorgenommene Vergleich entspricht also:
fn:contains('Beispiel', 'eis')
und ergibt demzufolge true. Enthält $vergleichsstring ausschließlich zu ignorierende Zeichen (soll z.B. zusätzlich auch * ignoriert werden), so wird er wie der leere String gewertet:
fn:contains('Beispiel', '-*-*-*-'‚ BeispielCollation)
ergibt true, da es fn:contains('Beispiel', '') entspricht.
Beispiel 5 – Formulierung einer Bedingung:
Die Suche nach einem zusammengesetzten Begriff, der in nicht klar definierter Form vorliegt, kann durch fn:contains() zwar erleichtert werden, hat aber trotzdem Tücken. Angenommen, in einer Variablen $autorname sei der Name eines Buchautors abgespeichert:
<xsl:if test="fn:contains($autorname, 'Karl') and fn:contains($autorname, 'May')">
<!-- Sequence Constructor -->
</xsl:if>
Dieser Test ist erfolgreich für $autorname="Karl May", $autorname="May, Karl", aber in der vorgegebenen Form eben auch für $autorname="Karlheinz Mayer". In XPath 1.0 kann ohne reguläre Ausdrücke, die hier noch nicht vorgesehen sind, nicht ohne weiteres nach Wortbegrenzungen gesucht werden.
Funktionsdefinition:
XPath 1.0:
contains(string, string) => boolean
XPath 2.0:
fn:contains($arg1 as xs:string?,
$arg2 as xs:string?) as xs:boolean
fn:contains($arg1 as xs:string?,
$arg2 as xs:string?,
$collation as xs:string) as xs:boolean
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.
<< 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