Fonction substring() |
Renvoie une portion d'une chaîne donnée. Les deuxième et troisième arguments déterminent la portion de la chaîne qui est renvoyée. Le deuxième argument spécifie la position du premier caractère de la sous-chaîne, et le troisième argument facultatif spécifie le nombre de caractères à renvoyer.
Entrées
La fonction substring() prend une chaîne et un ou deux nombres comme arguments. La chaîne correspond à la chaîne d'où sera extraite la sous-chaîne. Le deuxième argument est utilisé comme position de début de la sous-chaîne renvoyée, et le troisième argument facultatif spécifie le nombre de caractères à renvoyer.
Sortie
Avec deux arguments (une chaîne et une position de début), la fonction substring() renvoie tous les caractères de la chaîne commençant par la position de début. Notez que le premier caractère d'une chaîne XPath se trouve à la position 1, et non 0. Avec trois arguments (une chaîne, une position de début et une longueur), la fonction substring() renvoie tous les caractères de la chaîne dont la position est supérieure ou égale à la position de début ainsi que ceux dont la position est inférieure ou égale à la position de début plus la longueur. En règle générale, les arguments de la fonction substring() sont des nombres entiers, même s'ils peuvent correspondre à des expressions plus complexes. Voir la section "Exemple" qui suit pour découvrir des cas inhabituels.
Définie dans
XPath section 4.2, Fonctions Chaîne.
Exemple
Le document XML suivant permet d'illustrer le fonctionnement de la fonction substring() :
    <?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>
La feuille de style utilisée est la suivante :
    <?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>
En utilisant le processeur Saxon, les résultats sont les suivants :
    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"
La même transformation exécutée avec Xalan affiche une erreur d'exécution :
    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
Concernant cette rédaction, les processeurs XT, Saxon et Oracle ont tous donnés les bons résultats ; les outils XSLT de Xalan et Microsoft ont généré des exceptions d'exécution. Ce qu'il faut retenir ici, c'est d'utiliser des arguments raisonnables de la fonction substring() pour ne pas subir les conséquences de différentes implémentations.