Home
Über mich
Blog
Veröffentlichungen
IT-Trainings
Impressum


XPath: starts-with

Zusammenfassung:

Die "starts-with"-Funktion prüft, ob ein Item (das als String gecastet werden kann) mit einer bestimmten Zeichenfolge beginnt.

XPath: starts-with

Da sie einen Boolean-Wert true() oder false() zurückgibt, kann sie sowohl im Rahmen von Fallunterscheidungen (xsl:if, xsl:choose) als auch als Prädikat in XPath eingesetzt werden.

<xsl:variable name="y" as="xs:string+">
  <xsl:for-each 
    select="('Meier', 'Schulze', 'Müller', 'Schmidt', 5)
            [starts-with(xs:string(.), 'Sch')]">
   <xsl:value-of select="."/>
  </xsl:for-each>
</xsl:variable>
<xsl:value-of select="string-join($y, '|')"/>

Resultat:

Schulze|Schmidt

Kann ein Item nicht automatisch als String gecastet werden, so wird ein Fehler generiert (s.u.). Daher empfiehlt sich zur Sicherheit (wie oben geschehen), den zu prüfenden Wert ausdrücklich als String zu casten:

starts-with(xs:string(.), 'Sch')

<xsl:for-each 
  select="('Meier', 'Schulze', 'Müller', 'Schmidt', 5)
          [starts-with(., 'Sch')]">
...
Fehlerlevel: fatal
Beschreibung: XPTY0004: Required item type of first argument of starts-with() 
is xs:string; supplied value has item type xs:integer
URL: http://www.w3.org/TR/xpath20/#ERRXPTY0004

Es gibt noch einen anderen Fall, wo die "starts-with"-Funktion gern eingesetzt wird, und wo, wie ich finde, Vorsicht angebracht ist. Nehmen wir zur Klärung den folgenden Loop, der bewußt beim Root-Element "Orte" ansetzt.

<xsl:for-each select="/Orte/Ort/Mensch">
...
</xsl:for-each>

Völlig dieselben Nodes würden durch den folgenden Loop angesteuert, bei dem der Name des Root-Elements aber nicht klar benannt, sondern zur Laufzeit ermittelt und daraufhin geprüft wird, ob er mit dem Teilstring "Ort" beginnt.

<xsl:for-each 
     select="/*[starts-with(local-name(), 'Ort')]/Ort/Mensch">
...
</xsl:for-each>

Nun kann es passieren, daß der Name des Root-Elements variiert, etwa "Orte2017", "Orte2018", "OrteInDeutschland" etc. Der Hintergrund liegt häufig in Versionsunterschieden, die sich auch auf die XML-Dokumentstruktur beziehen können. Sei es, daß die Childnodes anders benannt werden (andere Schreibweise: upper-case / lower-case), als Attribute statt als Elemente oder überhaupt andere Inhalte übermittelt werden.

Da die Datenqualität der XML Dokumente häufiger fraglich ist und auch sonst alle möglichen Tricks angewendet werden, eine wirksame Überprüfung zu vermeiden, ob die Voraussetzungen der verwendeten XSL-Programmierlogik noch mit der Input-XML-Dokumentstruktur übereinstimmen, ist auch dieser Weg via starts-with(local-name() bzw. starts-with(name() mit Skepsis zu betrachten.

Konkret besteht die Gefahr, daß die Versionsunterschiede, die im Rootelement abgesichert werden sollen, durch die Teilprüfung des Rootnamens übersehen werden, mit der Folge, daß auch darunterliegende Childnode nicht verarbeitet werden: während die XML Dokumentstruktur sich geändert hat, setzt die XSL-Programmierung auf einer früheren Version auf, die die neue Dokumentstruktur nicht korrekt anspricht. Das fällt oft erst mit erheblicher zeitlicher Verzögerung auf.

qrpic/startswith.jpg

wg / 3. Oktober 2017




Fragen? Anmerkungen? Tips?

Bitte nehmen Sie Kontakt zu mir auf (info10@wilfried-grupe.de).



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: info10@wilfried-grupe.de