XPath 3.0, XPath 2.0, XPath 1.0 / XPath Funktionen / Stringfunktionen / XPath: string-join

XPath: string-join

XPath: string-join

Bei der XPath-Funktion "string-join" kann eine Sequenz als Parameter übergeben werden, die dann mit Hilfe eines Trennzeichens in eine Zeichenkette konvertiert wird.

XPath: string-join

Die "string-join"-Funktion leistet gegenüber der "concat"-Funktion einiges mehr; hier ist es auch möglich, eine komplette Sequenz als Parameter zu übergeben.

Im folgenden Beispiel werden alle Mensch/name-Elemente des Input-Dokuments angesprochen und nur dann in die Sequenz aufgenommen, wenn sie einem vordefinierten Pattern (erster Buchstabe "S", anschließend nur Kleinbuchstaben) entsprechen.


<xsl:variable name="y" as="xs:string+">
  <xsl:for-each 
    select="for $x in //Mensch/name/text() return 
      if ( matches($x, '[S][a-z]*')) then $x else nothing">
    <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:variable>

Um einen Eindruck zu erhalten, was wir da fabriziert haben, lohnt sich die Ausgabe der Variable $y in einer for-each-Schleife.


<Einzelwerte>
  <xsl:for-each select="$y">
    <wert>
      <xsl:value-of select="."/>
    </wert>
  </xsl:for-each>
</Einzelwerte>

Dessen Ausgabe sähe dann so aus:


<Einzelwerte>
  <wert>Sprachlos</wert>
  <wert>Sagblos</wert>
  <wert>Sorglos</wert>
  <wert>Sinnlos</wert>
  <wert>Schlaflos</wert>
</Einzelwerte>

Vergleichen wir dieses Ergebnis mit jenem, das wir bei Verwendung der "string-join"-Funktion bekommen.


<xsl:value-of select="string-join($y, '|')"/>

Ergebnis:


Sprachlos|Sagblos|Sorglos|Sinnlos|Schlaflos

Denselben Effekt bekommen wir in diesem Fall auch auf andere Weise hin:


<xsl:value-of 
     select="//Mensch[matches(name, '[S][a-z]*')]/name" 
     separator="|"/>

Vgl. .

In XSL 3.0 / XPath 3.0 stehen besondere Verknüpfungsoperatoren zur Verfügung, die auch bei zum Einsatz kommen.


<xsl:value-of 
     select="string-join(('x' || 'y' || 'z'))"/>

liefert auch hier


<ergebnis>xyz</ergebnis>

Mehrere string-joins dieser Art ...


<xsl:value-of select="string-join((1 to 3)!('x' || 'y' || 'z'))"/>

bringen das hier ans Tageslicht:


<ergebnis>xyzxyzxyz</ergebnis>

Freilich bringt die Arbeit mit string-join eben auch nur einen einzelnen String zustande, keine Sequenz wie bei .


 <xsl:template match="/">
  <ergebnis>
   <xsl:for-each 
        select="string-join((1 to 3)!('x' || 'y' || 'z'))">
    <einzelwert>
     <xsl:value-of select="."/>
    </einzelwert>
   </xsl:for-each>
  </ergebnis>
 </xsl:template>

Das erkennen wir sofort am Ergebnis:


<ergebnis>
   <einzelwert>xyzxyzxyz</einzelwert>
</ergebnis>

wg / 30. Dezember 2017



Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf:

Vorname
Nachname
Mailadresse







Vielen Dank für Ihr Interesse an meiner Arbeit.


V.i.S.d.P.: Wilfried Grupe * Klus 6 * 37643 Negenborn

Mobil: 0151. 750 360 61 * eMail: info2018@wilfried-grupe.de

www.wilfried-grupe.de/stringjoin.html