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.
Fondamental : Qu'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.
Exemple : Exemples d'expressions régulières
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 |
Conseil : Expressions régulières avec oXygen
Outils -> Constructeur des expressions régulières
Fondamental : Les 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 :
tokenize
matches
replace
xsl:analyze-string
Fondamental : Tokenize
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.
Exemple : Exemple 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.
<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>
<?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>
Fondamental : Matches
La fonction matches($input, $pattern) permet de vérifier si $input match l'expression régulière $pattern.
Fondamental : Replace
La fonction replace($input, $pattern, $replacement) permet de remplacer les parties de $input qui matchent $pattern avec $replacement.
Fondamental : Analyse 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.
<xsl:analyze-string
select = expression
regex = { string }
flags? = { string }>
<!-- Content: (xsl:matching-substring?, xsl:non-matching-substring?, xsl:fallback*) -->
</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>
Exemple : Exemple d'analyse de string avec une regex
Cet exemple remplace tout les caractères '\n' (newline) par la balise <br/>.
<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>
<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>