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.