8.2 Les expressions rationnellesDans le chapitre précédent, nous avons utilisé des expressions rationnelles pour créer le nom de la table dans le programme mini-forum.php.. Dans l’expres
Trang 18.2 Les expressions rationnelles
Dans le chapitre précédent, nous avons utilisé des expressions rationnelles
pour créer le nom de la table dans le programme mini-forum.php.
Dans l’expression suivante, nous avons extrait le nom de fichier duchemin que nous avons écourté de son extension :
preg_match("#^/.*/(.*)\.[A-z0-9]{3,4}$#", $_SERVER[‘PHP_SELF’], $tableau);
Ces signes vous apparaissent sans doute comme des hiéroglyphes maisnous espérons qu’à la fin de ce chapitre, vous percevrez le langageparticulier des expressions rationnelles ou régulières Nous utiliseronsl’adjectif « rationnelle » pour caractériser ces expressions car elles sontplutơt irrégulières dans le sens ó elles ne régulent rien et sont utiliséesdifféremment pour chaque cas En fait, « régulière » est la traduction de
regular qui dans l’expression « regular expression » signifie « expression
consacrée » Nous emploierons donc le terme « expressions rationnelles »car ces expressions permettent une recherche générique ou abstraite sur uncertain nombre de caractères ou de groupes de caractères Le type decaractère et sa place sont traduits sous forme de caractères de description.Nous avons donc traduit, sous une forme abstraite, un mot ou uneexpression recherchée Ce langage est puissant mais également trèscomplexe Nous n’en ferons pas le tour dans ce livre, nous vous aideronsseulement à comprendre certains principes et vous en proposerons lesexpressions les plus courantes
La méthode
Vu le comportement très complexe des moteurs d’expressions les, l’approche ne peut être qu’empirique Avec un peu d’habitude, lasolution sera trouvée plus rapidement Dans chaque recherche, vous avez
rationnel-un objectif Vous voulez vérifier, extraire ou remplacer rationnel-une chaỵne decaractères, c’est le centre de votre stratégie Il faut aider le moteur àtrouver des repères autour de cet objectif Si vous recherchez www, voussavez qu’il est entouré de http:// et d’un point Plus vous caractérisezvotre objectif, plus vous aurez de chances de le trouver Le moteur aquelques « défauts » Ainsi ne s’arrêtera-t-il pas au premier motif trouvémais ira jusqu’à la fin de la cible C’est ce qu’on appelle l’avidité Elle
Trang 2peut pousser le moteur à être trop perfectionniste dans sa recherche et à nepas trouver ce qu’il a "sous les yeux" car il cherche toujours un motifcomplémentaire.
Tab 8.3 : Début et fin de ligne
Signe Description
^ Début de ligne, sauf quand le signe se trouve à l’intérieur de
crochets Il signifie alors une négation.
Les parenthèses permettent de délimiter des sous-motifs qui seront stockésdans un tableau, dans le cas d’une recherche ou dans les variablesspéciales \\0 pour la totalité du motif, \\1 pour la première parenthèse…
En ce qui concerne les expressions rationnelles, PHP a hérité du module
du langage Perl et des normes POSIX Nous allons étudier un cas assezsimple pour commencer puis verrons la syntaxe et approfondirons.Auparavant, nous ferons le panorama des fonctions du langage PHP quiutilisent les expressions rationnelles
Retourne Vrai si la chaîne contient le motif.
string ereg_replace ( string motif, string nouveau_motif, string chaîne)
Remplace le motif à l’intérieur de la chaîne par le nouveau motif.
eregi() Comme ereg() mais insensible à la casse
Trang 3Tab 8.4 : Fonctions pour des expressions rationnelles POSIX
Fonction Description
eregi_replace() Comme ereg_replace() mais insensible à la
casse array split ( string
motif_séparateur, string chaîne [, int limite])
Découpe la chaîne en sous-chaînes au moyen du séparateur.
string sql_regcase ( string chaîne)
Crée une expression rationnelle insensible à la casse à partir de la chaîne Pour PHP, le résultat sera [Pp][Hh][Pp].
Quelques études de cas
Vous voulez savoir si vous avez des chiffres dans un texte
de tous les chiffres inclus dans l’intervalle 0 à 9
Si vous voulez rechercher un chiffre particulier :
¶ ereg(’0’,$expression) recherche le chiffre 0
¶ ereg(’[09]’,$expression) recherche les chiffres 0 ou 9 dansl’expression
Si vous souhaitez que ces chiffres ne soient pas dans l’expression,employez le caractère ^ dans les crochets Si vous l’employez en dehorsdes crochets, il n’a plus même sens
ereg(’[^0]’,$expression) sera vrai si le chiffre 0 n’est pas dansl’expression
Rappelez-vous :
if !ereg(’[^0-9]’,$table){
$table.=’_’;
Trang 4Nous vérifiions que le nom de la table créée à partir d’un nom de fichier
ne contient pas uniquement des chiffres Si c’était le cas, nous aurionsajouté un blanc souligné
$contenu_txt =ereg_replace("([[:space:]]|^)[A-z0-9]{1,2}[[:space:]]",
" ",$contenu_txt);
Dans cette expression, nous cherchons un mot (entouré d’espaces) quicontienne de une à deux lettres ([[:space:]]|^) [A−z0−9]{2,}signifie qu’on recherche au moins deux caractères alphanumériques placés
en début de chaîne ou après un espace
Il reste un caractère que nous n’avons pas vu, c’est le caractère point (.)
Il remplace n’importe quel nombre et type de caractère Si vous voulezreprésenter un vrai point, il vous faudra utiliser un caractère d’échappe-ment (\.)
Voici les expressions POSIX et leurs équivalents
Tab 8.5 : Les normes POSIX
Séquence Équivalent Description
[[:alnum:]] [A−Za−z0−9] Caractères alphanumériques [[:alpha:]] [A−Za−z] Caractères alphabétiques
[[:blank:]] [\x09] Espaces ou tabulations [[:lower:]] [a−z] Caractères en bas de casse [[:upper:]] [A−Z] Caractères en capitales [[:xdigit:]] [0−9a−fA−F] Caractères hexadécimaux [[:punct:]] [!−/:−@[− ′{−~] Caractères de ponctuation [[:space:]] [\t\v\f] Tout caractère d’espace [[:cntrl:]] [\x00−\x19\x7F] Caractères de contrôle [[:graph:]] [!−−] Caractères affichables et
imprimables [[:print:]] [−~] Caractères imprimables sauf
caractères de contrôle
Trang 5Les caractères sont dans l’ordre du tableau de caractères ASCII Ainsi,dans [a−z], les lettres accentuées ne figurent pas.
Les lettres accentuées
Pour ce cas , utilisez les caractères \x suivis du numéro dans
la table ASCII Pour trouver si votre texte contient des lettres
accentuées françaises, vous devez écrire [\x128−\x151\153\154], c’est-à-dire les caractères 128 à 151 puis les 153 et 154 De la même façon, si vous voulez le caractère littéral ^, utilisez \x94.
Pour affiner notre recherche, nous avons à notre disposition la cardinalité,c’est-à-dire que nous pouvons sélectionner le nombre de caractères :
¶ ereg(’[0−9]{1}’,$expression) recherche s’il existe un chiffredans l’expression
¶ ereg(’[0−9]{1,3}’,$expression) recherche s’il existe entre un ettrois chiffres dans l’expression
Nous avons aussi des équivalents
En voyant le tableau précédent, vous pouvez vous interroger sur l’utilité
de l’étoile * Ce signe renvoie en effet Vrai que le caractère existe oun’existe pas En fait, il s’emploie dans des expressions plus complexes
¶ ereg(’[0−9]*’,$expression) recherche s’il existe au moins zérochiffre dans l’expression
Trang 6Vous pouvez par exemple rechercher un mot qui peut être au pluriel ou ausingulier !ereg(’régulières*’, $expression) sera vrai si le mot
"régulière" ou "régulières" n’existe pas dans l’expression ;=)
Si vous recherchez le mot événement qui peut aussi s’écrire évènement,vous emploierez l’expression ereg(’évé|ènement*’, $expression)
Le signe | signifie ou Cette expression est équivalente à :ereg(’év[éè]nement*’, $expression)
Vous pouvez aussi faire porter la précision sur plusieurs caractères Ainsi,vous cherchez un mot masculin ou féminin comme docteur ou docteresse
’docteu*r(esse)*’ Le problème est que docteuresse fonctionne aussi
’docteu*r’ sera mieux adapté Nous verrons un peu plus loin lesproblèmes d’avidité qui font que dès que l’une des expressions esttrouvée, le moteur retourne Vrai sans aller jusqu’à la fin de l’expression.Reprenons les fonctions date_nombre() et nombre_date() avec lesexpressions rationnelles Le code sera plus court et l’exécution plusrapide :
$ladate=ereg_replace("(^[0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})",
"\\3/\\2/\\1 \\4h\\5", $ladate);
} elseif ($longueur==14){
$ladate=ereg_replace("(^[0-9]{4})([0-9]{2})([0-9]{2}) ([0-9]{2})([0-9]{2})","\\3/\\2/\\1 \\4h\\5mn\\6", $ladate);
Trang 7return $ladate;
}
Nous vérifions dans cette fonction la longueur de la date et, selon la taille,
en extrayons aussi l’heure, les minutes et les secondes Les jours, mois etheure sont forcés en int (typées) car nous voulons éviter qu’ils commen-cent par un 0
$an=’20’.$an;
} }
Les fonctions compatibles Perl
L’intérêt majeur de ces fonctions compatibles avec le langage Perl est quevous pouvez utiliser des options utiles, voire indispensables
Trang 8Tab 8.7 : Fonctions pour des expressions rationnelles compatibles Perl
Fonction Description
array preg_grep ( string motif, array tableau)
Retourne dans un tableau les éléments extraits d’un autre tableau qui correspondent au motif.
int preg_match ( string motif, string chaîne [, array tableau])
Retourne Vrai si la chaîne contient le motif donné et emplit le tableau éventuel avec les correspondances.
int preg_match_all ( string motif, string chaîne [, array tableau])
Renvoie dans un tableau toutes les occurrences du motif dans la chaîne Un ordre peut être envoyé par le paramètre optionnel.
mixed preg_replace ( mixed motif, mixed nouveau_motif, mixed chaîne [, int limite])
Remplace le motif par le nouveau motif dans la chaîne et retourne la nouvelle chaîne Si la limite est posée, le nombre de remplacements sera limité.
array preg_split ( string motif, string chaîne [, int limite])
Découpe une chaîne en utilisant le motif comme séparateur.
Un certain nombre d’options affinent encore la recherche Ces expressionsrationnelles compatibles avec le langage Perl sont caractérisées par descontenants qui sont généralement des barres obliques ou peuvent être # ou
%… Tout caractère non utilisé dans le motif recherché peut être mis àcontribution Reprenons l’exemple de l’extraction du nom du fichier dans
le mini-forum :
preg_match("#^/.*/(.*)\.[A-z0-9]{3,4}$#", $_SERVER[‘PHP_SELF’], $tableau);
Ici, les caractères de limite d’expression sont # Le premier caractère
^désigne un début de ligne alors qu’il signifierait une négation dans descrochets Le dernier caractère $ signifie une fin de ligne Nous avonsutilisé # et non /, déjà utilisé dans le motif recherché : un chemin avec desrépertoires
Trang 9Ensuite, le premier caractère est une barre oblique présente au début de lavaleur de $_SERVER[‘PHP_SELF’] qui affiche le chemin à partir durépertoire web Nous avons * Le point représente n’importe quelcaractère et n’importe quel nombre de caractères, il peut s’agir deplusieurs répertoires ou d’aucun En suivant l’expression, nous trouvonsune autre barre oblique Si nous regardons plus loin, nous trouvons leschéma du fichier avec le point et les trois ou quatre caractères qui
caractérisent son format appelés son extension (.doc, jpg, php, html,
.php3…) Ce que nous voulons récupérer est le mot entre la dernière barre
oblique et le point Nous caractérisons l’extension, le point et la barreoblique pour délimiter le motif qui représente notre objectif Cet objectifest représenté par (.*)
Tab 8.8 : Les caractères d’échappement dans les expressions rationnelles
Caractère Description
\w Caractère de mot Les caractères de mot sont les
alphanumériques et le blanc souligné (_).
\b Limite de mot (entre le \W et le \w)
\S Tout caractère sauf un caractère d’espace
Créons un système de fichier très simple Imaginons que vous ayez unrépertoire ó vous voulez placer tous vos fichiers sans fioritures Ce quivous intéresse et intéresse vos visiteurs, c’est seulement le contenu desfichiers Vous avez peu de temps et acceptez de placer votre texte dans unmodèle ou gabarit mais il vous pèse d’ajouter les liens de navigation àchaque nouveau fichier Nous allons donc créer un fichier qui sera àl’écoute de votre répertoire Dans un premier temps, ce fichier ira chercher
la liste des fichiers dans une table Chaque fichier sera affiché selon ses
Trang 10caractéristiques : nom, titre, date de création, et dans l’ordre de date,c’est-à-dire que les plus récents seront en haut de la liste.
Il subsiste une objection, car certains fichiers seront pérennes et d’autrescirconstanciels Pour différencier les deux types de fichier, nous appelle-rons les fichiers d’actualité par un nom de date de type AAAAMMJJ Plutôtque de mettre la date du jour, nous mettrons la date de péremption Ainsi
il sera simple de les archiver dès que la date sera dépassée
Rentrons dans un tableau les types de fichiers qui seront affichés Ainsi, il
est inutile d’afficher les fichiers gif ou jpg.
<font face="Arial, Helvetica, sans-serif" size="3">
LES PAGES WEB </font></b></div>
Trang 11dans la base*/
$fichier_courant=$tableau[2].$tableau[3].$tableau[4];
//$rep = " /BonsVivants";
///AFFICHAGE DES DONNÉES//////
/*ici nous changeons la valeur selon que le fichier soit destiné
à des archives ou à des fichiers pérennes*/
$sql="select * from fichiers where archive=’$archi’ OR archive=’’ ORDER BY moment DESC";
$resultat = @mysql_query($sql, $id_link);
} ///fin de l’affichage////////////
////fourniture de la base de données//////
if (!$archi){
$aujourdhui=date("Ymd");
//cherchons la date la plus récente///
$sql="select MAX(moment) as date_limite from fichiers";
$resultat = @mysql_query($sql, $id_link);
$nombre = @mysql_num_rows($resultat);
if ($nombre==1){
//la date dans la base est entrée en TIMESTAMP UNIX//////
TIMESTAMP
Le TIMESTAMP Unix est le nombre de secondes depuis le 1 er
janvier 1970 alors que le TIMESTAMP MySQL est un nombre de type AAAAMMJJHHMMSS.
$rang=mysql_fetch_array($resultat);
$date_limite=$rang[’date_limite’];
$maintenant=date("Ymd",$date_limite);
Trang 12} else {
$date_limite=time()-(60*60*24*365*20);
$sql="CREATE TABLE fichiers ( clef int(11) NOT NULL auto_increment, nom_fichier varchar(60) NOT NULL default ’’, titre varchar(100) NOT NULL default ’’, archive char(1) NOT NULL default ’1’, moment bigint(20) NOT NULL default ’0’, PRIMARY KEY (clef),
UNIQUE KEY clef (clef), KEY clef_2 (clef) )";
/*CHERCHER LE TITRE DU FICHIER DANS LES BALISES HTML
Le moment a été mis sous cette forme dans le fichier :
<! <date>20/02/2003</date> -> Notez qu’il est en commentairedans le HTML, donc non affiché Si ce code existe dans le fichier, cettedate sera prise en compte, sinon ce sera la date de dernière modification
Trang 13$moment=mktime(0, 0, 0, $moments[1], $moments[0], $moments[2]); }
if (ereg("[0-9]{8}",$nom) && $nom >$aujourdhui && $moment>$date_limite
&& in_array ($extension, $extensions)){
$sql="insert into fichiers (nom_fichier, titre, archive, moment) VALUES (’$f’, ’$titre’, ’0’, ’$moment’)";
@mysql_query($sql, $id_link);
} elseif (in_array ($extension, $extensions) && $moment >$date_limite){
$sql="insert into fichiers (nom_fichier, titre, archive, moment) VALUES (’$f’, ’$titre’, ’0’, ’$moment’)";
@mysql_query($sql, $id_link);
} } } closedir($dir);
} ///fin archi ==0
? >
</table></td></tr>
</table>
Si le fichier possède un nom de type 20020601, ce nom sera comparé à la
date du jour S’il est moins récent, la valeur d’archive sera mise sur 1 Ceciest intéressant pour des fichiers d’actualité qui deviendront obsolètes aprèsune certaine date et que nous archivons
Listing 8.2 : Ecoute fichiers : table_ecoute.php
<?
if (!$archi){
$sql="select * from fichiers where archive=’0’ OR archive=’’";
$resultat = @mysql_query($sql, $id_link);
while($rang=mysql_fetch_array($resultat)){
$nom_fichier=$rang[’nom_fichier’];
Trang 14preg_match("#^(.*)\.([A-z0-9]{3,4})$#", $nom_fichier, $tableau);
$nom=$tableau[1];
if (ereg("[0-9]{8}",$nom) && $nom <$aujourdhui){
$sql="update fichiers set archive=’1’ where nom_fichier=’$nom_fichier’";
@mysql_query($sql, $id_link);
} } }
m Figure 8.3 : Une table d’écoute : attention de mettre un titre pour chaque
fichier
Trang 15Nous préférons afficher une autre date pour des raisons d’actualité Nousrécupérons la date que nous avons ajoutée dans le fichier lui-même enl’encadrant de balises de notre invention :<date>21/09/1999</date>.Nous prenons soin de l’insérer dans un marqueur de commentaire HTMLpour qu’il ne soit pas affiché Ici, l’expression rationnelle joue le rôle d’unanalyseur XML L’expression rationnelle utilisée par les fonctions com-patibles Perl utilise des délimiteurs et des modificateurs Ici, le modifica-teur i rend l’expression insensible à la casse.
Les motifs sur plusieurs lignes
Le caractère point représente n’importe quel caractère, sauf les caractères de nouvelle ligne \n Pour que ce caractère soit assimilé au point, il faut utiliser le modificateur s.
Ce système de fichiers peut être complexifié à l’échelle d’un site, enprenant soin de signaler les répertoires privés ou les répertoires destinés àclasser les images du site pour les protéger Vous pouvez aussi les afficher,comme nous l’avons fait pour l’annuaire de liens
Tab 8.9 : Modificateurs
Modificateur Description
A Cherche le motif seulement au début de la cible.
E Cherche le motif seulement à la fin de la cible Le caractère est pris
comme caractère.
U S’arrête dès que le premier motif qui satisfait à la recherche est trouvé.
i Le motif est insensible à la casse.
m Permet d’utiliser les ancrages ^ et $ pour des débuts ou des fin de
ligne.
s Force le moteur à considérer le caractère \n comme assimilé dans le
caractère "point".
x Permet de placer des espaces dans votre expression dont le moteur ne
tiendra pas compte Sert à rendre vos expressions plus lisibles.
Trang 16Nous avons vu ce qui concernait les quantificateurs dans la partie POSIX.
Il est possible avec les expressions rationnelles compatibles Perl d’utiliserdes quantificateurs non avides Cela signifie qu’ils ne complètent pas larecherche du motif une fois que le motif satisfait les critères Ils nes’arrêtent pas au premier motif mais ils n’essaient pas non plus àcompléter indéfiniment le motif trouvé par d’autres caractères possibles
Tab 8.10 : Quantificateurs pour une recherche minimale
Non avide Nombre de fois
{nombre}? Exactement nombre
Quelques études de cas
Au cours de ces pages, nous avons utilisé des expressions rationnellescompatibles Perl sans les expliquer Reprenons-les :
$heure=preg_replace("/\d{8}(\d{2})(\d{2})\d{2}/","\\1",$datedujour);
Trang 17Cet exemple prend une date de type AAAAMMJJHHMMSS dont on extraitl’heure, c’est-à-dire la première parenthèse Le motif est composé de huitchiffres suivis d’une série de trois fois deux chiffres.
"\\1 <A HREF=\"mailto:\\2\">\\2</a>\\7", $contenu_txt);
Ce motif est celui d’une adresse e-mail à laquelle nous ajoutons un lienmailto La seule obligation concernant cette adresse est qu’elle soitencadrée d’espaces ou de balises de fin de ligne Décomposons mainte-nant cette expression dans un tableau
Tab 8.11 : Analyse de la première partie de l’expression :
(\S)+? Au moins un non espace Juste après l’arobace, le moteur
continuera sa route aussi loin qu’il ne rencontrera pas d’espace
et jusqu’au point qui suit.
(\.)+? Au moins un point [A−z0−9_−]{2,3}) Après le point entre deux et trois caractères alphanumériques ou
blanc souligné ou tiret
Trang 18Tab 8.12 : Analyse de la seconde partie de l’expression :
(((\.)* <br>\s)|((\.)*<p>\s)|((\.)*</p>\s)|((\.)*\s))
Atome Description
((\.)* <br>\s) Point éventuel suivi d’une balise <br> et un espace
comme une fin de ligne ((\.)* <p>\s) Idem avec la balise <p>
((\.)* </p>\s) Idem avec la balise </p>
((\.)*\s) Idem sans balise
Ces atomes sont reliés par le signe | (ou) Ainsi, les signes qui suivent
la partie intéressante, l’adresse e-mail, sont une fin de ligne ou un espaceblanc
Nous pouvons améliorer l’expression en enlevant la deuxième ligne decette deuxième partie et en modifiant la ligne suivante :
((\.)* </*p>\s)
Ainsi, la ligne oblique peut être ou non présente
À la fin du premier membre de l’expression qui consiste en ces deuxparties, nous avons ajouté le modificateur i après le délimiteur pour quel’expression soit insensible à la casse
Trang 19Ici, nous cherchons à capturer le contenu des balises <title> et
</title>, en incluant l’éventualité qu’elles puissent chevaucher uneligne L’atome que vous rencontrez au milieu ((.|\n)*?) est ce que l’oncherche vraiment, c’est-à-dire tous les caractères compris entre les deuxbalises
à la suite de tests et d’approximations Le motif finit avec la répétition detitle(\\2) encadré par des chevrons Le tout est modifié par i qui lerend insensible à la casse Être un orfèvre en expressions rationnellesdemande de l’intuition et de l’expérience Ce n’est pas une science exactemais un outil indispensable aux possibilités encore largement inexplorées
Les expressions rationnelles demandent beaucoup de pratique car chaqueproblème posé est unique La construction d’une expression part d’unebase de caractères puis, par approximations, cherche à atteindre laprécision requise Cette précision se nomme la granularité L’objectifétant d’atteindre la granularité la plus appropriée Si elle est trop fine, vous
ne trouverez rien Si elle est trop grossière, vous aurez trop de résultats.Vous le voyez dans les moteurs de recherche En étant trop précis, vousn’obtenez aucun résultat
Trang 21XML ?
Trang 22Le XML est arrivé à point pour répondre à des besoins de communicationentre les applications avec un langage format texte Il répond, en outre, à
ce vieux rêve de clairement séparer le contenu de la présentation Avec leXML, la présentation et le contenu deviennent réutilisables dans différentscontextes (Web, archives, flux, téléphonie mobile )
L’objet de ce livre est non pas de vous donner une étude exhaustive duXML en général mais de vous permettre de créer des applications utiles ;vous pourrez ainsi approfondir le sujet avec une bonne base de compré-hension
PHP dispose de modules dédiés au XML avec les fonctions adéquatespour répondre à toutes les circonstances
Avant de créer vos pages XML sur votre serveur web…
Vérifiez avec la fonction phpinfo() si vous disposez du XML
et du module Sablotron pour le XSLT.
Le XML est un langage de balises comme le HTML Ces deux langagessont issus d’un ancêtre commun, le SGML Le SGML était trop complexepour se répandre, alors est né le HTML, qui en est une simplification et quicaractérise aussi bien une forme (<font>, <p>, <b> ) qu’un contenu(<title><script> ), utilisant la navigation par hyperliens Le HTML
a fait exploser la production de pages sur l’Internet grâce à sa simplicité
et à la tolérance des navigateurs quant à la grammaire des balises pour larestitution de ces pages Face à la prolifération des informations, voire àleur saturation, il a fallu trouver une façon de caractériser leur contenupour une communication plus pointue, et c’est là qu’intervient le XML Laplupart du temps, l’application XML se compose de trois fichiers : lefichier DTD (.dtd), une feuille XSLT(.xsl) et le fichier XML proprementdit (.xml)
Trang 23Sur la ligne en dessous, vous déclarez la DTD :
<!DOCTYPE nomDTD SYSTEM "nom.dtd">
Vous nommez la DTD et indiquez le chemin vers le fichier ou l’URL.Ensuite, vous déclarez le fichier XSLT, qui mettra le fichier XML en forme :
<?xml-stylesheet type="text/xsl" href="adherents.xsl"?>
Les éléments et les attributs
Le fichier XML est formé de balises comme l’exemple ci-dessous :
Trang 24propriété src de l’élément img sont appelées des attributs Ce que contientl’élément est du texte.
Le fichier XML doit avoir la bonne forme Si vous choisissez des capitalespour nommer les balises, vous devrez vous y tenir, qu’elles soientouvrantes ou fermantes Vous allez donc créer un fichier de DTD danslequel vous consignerez les règles que vous appliquerez à vos balises Ilservira à valider votre fichier et à repérer les erreurs de syntaxe Vouspourriez ainsi décider que telle balise est obligatoirement à l’intérieur detelle autre balise
Un fichier XML est un fichier brut de données, sans aucune présentationmais ponctué de balises ; il sera donc accompagné d’un fichier XSLT Cefichier de présentation est parcouru et interprété par une applicationserveur qui va fusionner les fichiers pour fabriquer une page résultat quisera soit un vrai fichier, soit l’écran par défaut Le langage XSLT estdéconcertant pour tout programmeur formé aux langages procéduraux ou
à objets Il est fondé sur la création de règles de modèle (template) à partir
du fichier source C’est sur l’arbre résultat que les transformations se fontpour présenter les données d’une manière lisible et agréable pour tout unchacun
Le fichier XML est traité (parsed) par un analyseur XML qui est par défaut le module Expat Ce fichier correspond au contenu de la page C’est
m Figure 9.1 : Processus XSLT
Trang 25ce document qui sera modifié dans le cadre d’une mise à jour Comme lesbalises sont explicites et le contenu, écrit sans codage, n’importe quelutilisateur à qui on a enseigné deux ou trois règles saura modifier ce type
de fichier sans dommages
Tab 9.1 : Codage des caractères dans un fichier XML
Caractère Codage Statut
générale-¶ Toute balise ouvrante doit être accompagnée par une balise fermante
¶ Le nom d’une balise ou d’un attribut doit débuter par une lettre ou unsouligné _ suivi éventuellement par plusieurs lettres, chiffres, points,tirets ou soulignés
¶ Une balise sans contenu sera finie par />, par exemple <br/>