fn:concat

(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; bestehend aus den einzelnen übergebe­nen und aneinander gehängten Teilstrings.

Aufruf/Argumente:

fn:concat($string_1, $string_2 ..., $string_n)

$string_1:
Obligatorisch. Ein Argument vom Typ xs:anyAtomicType, das mittels Casting in einen String xs:string umgewandelt wird, bzw. ein XPath-Ausdruck, der einen (einzelnen) String ergibt. Ist das Argu­ment nicht in den Typ xs:string umwandelbar, so wird ein Typfehler gemeldet. Handelt es sich bei dem übergebenen Argument um die leere Sequenz, so wird es bei der Verkettung als leerer String gewertet.

$string_2:
Obligatorisch. Ein Argument vom Typ xs:anyAtomicType, das, wie oben, zu einem zweiten Strings xs:string ausgewertet wird, der mit dem ersten verkettet werden soll. Handelt es sich bei dem übergebenen Argument um die leere Sequenz, so wird es bei der Verkettung als leerer String gewertet.

$string_3, …, $string_n:
Jeweils optional. Beliebig viele weitere Argumente vom Typ xs:anyAtomicType, die ebenfalls zu Strings xs:string ausgewertet werden, die in der übergebenen Reihenfolge mit den ersten beiden Argumenten verkettet werden.

Verwendungszweck:

An fn:concat() übergebene Strings xs:string oder Ausdrücke, deren Auswertung jeweils einen String ergeben, werden zu einem Ergebnisstring zusammengefasst. Die Kardinalität jedes der übergebenen Argumente muss dabei der Funktion fn:zero-or-one() Genüge tun, infolgedessen ist die Über­gabe von Sequenzen, die aus jeweils mehreren Strings bestehen, als Argument nicht gestattet (siehe Beispiel 3).

Im einfachsten Fall sieht der Aufruf von fn:concat() folgendermaßen aus:

fn:concat("a","b") ergibt "ab"

Als nützliche Erleichterung kann fn:concat() dienen, wenn für das Erzeugen eines Output-Strings ansonsten mehrere xsl:value-of-Befehle erforderlich wären:

<xsl:value-of select="fn:concat(vorname, ' ', nachname)" />

Der obige Ausdruck gibt beispielsweise die Inhalte der Elemente <vorname> und <nachname> hintereinander aus und fügt dazwischen ein Leerzeichen ' ' ein. Die Elementbezeichner werden durch den Stringwert der Elemente ersetzt. Etwas länglicher hätte man auch so schreiben können:

<!-- Alternative: -->
<xsl:value-of select="vorname"/>
  <xsl:text> </xsl:text>
<xsl:value-of select="nachname"/>

Das Element <xsl:text> ist in diesem Fall erforderlich, da Whitespace-Zeichen sonst vom Parser entfernt würden.

Achtung – nur Einzelstrings als Argumente:
Die Funktion fn:concat() nimmt – wie oben beschrieben – als Argumente nur Einzelstrings entgegen, keine Sequenzen aus mehreren Strings (bzw. Ausdrücke die Stringsequenzen aus mehreren Items ergeben). Für diese Zwecke kann jedoch analog die Funktion fn:string-join() ein­gesetzt werden (siehe Beispiel 6).

Beispiele:

Beispiel 1 – Verbinden zweier übergebener Strings:

fn:concat('Hallo ', 'Welt!')

ergibt den String "Hallo Welt!".

Die beiden übergebenen Strings werden in der Reihenfolge ihrer Übergabe aneinander gehängt ausgegeben. Eine Normalisierung der Einzelstrings im Vorfeld erfolgt nicht – führende und folgende Leerzeichen innerhalb der Ein­zelstrings erscheinen daher im Ergebnis.

Beispiel 2 – Verbinden mehrerer übergebener Strings:

fn:concat( 'Bester ', 'Herr ', (), ",", "bringt ", " ", 'einige', ' Ordnung', ' in', ' Eure ', 'Reden!')

ergibt den String "Bester Herr, bringt einige Ordnung in Eure Reden!"

Eine leere Sequenz wird in den leeren String umgewandelt und mit den anderen Stringargumenten verkettet. Prinzipiell können beide Arten von Stringbegrenzern im Funktionsaufruf erscheinen, wobei in der Praxis auf Stringbegrenzer des umgebenden XPath-Ausdrucks Rücksicht genommen wer­den muss.

Beispiel 3 – Fehlerquelle: Sequenzen als Argumente

fn:concat( ('so','so'), 
           ('ja','ja')
  )

Dieser Aufruf von fn:concat() ergibt einen Fehler, sofern nicht der Kompatibilitätsmodus zu XPath 1.0 aktiviert ist. In diesem Fall wird jeweils das erste Item der übergebenen Sequenzen (die dann analog zu Nodesets behandelt werden) als Argument verwendet und die restlichen verworfen.

fn:concat( ('so','so'), 
           ('ja','ja')
 )

ergibt bei aktiviertem Kompatibilitätsmodus "soja".

Die übergebenen Argumente dürfen sonst, da sie vom Typ xs:anyAtomicType sein müssen, nicht die Form von Sequenzen aus zwei oder mehr Items besitzen (Singleton-Sequenzen sind gestattet – ansonsten wird ein Kardinalitätsfehler gemeldet). Eine übergebene Sequenz wird jeweils als Einzelargument betrachtet. Zwei wie oben übergebene, aus Strings bestehende, Sequenzen werden also nicht zu Einzelargumenten aufgelöst.

Es gilt also:

fn:concat(  $string_1, $string_2, ..., $string_N 
  )

ist nicht das gleiche wie (beachten Sie die inneren Sequenzklammern!)

fn:concat( ($string_1, $string_2, ..., $string_N
  
)

Der zweite Fall wird als Übergabe eines einzelnen Arguments gewertet, was ein Verstoß gegen die geforderte Funktionssignatur ist. Auch wenn noch ein zweites Argument übergeben würde, ergäbe das erste ohne aktiven Kompatibilitätsmodus jedoch einen Kardi­nalitätsfehler. Ansonsten wird $string_1 als erstes Argument verwendet und der Rest der Sequenz verworfen.

Beispiel 4 – Einsatz von fn:concat() bei Definition von Schlüsseln:

In Zusammenhang mit einer Schlüsseldefinition xsl:key kann fn:concat() nützliche Dienste leisten, da es sich bei einem Schlüssel stets um einen eintei­ligen Wert handeln muss.

Es ist beispielsweise nicht ohne weiteres möglich, für ein Element <mitarbei­ter> den Inhalt zweier seiner Kindelemente <vorname> und <nachname> als »zusammengesetzten« Schlüssel zu definieren. Statt dessen setzt man als Kunst­griff bei der Definition des Schlüssels die Funktion fn:concat() ein und erzeugt so einen Gesamtschlüssel:

<mitarbeiter>
   <vorname>Torsten</vorname>
   <nachname>Meier</nachname>
   <!-- ... mehr Info ... -->
</mitarbeiter>

und folgenden Schlüssel:

<xsl:key name="vollst_name" match="mitarbeiter" use="fn:concat(vorname, ' ', nachname)"/>

Nun kann »Torsten Meier« mit

<xsl:for-each select="key('vollst_name', 'Torsten Meier')">
   ... 
</xsl:for-each>

gefunden werden. Namen, die nur einen der Teilstrings enthalten (wie für die­ses Beispiel »Torsten Müller« oder »Stefan Meier«), tauchen in den Ergebnissen nicht mehr auf.

Funktionsdefinition:

XPath 1.0:

concat(string, string, string*) => string

XPath 2.0:

fn:concat($arg1 as xs:anyAtomicType?,
          $arg2 as xs:anyAtomicType?, ...) 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