substring()-Funktion |
Diese Funktion gibt einen Teil eines bestimmten Strings zurück. Das zweite und das dritte Argument bestimmen, welcher Teil des Strings zurückgegeben wird. Das zweite Argument legt die Position des ersten Zeichens des Teil-Strings fest, und das optionale dritte Argument legt fest, wie viele Zeichen zurückgegeben werden sollen.
Eingaben
Die Funktion substring() akzeptiert einen String und eine oder zwei Zahlen als Argumente. Der String ist der String, aus dem der Teil-String extrahiert wird. Das zweite Argument wird als Anfangsposition für den zurückgegebenen Teil-String verwendet, und das optionale dritte Argument legt fest, wie viele Zeichen zurückgegeben werden.
Ausgabe
Mit zwei Argumenten (einem String und einer Anfangsposition) gibt die Funktion substring() alle Zeichen im String ab der Anfangsposition zurück. Beachten Sie, dass das erste Zeichen in einem XPath-String die Position 1 hat, nicht etwa 0. Mit drei Argumenten (ein String, eine Anfangsposition und eine Längenangabe) gibt die Funktion substring() alle Zeichen im String zurück, deren Position größer oder gleich der Anfangsposition ist und deren Position kleiner oder gleich der Anfangsposition plus der Länge ist. Normalerweise sind die Argumente für die Funktion substring() Ganzzahlen, wenngleich sie auch kompliziertere Ausdrücke sein können. Einige ungewöhnliche Fälle finden Sie im Abschnitt "Beispiel" weiter unten.
Definition
XPath-Abschnitt 4.2, Zeichenkettenfunktionen
Beispiel
Um die Funktionsweise von substring() zu veranschaulichen wird das folgende XML-Dokument verwendet:
    <?xml version="1.0"?>
    <test>
      <p>This is a test XML document used by several
        of our sample stylesheets.</p>
      <question>
        <text>When completed, the Eiffel Tower was the
        tallest building in the world.</text>
        <true>You're correct!  The Eiffel Tower was the
        world's tallest building until 1930.</true>

        <false>No, the Eiffel Tower was the world's
        tallest building for over 30 years.</false>
      </question>
      <question>
        <text>New York's Empire State Building knocked the
        Eiffel Tower from its pedestal.</text>
        <true>No, that's not correct.</true>
        <false>Correct!  New York's Chrysler Building,
        completed in 1930, became the world's tallest.</false>
      </question>
    </test>
Hier das verwendete Stylesheet:
    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:output method="text"/>

      <xsl:variable name="newline">
    <xsl:text>
    </xsl:text>
      </xsl:variable>

      <xsl:template match="/">
        <xsl:value-of select="$newline"/>
        <xsl:text>Tests of the substring() function:</xsl:text>

        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Now is the time', 4)="</xsl:text>
        <xsl:value-of select="substring('Now is the time', 4)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Now is the time', 4, 6)="</xsl:text>
        <xsl:value-of select="substring('Now is the time', 4, 6)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Now is the time', 4, -6)="</xsl:text>
        <xsl:value-of select="substring('Now is the time', 4, -6)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Now is the time', -3, 6)="</xsl:text>
        <xsl:value-of select="substring('Now is the time', -3, 6)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Now is the time', 54, 6)="</xsl:text>
        <xsl:value-of select="substring('Now is the time', 54, 6)"/>
        <xsl:text>"</xsl:text>

        <xsl:value-of select="$newline"/>
        <xsl:value-of select="$newline"/>
        <xsl:text>   count(//*)=</xsl:text>
        <xsl:value-of select="count(//*)"/>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Here is a really long string', </xsl:text>
        <:xsl:text>count(//*))="</xsl:text>
        <xsl:value-of
          select="substring('Here is a really long string', count(//*))"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring('Here is a less long string', </xsl:text>
        <xsl:text>count(//*) mod 7, 7)="</xsl:text>
        <xsl:value-of
          select="substring('Here is a less long string', count(//*) mod 7, 7)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
        <xsl:text>   substring(/test/question[1]/text, 3, 7)="</xsl:text>
        <xsl:value-of select="substring(//*, 3, 7)"/>
        <xsl:text>"</xsl:text>
        <xsl:value-of select="$newline"/>
      </xsl:template>

    </xsl:stylesheet>
Hier die Ergebnisse, die entstehen, wenn der XSLT-Prozessor Saxon verwendet wird:
    Tests of the substring() function:

       substring('Now is the time', 4)=" is the time"
       substring('Now is the time', 4, 6)=" is th"
       substring('Now is the time', 4, -6)="
       substring('Now is the time', -3, 6)="No"
       substring('Now is the time', 54, 6)="

       count(//*)=10
       substring('Here is a really long string', count(//*))=" really long string"
       substring('Here is a less long string', count(//*) mod 7, 7)="re is a"
       substring(/test/question[1]/text, 3, 7)=" This i"
Wird dieselbe Transformation mit Xalan durchgeführt, entsteht ein Laufzeitfehler:
    file:///D:/O'Reilly/XSLT/bookSamples/AppendixC/substringfunction.xsl; Line 26;
      Column 65;
    Tests of the substring() function:

       substring('Now is the time', 4)=" is the time"
       substring('Now is the time', 4, 6)=" is th"
       substring('Now is the time', 4, -6)="
    XSLT Error (javax.xml.transform.TransformerException): String index out of range
    : -3
Die momentanen Versionen von XT, Saxon und dem Oracle-Prozessor lieferten korrekte Ergebnisse; sowohl Xalan als auch Microsofts XSLT-Tools erzeugten eine Laufzeit-Exception. Die Konsequenz daraus ist, dass Sie künftig vernünftige Argumente für die Funktion substring() verwenden und somit alle Implementierungen einsetzen können.