XSLT (opérations avancées) : expressions régulières et fichiers texte

Expression régulière avec XSL-XSLT

Introduction

Dans cette partie du cours, nous allons voir comment utiliser des expressions régulières avec le langage XSLT, après avoir fait un rappel sur ce que sont les expressions régulières.

FondamentalQu'est ce qu'une expression régulière ?

« Une expression régulière est une chaîne de caractères que l'on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise. »

Une expression régulière est une suite de caractères typographiques (un « motif » ou « pattern ») décrivant une chaîne de caractères dans le but de la trouver dans un bloc de texte pour lui appliquer un traitement automatisé, comme un ajout, son remplacement ou sa suppression.

Syntaxe des expressions régulières dans XSL-XSLT/XPath.

Meta-caractères des expressions régulières dans XSL-XSLT/XPath.

ExempleExemples d'expressions régulières

Exemples de regex

Expression régulière

Résultats

a

match le caractère a seul

a+b

match les mots commençants par a suivi de de zéro ou plusieurs a et finissant par b

[a-z]{5}

match les mots composés de 5 caractères compris entre a et z

a\.b+c?

match : a.b, a.bc, a.bb, a.bbc, a.bbbc...

(http|https|ftp):\/\/([a-zA-Z0-9]*)\.([a-zA-Z0-9]*)\.(com|net)

Pattern simpliste d'adresse web

ConseilExpressions régulières avec oXygen

Outils -> Constructeur des expressions régulières

FondamentalLes expressions régulières dans XSL-XSLT

Dans le langage XSL-XSLT il y a 4 fonctions qui permettent d'utiliser les expressions régulières :

  1. tokenize

  2. matches

  3. replace

  4. xsl:analyze-string

FondamentalTokenize

La fonction tokenize($input, $pattern) est pratique car elle permet de séparer une chaîne de caractères en une séquence de chaînes de caractères.

L'argument $input désigne la chaîne de caractère d'entrée, et l'argument $pattern désigne le pattern (ou expression régulière) qui match le délimiteur choisi.

ExempleExemple de récupération d'un fichier texte et de tokenize

On cherche à lire un fichier texte et à remplacer les sauts de lignes par des points virgules.

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
4
    exclude-result-prefixes="xs"
5
    version="2.0">
6
    
7
    <xsl:output method="text"></xsl:output>
8
    
9
    <xsl:template match="/">
10
        <xsl:for-each select="tokenize(unparsed-text('txt.txt', 'iso-8859-1'), '\r?\n')">
11
            <xsl:copy></xsl:copy><xsl:text>;</xsl:text>
12
        </xsl:for-each>
13
    </xsl:template>
14
    
15
</xsl:stylesheet>
16
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">
    
    <xsl:output method="text"></xsl:output>
    
    <xsl:template match="/">
        <xsl:for-each select="tokenize(unparsed-text('txt.txt', 'iso-8859-1'), '\r?\n')">
            <xsl:copy></xsl:copy><xsl:text>;</xsl:text>
        </xsl:for-each>
    </xsl:template>
    
</xsl:stylesheet>

FondamentalMatches

La fonction matches($input, $pattern) permet de vérifier si $input match l'expression régulière $pattern.

FondamentalReplace

La fonction replace($input, $pattern, $replacement) permet de remplacer les parties de $input qui matchent $pattern avec $replacement.

FondamentalAnalyse de chaîne de caractère

L'instruction xsl:analyze-string permet d'analyser une chaîne de caractère en fonction d'une expression régulière. On peut accéder aux sous chaînes de caractères qui correspondent à l'expression régulière avec l'instruction xsl:matching-substring, et inversement aux sous chaînes de caractères qui ne correspondent pas à la regex avec xsl:non-matching-substring.

CTRL+C pour copier, CTRL+V pour coller
1
<xsl:analyze-string
2
  select = expression
3
  regex = { string }
4
  flags? = { string }>
5
  <!-- Content: (xsl:matching-substring?, xsl:non-matching-substring?, xsl:fallback*) -->
6
</xsl:analyze-string>
<xsl:analyze-string
  select = expression
  regex = { string }
  flags? = { string }>
  <!-- Content: (xsl:matching-substring?, xsl:non-matching-substring?, xsl:fallback*) -->
</xsl:analyze-string>

ExempleExemple d'analyse de string avec une regex

Cet exemple remplace tout les caractères '\n' (newline) par la balise <br/>.

CTRL+C pour copier, CTRL+V pour coller
1
<xsl:analyze-string select="abstract" regex="\n">
2
  <xsl:matching-substring>
3
    <br/>
4
  </xsl:matching-substring>
5
  <xsl:non-matching-substring>
6
    <xsl:value-of select="."/>
7
  </xsl:non-matching-substring>
8
</xsl:analyze-string>
9
<xsl:analyze-string select="abstract" regex="\n">
  <xsl:matching-substring>
    <br/>
  </xsl:matching-substring>
  <xsl:non-matching-substring>
    <xsl:value-of select="."/>
  </xsl:non-matching-substring>
</xsl:analyze-string>
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Karim El Aktaa (Contributions : Stéphane Crozat et les étudiants de NF29) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)