287
Publication web avec XML/XSLT Bernd Amann et Philippe Rigaux August 6, 2001

Comprendre XSLT

Embed Size (px)

Citation preview

Page 1: Comprendre XSLT

Publication webavecXML/XSL T

BerndAmannet PhilippeRigaux

August6, 2001

Page 2: Comprendre XSLT

2

Page 3: Comprendre XSLT

Contents

1 Intr oduction à XML et XSLT 131.1 L’applicationet sesbesoins. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.2 XML, formatuniversel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.2.1 Qu’est-cequeXML ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.2 StructurationavecXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.2.3 DocumentsXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.3 PublicationdedonnéesavecXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.3.1 Siteweb(HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211.3.2 SiteWAP (WML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311.3.3 Documentpapier(PDF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

1.4 Échangeet intégrationdedonnéesenXML . . . . . . . . . . . . . . . . . . . . . . . . . 421.4.1 Exemple: Le Sitewww.sallesenligne.com . . . . . . . . . . . . . . . . . . . . . . 421.4.2 Descriptiondela structured’un documentXML . . . . . . . . . . . . . . . . . . 431.4.3 Transformationet échangededonnées. . . . . . . . . . . . . . . . . . . . . . . . 441.4.4 Un moteurderechercheXML/XSLT . . . . . . . . . . . . . . . . . . . . . . . . 451.4.5 IntégrationdynamiquedefragmentsXML . . . . . . . . . . . . . . . . . . . . . . 46

1.5 Commentlire la suitedecelivre? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

2 DocumentsXML : structur eet navigation 552.1 La syntaxeXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

2.1.1 DéclarationXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572.1.2 Déclarationdu typededocumentet desentités . . . . . . . . . . . . . . . . . . . 572.1.3 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.1.4 Instructionsdetraitement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 582.1.5 Éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592.1.6 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592.1.7 Espaces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602.1.8 SectionsCDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.1.9 Référencesd’entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612.1.10 Balises,donnéescaractèreset valeurtextuelle . . . . . . . . . . . . . . . . . . . . 62

2.2 Le modèleDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.2.1 TypesdenœudsDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642.2.2 InterfaceDOMString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662.2.3 InterfacesNodeList et NamedNodeMap . . . . . . . . . . . . . . . . . . . . . . 662.2.4 InterfaceNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 662.2.5 InterfaceDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712.2.6 InterfacesElementet Attr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 722.2.7 InterfacesDocumentType, Entity et EntityReference . . . . . . . . . . . . . . . 74

2.3 Du documentsérialiséà l’arbreDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 742.3.1 Constructiond’un arbreDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . 762.3.2 Traitementdesespacespendantla construction . . . . . . . . . . . . . . . . . . . 782.3.3 Deuxfonctionsdenavigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

3

Page 4: Comprendre XSLT

4 CONTENTS

2.4 Le langageXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 812.4.1 ReprésentationXPathd’un documentXML . . . . . . . . . . . . . . . . . . . . . 822.4.2 ExpressionsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 862.4.3 Lesaxes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 912.4.4 Lesfiltres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 982.4.5 Prédicats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1002.4.6 Typeset opérationsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1032.4.7 Exemplesd’expressionsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

3 XSLT 1093.1 ProgrammesXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

3.1.1 Structured’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . 1113.1.2 Modularité: xsl:import etxsl:include . . . . . . . . . . . . . . . . . . . 1153.1.3 Applicationd’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . . 117

3.2 LesrèglesXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1193.2.1 Lespatterns. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1193.2.2 Règles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1223.2.3 Déclenchementderèglesavecxsl:apply-templates . . . . . . . . . . . . . 1243.2.4 Sélectiondesrègles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1263.2.5 Appel derègleavecxsl:call-template . . . . . . . . . . . . . . . . . . . . 1313.2.6 Paramètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

3.3 Instructionsdecontrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1343.3.1 Tests: xsl:if et xsl:choose . . . . . . . . . . . . . . . . . . . . . . . . . . 1343.3.2 Boucles: xsl:for-each . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1363.3.3 Variables: xsl:variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1383.3.4 Tri : xsl:sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1403.3.5 Itérationsparrécursion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

3.4 Évaluationd’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

4 Production de documentsXML 1534.1 Définition deTypesdeDocuments: DTD . . . . . . . . . . . . . . . . . . . . . . . . . . 154

4.1.1 Pourquoidéfinir uneDTD ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1544.1.2 Entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1544.1.3 Éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1564.1.4 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1604.1.5 DTD etXML Schéma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

4.2 SiteWeb: HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1654.2.1 HTML et XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1654.2.2 DTD XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1664.2.3 GénérationdepagesHTML: xsl:output . . . . . . . . . . . . . . . . . . . . 1704.2.4 Transformationd’unepageXML . . . . . . . . . . . . . . . . . . . . . . . . . . 1714.2.5 Créationdeliens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1734.2.6 XML/XSLT: unesolutiondu problèmedeslienscassés. . . . . . . . . . . . . . . 1754.2.7 IntégrationdepagesXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

4.3 Présentationsmultimédia:SMIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1774.3.1 SMIL parun exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1774.3.2 DTD SMIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1814.3.3 GénérationdeprésentationsSMIL . . . . . . . . . . . . . . . . . . . . . . . . . . 187

4.4 TraitementdetextedansXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1954.4.1 xsl:preserve-space etxsl:strip-space . . . . . . . . . . . . . . . . 1954.4.2 Générationdetexte: xsl:text . . . . . . . . . . . . . . . . . . . . . . . . . . 1974.4.3 Sérialisationdu résultat: xsl:output . . . . . . . . . . . . . . . . . . . . . . . 197

4.5 RSSet RDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

Page 5: Comprendre XSLT

CONTENTS 5

5 Production de documentspapier 199

6 Échangeet intégration 201

7 Publication de basesde données 2037.1 Basesdedonnéeset XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

7.1.1 QuelquesrappelssurlesBD relationnelles . . . . . . . . . . . . . . . . . . . . . 2047.1.2 Documentsorientés«texte» et documentsorientés«données» . . . . . . . . . . 2077.1.3 Transformationd’unebasededonnéesenXML . . . . . . . . . . . . . . . . . . . 2097.1.4 Créationdela DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

7.2 Architectures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2187.2.1 UneclasseJava d’exportationXML . . . . . . . . . . . . . . . . . . . . . . . . . 2187.2.2 ArchitectureServlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2227.2.3 Utilisation desJavaServerPages . . . . . . . . . . . . . . . . . . . . . . . . . . 225

7.3 XML dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2307.3.1 XSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2307.3.2 XSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

7.4 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

8 Un serveur de publication XML 241

A L’envir onnementXML/A pache 243A.1 Le projetXML/Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244A.2 Xalan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

A.2.1 Préliminaire: le JavaDevelopmentKit . . . . . . . . . . . . . . . . . . . . . . . 245A.2.2 InstallationdeXalan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245A.2.3 Testd’expressionsXPathavecApplyXPath . . . . . . . . . . . . . . . . . . . . . 245A.2.4 EffectuerdestransformationsXSLT avecXalan . . . . . . . . . . . . . . . . . . . 246A.2.5 Utiliser XalanenAppletou enServlet . . . . . . . . . . . . . . . . . . . . . . . . 247

A.3 Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247A.3.1 Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247A.3.2 Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

A.4 IntégrationApache/Tomcat/Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249A.4.1 Compilateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250A.4.2 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251A.4.3 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251A.4.4 Lien Apache/Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251A.4.5 Et Cocoon? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

B RéférenceXPath/XSLT 253B.1 ÉlémentsXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253B.2 FonctionsXPath/XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Page 6: Comprendre XSLT

6 CONTENTS

Page 7: Comprendre XSLT

Avant-propos

Ce livre traitede la publicationde données,dansun environnementweb,à partir de documentsXML etde programmes(ou «feuilles de styles») XSLT. Le termede publicationemployé ici doit êtrepris dansun senstrèsgénéral. Il recouvretoutesles transformationsvisantà mettreen forme un contenuafin dele rendreaccessiblevia un ou plusieursmédiasdecommunication.Cettedéfinitiontrèssouples’appliquebienentenduà la publicationwebprisedanssonacceptionla plusclassique: rendredisponibleuncontenuau format HTML sur uneserveur connectéà l’Internet. Mais elle recouvreégalementde trèsnombreuxtypesdepublicationsquenousauronsl’occasiond’aborderdanscelivre: publicationWAPpourtéléphonesmobiles,miseenformepouruneimpressionpapier, présentationsinteractivesmultimédia,etc.

Il existe plusieursapprochespour la publicationde données.Une premièresolutionestde gérerlesdonnéesséparémentdansun formatadaptéà chaquetypedepublication,avecdesinconvénientsévidentsdusà la duplicationdesinformations.Un exempletrèsconcretdeceslimitationsestdonnéparle Web,quiestencoreessentiellementconstituédepagesHTML. Si uncontenuestplacédansunetellepage,il pourracertesêtreaffichécorrectementdansun navigateur, maisil deviendraégalementimpropreà êtrereprisetexploité dansun autrecontexte (documentpapier, systèmede basede données,...). Ce qui estvrai pourHTML l’est également,à desdegrésdivers,pourtouteautrereprésentation.

Il estdonctrèsrapidementdevenuévidentqu’il étaitsouhaitablededissocierprésentationet contenu.Parmi lestrèsnombreusesraisonsjustifiantceprincipe,on peutciter:

� la volontéderéutiliserun mêmecontenudansdifférentscontextes;� l’impossibilitéderéaliseruneapplicationcomplexeet interactiveavecHTML ;� la nécessitédebaserla présentationsurune«maquette» définissantunemiseenformeapplicableàdenombreusesoccurrencesdecontenu(exempletypiquedesmaquettesdequotidiensappliquéesàuncontenuqui changetouslesjours);� enfin,la lourdeurd’unegestiondesiteswebstatiques: leswebmestresdoiventeneffet êtrecompé-tentsengraphisme,enHTML, enJavaScript,etsavoir fairedeschoixrelatifsausystèmed’informationdeleur entreprise.

Une solutionmaintenantlargementadoptéeestde s’appuyersur un serveur de donnéescentralisantl’information, et d’écrire pour chaquetype de publicationuneapplicationséparéequi utilise desoutilsadaptés.Pourreprendrele domainede la publicationweb, la plupartdessitess’appuientmaintenantsurunsystèmedegestiondebasesdedonnées(SGBD),enextraientdesinformationsavecSQL,etproduisentunepageHTML intégrantcesinformationsavecun langagecommePHP, ASPou lesJavaServerPages(JSP).La complexité desapplicationsweb peutvarier du transfertsimplede résultatsde requêtesSQLet la réservationde billets d’avion avecdesmisesà jour surdifférentesbasesdedonnées.Cettesolutionrésoutlesprincipauxproblèmesévoquésci-dessus,et notammentrétablitunecertaineindépendanceentrecontenuet présentation.En revanchele simpleénoncédescompétencesnécessairesmontrequ’ellessontplutôt alourdies: ils fautmaintenantnonseulementmaîtriserleslangagespropresauweb,commeHTMLet JavaScript,maiségalementdisposerdeconnaissancesde graphiste,deprogrammeur, deconcepteuretadministrateurdebasesdedonnées.

Un desargumentsdu présentlivre estdemontrerquel’utilisation deXML enlieu et placedeHTMLpermetdemettreenplacedesmécanismesbeaucouppluspuissants,et notammentd’obtenir, à partir d’un

7

Page 8: Comprendre XSLT

8 CONTENTS

mêmecontenu,à peuprèsn’importe quel format de sortie(HTML, XML, PDF, WML, LaTeX, ...). UndocumentXML estbeaucoupplus souple,flexible et maniablequ’unebasede donnéesdont la miseenœuvresupposedescompétencestechniquesassezavancées.De plus la miseen formede l’information àpartir d’un documentXML estgrandementfacilitéeparl’existenced’un langagespécialisé: XSLT.

XSLT

XSLT (eXtensibleStylesheetLanguageTransformations) estunlangagepermettantd’extraireetderestruc-turerdesinformationsprésentesdansundocumentXML. CetterestructurationpeutêtrefaiteenHTML, sion viseà produireun siteausensclassiquedu terme,maisun programmeXSLT peutégalementfournir,pourtoutoupartiedesinformations,uneversionimprimableenPDF, voireWord/RTF. Onpeutégalement,dynamiquement, adapterla présentationau client qui accèdeau site, commel’illustre le castypiquededeuxversions,WML etHTML, d’un siteweb.

La publicationavecXSLT vaau-delàdela seulemiseenformedestinéeàuneconsultationstatique.Onpeututiliser XSLT dansuneoptiqued’échangeet d’intégration dedonnées. AvecXML il estpossibleeneffet derendrepubliquessurle Web,enpassantparunetransformationXSLT appropriée,desinformationsqui peuventêtrerepriseset traitéespar d’autres. On peutenvisager, par exemple,un systèmecoopératifoù il n’y a plusbesoin,pourcréerun siteweb,dedevoir gérersoi-mêmela basededonnées,le serveur, lasécurité,la présentation.Le contenuestfourni àquelqu’unsousformededocumentsXML, dansle formatqu’il attend,etcequelqu’unsechargedel’intégrationavecd’autresdocumentset la miseenforme,HTMLou autre.Autre applicationpossibledecettecapacitéd’échangesdedonnées: l’indexationparun moteurde recherche,dont le rôle estde collecterles informationssur un thèmedonné,et d’offrir desmodesderecherchessophistiquéspourcesinformations.

XML rendpossiblela représentationde l’information dansun format universel,reconnusur touslessystèmes,et adaptéà unerépartitionsur le Web. En utilisantdesfeuillesdestyleXSLT on peutextraire,reformater, et définir la présentationadéquatepourcesinformationsXML. On résout,end’autrestermes,unproblèmetrèscourant: commentéviterdedupliquerdesinformationspours’adaptersoitàuneapplica-tion donnée,soit autypeparticulierdepublication/communication(papier, écran,transparent,email)quel’on souhaiteutiliser. Il devientpossibled’imaginerunsystèmed’informationvéritablementrépartisurunréseau,danslequellesnœudspeuvents’échangerdesinformationset sespécialiserchacundansun typedeserviceparticulier.

Objectifs et contenudecelivre

Le présentlivre estprincipalementdestinéà couvrir demanièrecomplète,progressiveet détaillée,le lan-gageXSLT et sesapplicationsà la transformationdedocumentsXML. Cetaxe principalestcomplétéparla recherched’unemiseenperspective du pourquoiet du commentde tellestransformations.Autrementdit nousavonscherché,autantqueleslimitesfixéesparla clartédela présentationle permettaient,àdéfinirun contexted’utilisation réalistepourmotiver le recoursàXSLT et montrersesapports.

Au coursdesdifférentschapitres,nousenvisageonsdoncdifférents«casd’utilisation» de XML. Cechoix nousamène,en pratique,à aller bien plus loin quela simplecréationde pagesHTML, commeletermede «publicationweb» pourraità tort le laissercroire. En particuliernousdévelopponslesaspectsrelatifsauxéchangesdedonnéesentredeuxapplications

�et � , avecdestransformationsXSLT prenant

enentréeun documentXML reconnuparl’application�

, et produisantensortieun autredocumentXMLreconnupar l’application � . Ceséchangesconstituentun aspectessentieldu rôle de XML dansdesap-plicationsréparties,et XSLT, parsacapacitéà transformerautomatiquementles informationsstructuréesavecXML, y tient uneplaceimportante.

Un dernierthèmeabordédansce livre est l’intégration de donnéesau format XML, préalableà unetransformation. Le langageXML peut en effet être vu commeun moyen pour unifier dansun formatcohérentdesinformationshétérogènesissuesde sourcesdiverses. Nous consacronsen particulier uneplaceimportanteà la création«à la volée» de documentsXML à partir d’une basede données,suivied’une transformationXSLT. Une telle aprocheoffre unealternative intéressanteà unesolutionbaséesur

Page 9: Comprendre XSLT

CONTENTS 9

un langagede script intégréaux pagesHTML (PHP ou JSP)car elle permetuneséparationdespointsde vueset doncdescompétences: celui qui intègre les informationsen XML, en utilisant deslangagescommeJava et SQL, peutêtredifférentde celui qui publie cesinformationsà destinationde différentsmédias,ens’appuyantsur desconnaissancesXSLT et – parexemple– HTML. En incluantdansce livredesdéveloppementstechniquessurunechaînedepublicationcomplexeallantd’unebasededonnéesà undocumentfinal auformatPDFou HTML, enpassantparuneintégrationXML, nouspensonsproposerunpanoramacompletdecequepeutêtreunenvironnementdepublicationwebconstruitsurXSLT.

Afin de donnerdesillustrationsconcrètesaux conceptsévoquésci-dessus,unepartieimportantedesexemplesdonnésdanscelivre estconsacréeà desapplicationssimplifiées,maisréalistes,dela manipula-tion dedocumentsXML avecXSLT. Nousinvitonsle lecteuràutilisernosdeuxmaquettes,disponiblessurle sitedu livre,et à récuperer, puismodifierle codedecesexemples.

Lesexemples

Saufindicationcontraire,tousnosexemplessontconformesauxdocumentsnormatifspubliésparle WorldWide Web Consortiumet disponiblessur le site http://www.w3c.org. Il devraientdonc fonctionneravectousles serveursd’applicationou clientsweb dotésd’un processeurXSLT. Nousutilisonscependant,àtitre d’outil de référence,l’environnementTomcat/Cocoonproposépar la fondationApacheet librementdisponiblesur le site http://xml.apache.org. Nousproposonsdansl’annexe A un guided’installationetde configurationde cesoutils, sousLinux ou Windows, qui vouspermettrontde testernosexemplesoud’effectuervospropresinvestigationssansinvestirdansun produitcommercial.

Danslescasoùnousdevonsfaireappelàdesfonctionnalitésnonstandardisées,nousavonschoisi,parsoucide cohérence,de faire encoreappelaux solutionsproposéesdansCocoon,en essayantcependantde mettreen valeur les aspectsgénériquesqui se retrouvent dansla plupart desproduits. C’est le casnotammentpour la créationdynamiquededocumentsXML à partir d’unebasededonnéespour laquellenosexemplessontbaséssurXSP, unetechniqued’intégrationdecodejavadansduXML quel’on retrouvedansCocoon,dansAxKit (www.axkit.org), et qui s’inspirefortementdesJavaServerPages.

Vouspouvezrécupérertout le codedenosexemplessur le sitedu livre, afin de l’utiliser, le consulterou le modifierpourvospropresbesoins.

http://cortes.cnam.fr:8080/XBOOK

Audienceet pré-requis

Celivre estdestinéà tousceuxqui s’interrogentsurlesapplicationsliéesà XML, et plusparticulièrementsur la validité d’une aprochebaséesur XML pour la mise à dispositionde donnéessur le Web. Nouspensonsquecepublic recouvreplusspécifiquementlestypesdelecteursuivants:

1. lesarchitectesd’applicationsenvisageantd’utiliser XML commeformatd’échangededonnéesentredifférentesapplicationsoù commesupportdebasedeleursystèmed’information;

2. leschefsdeprojetqui doiventintégrerdansla conceptiondeleursproduitsun ou plusieursmodulesdecommunicationsdedonnéesvia le Web;

3. les développeursd’applicationà qui ce livre donneles indicationsnécessairespour produireuneprésentationuniformedeleur sitefondéesurl’utilisation defeuillesdestyle.

4. enfin toutepersonnecherchantuneprésentationpratiqueet complètedesnouvellesméthodologiesdepublicationssurle web.

Noussupposonsquele lecteurdisposeparailleursd’uneconnaissanceminimaledessujetssuivants:

1. les basesdesapplicationsweb, incluantHTML, la gestionde formulaires,quelquesnotionssur laprogrammationCGI et lesgrandeslignesd’unearchitectureweb;

Page 10: Comprendre XSLT

10 CONTENTS

2. lesprincipesdesbasesdedonnéesrelationnelles(notammentSQL);

3. unpeudeprogrammationJava.

Il existede trèsnombreuxlivresqui traitentdesaspectsci-dessus.NousrecommandonsparexempleHTML: TheDefinitiveGuide, Javain a Nutshellet (?) tousauxÉditionsO’Reilly.

Organisationdu livre

Le livre suit unedoubledémarchede présentationdesaspectsles plus simples,puis, progressivement,les plus complexesdu langageXSLT, et d’illustration desmécanismesde ce langageà descasconcretsd’utilisation. Nousavonschoisidecommencerparunchapitreintroductifenformed’étudedecasqui pro-pose,suruneapplicationdetype«Officiel desspectacles» adaptéeauweb,unedéclinaisondesdifférentsthèmescouverts. La lecturepréalablede ce chapitreestprobablementindispensable,au moinspour lesnéophytes.

Les chapitressuivantstraitentde manièreplus systématiquedu coupleXML/XSLT en reprenantdemanièreapprofondielesaspectsprésentésdemanièredélibérementintuitive dansle premierchapitre.Lefil conducteurestcettefois uneapplicationpubliantsousdifférentesformeslesprogrammesd’organismesdeformation(universités,institutstechniquescommele Cnam,etc),maisnousutilisonségalementparfoisdesexemplesplusabstraitsquandil fautprivilégier l’explicationdesmécanismesXSLT.

Dansla quasi-totalitédu livre nousessayonsd’être indépendantd’un outil ou type d’outil particulierafinderespecterle caractèrenormalisédeXML/XSLT. Le dernierchapitreproposecependantuneétudedecasdétailléemontrant,pouruntyped’environnementparticulier, enl’occurrencelasuiteApache/Tomcat/Coocon,la réalisationd’un siteweb.

Plan détaillé

Une intr oduction à XML/XSL T. Ce premierchapitrefournit uneprésentationrelativementcourtede laproblématiqued’ensembleabordéepar le livre. Il peutselire indépendammentdu restedu livre, etproposedesargumentset desexemplessimples,ainsiqu’uneintroductionintuitivedesmécanismesqui sontà la basedestransformationsXSLT.

Les apportsde XML/XSLT sontsuccessivementprésentés,tousétant,dansles chapitressuivants,repriset développésavecdesdescriptionstechniquesapprofondies.

DocumentsXML. Présentationdela syntaxeXML (éléments,attributs,liens,entités..);

Basesde XSLT. Le cœurdu sujet: à partir d’un ou plusieursdocumentsdécrivant desformations,onexplorelesprincipalespossibilitésdeXSLT.

DTD. XSLT peutêtrevu commeun outil permettantde transformerun documentXML représentantuncontenuindépendammentdetouteapplication,versun autredocumentXML, spécialisé,et dédiéàunapplicationparticulière(parexempleun navigateurweb).

Plusieursspécialisationssontprésentéesdanscechapitre:

1. XHTML ;

2. RSS;

3. WML ;

4. (?)

Page 11: Comprendre XSLT

CONTENTS 11

Conventions

Nousutilisonslesconventionstypographiquessuivantes:

� La police à chasse constante s’appliqueà tousles exemplesde code,de commandeet deprogramme.� La police à chasse constante en italiques estutiliséepour distinguerles paramètresdesmot-clédansla syntaxedescommandes.� Le texte en italiquesestutilisé pourlesURL, lesnomsdefichiers,deprogrammeset derépertoirescitésdansle texte(autrementdit, quandils nesontpasinclusdansducode).L’italique estégalementutilisépourlestermesétrangerset pourla miseenvaleurdemotsou d’expressionsimportants.

LescommandesUNIX sontprécédéesde%. Parexemple:% ls -lDe plus,nousadopteronségalementdesconventionsprécisespournommerlesfichiers,lesvariables,

les fonctions,les nomsde tables,etc. Cesconventionsfont partied’une stratégiegénéralede qualitédudéveloppementetserontprésentéesle momentvenu.

Remerciements

Irini Fundulaki,CédricDumouza,Laur ent Mignet, Michel Scholl,Luc Ségoufin,DanVodislav

Page 12: Comprendre XSLT

12 CONTENTS

Page 13: Comprendre XSLT

Chapter 1

Intr oduction à XML et XSLT

Sommaire

1.1 L’application et sesbesoins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.2 XML, format universel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

1.2.1 Qu’est-cequeXML ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.2.2 StructurationavecXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

1.2.3 DocumentsXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

1.3 Publication de donnéesavecXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

1.3.1 Siteweb(HTML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

1.3.2 SiteWAP (WML) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

1.3.3 Documentpapier(PDF) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

1.4 Échangeet intégration de donnéesenXML . . . . . . . . . . . . . . . . . . . . . . 42

1.4.1 Exemple: Le Sitewww.sallesenligne.com . . . . . . . . . . . . . . . . . . . . 42

1.4.2 Descriptiondela structured’un documentXML . . . . . . . . . . . . . . . . . 43

1.4.3 Transformationet échangededonnées . . . . . . . . . . . . . . . . . . . . . . 44

1.4.4 Un moteurderechercheXML/XSLT . . . . . . . . . . . . . . . . . . . . . . . 45

1.4.5 IntégrationdynamiquedefragmentsXML . . . . . . . . . . . . . . . . . . . . 46

1.5 Comment lir e la suitede celivre? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Cechapitreapourambitiondeproposeraulecteuruneprésentationintuitivedesprincipalescaractéris-tiquesde XML, ainsi qu’un tour d’horizon de sesapportsen termed’intégration,d’échangeet de publi-cationdedonnées.Nousévitonsdélibérément,à cestade,toutediscussiontechniquedétaillée,l’objectifétantplutôt dedresserun panoramadescontextesd’utilisation deXML et desonassociationavecXSLT,envuedeconvaincrele lecteurdel’intérêt derecourirà ceslangages.

Nousprenonscommefil conducteur, dansce chapitre,uneapplicationsimplequi nouspermettradedéclinerdesexemplesd’utilisation deXML. Cetteapplicationconsisteà fournir, sousles formeslesplusvariées,lesinformationsrelativesauxfilms à l’afficheenFrance,comprenantundescriptifdechaquefilm,et lescinémas,salleset séancesoù cesfilms sontprojetés.Noussupposonsdeplusquecesinformationssontdisponiblesendifférentspointsdu réseauInternet.NosexemplesmontrerontcommentXML permetd’échangercesinformations,delesintégrer, etenfindelespubliersurlessupportslesplusdivers.

L’accentestmis bienentendusurl’associationdeXML avecle langagedetransformationXSLT, maisnousdiscutonségalement,plusbrièvement,desinterfacesdeprogrammation,ainsiquedesrapportsentreXML et lesbasesdedonnéesrelationnelles.Noussouhaitonsquecepremierchapitrepermette,sansinve-stir dansuneétudetechniqueapprofondie,dedégagerclairementla placedeXML auseindesnombreuxoutils, langageset techniquesqui constituentun systèmed’information orientéversla publicationou leséchangesde donnéessur le Web. Pourtousles aspectsqui ne sont,techniquementparlant,qu’esquissésdanscetteintroduction,nousindiquonsfinalementle chapitreou la partiedu livreoù le lecteurtrouveraundéveloppementcomplet.

13

Page 14: Comprendre XSLT

14 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

1.1 L’application et sesbesoins

Décrivonstoutd’abordl’application(simplifiée).L’objectif généralconsiste,pouruncinéma,àdiffuserlepluslargementpossiblel’information relative à sessalles,aveclesfilms qui y sontdiffuséset leshorairesdesséances.Nousprendronscommeexempleprincipalle casdu cinémaL’Épéedeboisqui proposedeuxfilms:

� Le film Alien, deRidley Scott,projetédansla salle1 avectroisséancesdansla journée;

� le film Vertigo, d’Alfred Hitchcock,projetédansla salle2 avecuneseuleséanceà22 heures.

L’Épéede bois souhaitebien entendurendrecesinformationsdisponiblessur sonsite web. Mais ilenvisageégalementle casdecinéphilesmunisd’un téléphonemobile,susceptiblesdeconsulterlesséancesvia uneapplicationWAP. Enfinleprogrammedessallesdoit êtreaffichéàl’entréeducinéma,distribuédansl’environnementproche(cafés,librairies)sousformede tracts,et transmisà un magazined’informationssurlesspectacles.

Pourtouscesmodesdediffusion,la solutiontraditionnelle,baséesurdesoutils adaptésà chaquecas,impliquede resaisirl’information, avecdesrisquesd’erreurmultipliéset unepertede tempsinutile. Parexemplela plaquetteseraitstockéeauformatpropriétaired’un traitementdemiseenpage,chaquesitewebplaceraitle contenudansdesfichiersHTML, le magazineconserveraitcemêmecontenudansunebasededonnées,etainsidesuite.

Supposonsdeplusqu’unsite,www.sallesenligne.com, proposederéférencertouteslesséancesdetouslescinémasenFrance,et offre auxinternautesun servicederechercheet d’indexation.Bien entenducelasupposequechaquecinémalui fournisse,dansun formatdonné,lesinformationssurcespropresséances,cequi impliquepour l’Épéedeboisun travail supplémentairedesaisieet miseà jour.

Enfin on supporseraqu’un dossiercompletsurchaquefilm (acteurs,résumé)estdisponibledansunebasede donnéesinterrogeablesur le web, et quechaquejournal tenantunerubrique«cinéma» offre unaccèssur le Web auxcritiquesparuessur lesfilms. Il seraitsouhaitablequecetteinformationpuisseêtreintégréeauprogrammepourle rendreencoreplusattrayant.

En résumé,la problématiqueestdouble: d’unepart il fautêtreenmesuredefournir unemêmeinfor-mation– le programmedecinéma– souslesformeslesplusvariées,d’autrepart il faut«récupérer» toutce qui peutenrichir cetteinformation,et intégrerle tout dansun format cohérent.Nousallonsexplorerdansla suitedecechapitrecommentXML/XSLT répondà cedoublebesoin.

1.2 XML, format universel

XML constitueun moyenderendreun mêmecontenuaccessibleà plusieursapplications.Considéronslecasdesinformationspropresaucinéma,àsavoir sonnom,sonadresseet la stationdemétrola plusproche:

L’Epée de bois, 100 rue Mouffetard, métro Censier-Daubenton

Cesquelquesinformationsconstituentun contenususceptibled’apparaîtresur de nombreuxsupportsdifférents: desaffichesde film, un magazinedesspectaclesà Paris, de très nombreuxsitesweb, desplaquettescommerciales,untéléphoneportable,etc.Dansuncontextecloisonnéoùcesdifférentssupportssontproduitsindépendammentles unsdesautres,ce contenuesthabituellementdupliquéautantde foisquenécessaire,et associéà un formatpropreà chaquesupport.

Dansla mesureoù lesapplicationsgérantcecontenunecommuniquentpas,cetteduplicationet cettehétérogénéitédesformats,adaptésà chaquetype d’exploitation de ce contenu,sont légitimes. Si, enrevanche,on seplacedansun environnementconnectéauréseauet favorisantleséchangesd’information,duplicationet hétérogénéitédeviennentbeaucoupmoins justifiables. La duplicationinduit un coût, detransformationoudestockage,et l’hétérogénéitépeutrendreinaccessibleou inexploitableuneinformationpourtantprésente.

Page 15: Comprendre XSLT

1.2. XML, FORMAT UNIVERSEL 15

1.2.1 Qu’est-cequeXML ?

XML estdoncd’aborddestinéàreprésenterdescontenusindépendammentdetouteapplication.Il s’appuiepourcelasurla combinaisondeplusieursprincipessimplesetgénérauxpourla représentationet l’échanged’information.Voici unereprésentationXML denotrecinéma:

Exemple1 ReprésentationXML d’un cinéma

<?xml version="1.0" encoding="ISO-8859-1"?><CINEMA><NOM>E pée de Bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censie r-Dau bento n</METRO></CINEMA>

Une informationcodéeenXML estdoncsimplementreprésentéesousformed’unechaînede carac-tères. CettechaînedébuteobligatoirementparunedéclarationXML :

<?xml version="1.0" encoding="ISO-8859-1"?>

qui indiquequela chaînecontientdesinformationscodéesavec la version1.0 de XML, et quele jeu decaractèresutilisé estconformeà la normeISO-8859définieparl’OrganisationInternationaledeStandard-isation(ISO)pourleslangueslatines.Cettenormeestadaptéeà l’usagedu françaispuisqu’ellepermetleslettresaccentuéescommmele ’é’ dansle mot Epée.

1.2.2 Structuration avecXML

La représentationsousforme de chaînede caractèresn’exclut pasla structurationde l’information. Parexemple,la chaîne

«L’adresseducinémaÉpéedeBoisest100,rueMouffetardet setrouveprèsdela stationdemétroCensier-Daubenton»

contientla mêmeinformationque la chaîneXML précédente,maisestdifficilementexploitablepar unoutil informatiquecar la structurede la phraseestcachée.Cettestructureestmarquée,enXML, pardesbalises1 encadréesparlessymboles� et � . Lesbalises� CINEMA� , � NOM� , � /NOM� , � ADRESSE� ,� /ADRESSE� , � METRO� , � /METRO� et � /CINEMA � décomposentainsi le contenuentrois partiestextuelles:

� Epée de Bois ;

� 100, rue Mouffetard ;

� Censier-Daubenton .

On peut constaterque les balisesforment desparenthèsesautourde fragmentsde la chaîneXML.On trouve dansnotre exemple les «parenthèses» � CINEMA� . . . � /CINEMA � , � NOM� . . . � /NOM� ,� ADRESSE� . . . � /ADRESSE� , � METRO� . . . � /METRO� . Danscespairesdebalises,la premièreestappelébaliseouvranteet la deuxièmela balisefermante. Voici la terminologieétabliepourdésignerlesconstituantsd’unechaîneXML :

� unepairede balisesouvranteet fermanteet le fragmentqu’ellesentourentconstituentun élémentXML ;

� le nomdela baliseestle typedel’élément;

� le contenud’un élémentXML estobtenuenenlevantlesbalisesqui l’entourent.

1XML estun langage debalisage structurel.

Page 16: Comprendre XSLT

16 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

La structurationavecXML permetd’unepartdedésignercertainespartiesdu contenuavecdesnomsd’éléments,etd’autrepartdestructurercecontenuendéfinissantunehiérarchieentreleséléments.Unedesprincipalesrèglesdestructurationesteneffet quele parenthésagedéfiniparlesbalisesdoit êtreimbriqué:si unebalise � B � estouverteentredeuxbalises� A � et � /A � définissantunélément,elledoit égalementêtreferméepar � /B � entrecesdeuxbalises.Cettecontrainteintroduit unehiérarchieentrelesélémentsdéfinispar lesbalises.Par exemple,l’élément � ADRESSE� 100, rue Mouffetard � /ADRESSE�estun sous-élémentde l’élémentdéfini par la balise � CINEMA� . Ce dernierenglobetout le document(saufla premièreligne) etestappelél’élémentracinedu document.

On peutnoterquele nomdesbalises,ainsiquel’imbrication decesbalises,sonttotalementlibres: iln’existepasenXML derèglesprédéfinies.Celapermetàchacundedéfinirsonproprelangagepourdécriresesdonnées.L’Épéedeboiss’estdéfini un langagebasésur le vocabulaireCINEMA, NOM, ADRESSEetMETRO, et unerègledeconstructiontrèssimpleconsistantà imbriquerdans � CINEMA� les trois autreséléments.Nousparleronsparfoisde«dialecte» pourdésignerun langagedéfiniavecXML.

La structurehiérarchiqued’un contenuXML devient plus explicite si on ajoutedeschangementsdeligne etdesespacesdansle document:

Exemple2 ReprésentationXML avecindentation

<?xml version="1.0" encoding="ISO-8859-1"?><CINEMA>

<NOM>Epée de Bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censier-Daubenton</METRO>

</CINEMA>

Cettechaîneestconsidéréecommeidentiqueàla premièrecarlescaractèresblancset lessautsdeligneentredeuxbalisesnesontpasprisencompteparuntraitement.L’indentationestsouventutiliséepourclar-ifier uncontenuXML, sansavoir d’impactsurcecontenului-même.Enfait, cequecettepratiquesuggère,c’estqu’uneapprochefructueusepour faciliter la compréhensionet le raisonnementsur uneinformationstructuréeavecXML estdeconsidérerquecetteinformationestun arbre,et pasunechaînedecaractères.La figure 1.1 montrel’arbre correspondantau cinéma«L’Epée de bois». Il a pour racineun élément� CINEMA� doncle contenuest lui-mêmeconstituédestrois sous-éléments� NOM� , � ADRESSE� et� METRO� . Chacundecestroissous-élémentsaun contenuqui estdu textesimple.

CINEMA

NOM

Épéedebois

ADRESSE

100,rueMouffetard

METRO

Censier-Daubenton

Figure1.1: Représentationarborescented’un contenuXML

Cettereprésentation,plusabstraite,permetdemettrel’accentsur lesdeuxaspectsvraimentessentielsd’un contenustructuréavecdesbalisesXML. En premierlieu elle montrequelssontlesnomsd’élémentsqui décomposentet désignentles différentespartiesdu contenu. En secondlieu elle permetde situerprécisémentla placedechaqueélémentauseindela hiérarchieglobale.Il esttrèsimportantdenoterdèsmaintenantquecesdeuxaspectssont indissociables: un élémentestcaractériséà la fois par sonnomet par sa placedansl’arbre XML. Concrètement,cela implique quetout traitementde donnéesXML –parexempleenvuedelesmettreenformepourunepublicationweb– sebasesurdesoutilspermettantde

Page 17: Comprendre XSLT

1.2. XML, FORMAT UNIVERSEL 17

choisirdesélémentsparleurnom,ouparleurposition,ouparlesdeuxdimensionsutiliséessimultanément.Le principaloutil utilisédanscelivrepoursélectionnerdesélémentsXML estle langageXPath,maisnousdonneronségalementun aperçudesinterfacesde programmationSaxet DOM qui remplissentla mêmefonction.

Voici un exempleplus généralillustrant la structured’un document. Il développela descriptionducinéma«L’Epéede bois». Ce cinémaa deuxsalles,chacunereprésentéepar un élémentXML de type� SALLE� . Pourchaquesalleon connaîtle titre du film projetéet leshorairesdesséances.La premièresallea égalementun sous-élémentdetype � REMARQUE� qui estabsentpourlesdeuxautressalles.

Exemple3 ExXML1.xml: Un cinéma,avecsallesetséances

<?xml version="1.0" encoding="ISO-8859-1"?><CINEMA>

<NOM>Epée de bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censier-Daubenton</METRO>

<SALLE NO=’1’ PLACES=’320’><TITRE>Alien</TITRE><REMARQUE>Reservation conseillée</REMARQUE><SEANCES>

<SEANCE>15:00</SEANCE><SEANCE>18:00</SEANCE><SEANCE>21:00</SEANCE>

</SEANCES></SALLE><SALLE NO=’2’ PLACES=’120’>

<TITRE>Vertigo</TITRE><SEANCES>

<SEANCE>22:00</SEANCE></SEANCES>

</SALLE></CINEMA>

Cetexempleintroduit un nouvel aspectde la représentationd’uneinformationenXML : lesattributs.Danslespremiersexemplesdonnésprécédemment,toutel’information concernantun typed’élémentétaitcodéedansle contenudeséléments,ou,autrementdit, dansle texteentouréparlesbalisesdel’élément.Ici(exemple3), le numéroet le nombredeplacesdisponiblespourchaquesallenefont paspartiedu contenude l’élément correspondant,mais sont indiquésau sein desbalisesmêmesousforme d’attributs NOetPLACES. La mêmeinformationauraitpu êtrecodéeavecdessous-éléments.

La figure1.2montrel’arbreXML. Onpeutentirer quelquesconstatationsgénérales:� cetarbren’estpaséquilibré(certainesbranchessontpluslonguesqued’autres);� certainstypesd’élémentsserépètent(casdessalleset desséances)et d’autrespas(casdu nomducinéma);� certainstypesd’élémentsapparaîssentrégulièrementcommesous-élémentd’un autretyped’élément(casdessallesqui sontdessous-élémentsdescinémaset destitres qui sontdessous-élémentsdessalles);� lesélémentsdecertainstypessontoptionnels(casdesremarques).

Nousutiliseronsabondammentla représentationarborescentepour soutenirnosexplicationssur lesmécanismesdetransformationXSLT. Elle permetdes’affranchirdedétailsinutiles(comme,parexemple:d’où vient cettechaîne? commentest-elleindentée?) et de travailler sur une représentationclaire etpertinentedu contenuet desastructuration.

Page 18: Comprendre XSLT

18 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

CINEMA

NOM

Épéedebois

ADRESSE

100,rueMouffetard

METRO

CensierDaubenton

SALLENO=1,PLACES=320

TITRE

Alien

REMARQUE

Réservationconseillée

SEANCES

SEANCE

15:00

SEANCE

18:00

SEANCE

21:00

SALLENO=2,PLACES=120

TITRE

Vertigo

SEANCES

SEANCE

22:00

Figure1.2: Arbred’un documentXML complété

1.2.3 DocumentsXML

Jusqu’àprésentnousavonsparléde «chaînede caractères» sansfaire d’hypothèsessur l’origine ou lestockagede cettechaîne: cettedernièrepeutêtre placéedansun fichier, mais il peutégalements’agird’un flux (ou message) échangéentredeuxapplications,ou d’une informationengendréeà partir d’uneapplication.Par exemple,la plupartdessystèmesde basesde donnéesactuelspermettentdegénérerdesdocumentsXML àpartir desdonnéesstockées.

Dansle casd’un stockagefichier, l’information codéeen XML peutêtreaffichéeet modifiéepar unoutil detraitementdetexte standard.Il estainsipossibledevisualiseret modifierun documentXML trèsfacilementetsansoutil sophistiqué.Pourdesraisonsdesimplicité,c’estla situationquenousenvisageronsprioritairementdanscequi suit.

Le caractèrepersistant(casd’unfichier)outransitoire(casd’un message)d’uneinformationcodéeavecXML sontcependantdesaspectssecondairestantqu’on nes’intéressepasà desproblèmesd’architecturesur lesquelsnousreviendronsplustard. Nousutiliseronsuniformémentdanscequi suit le termededocu-mentXMLpourdésigneruncontenustructuréavecdesbalisesXML, etcequellequesoit lanaturephysiqueet la duréed’existencedececontenu.

La notiondedocumentenXML estun peupluscomplètequecelled’un arbred’éléments.La déclara-tion XML, ainsiquecertainesautresinformationsqui apparaissentavantl’élémentracinesontconsidéréescommepartiesintégrantesdu document.Nousdistingueronsdoncsoigneusement,à partir demaintenant:

� l’élémentracine, définiparla premièrebaliserencontrée;� la racinedudocumentqui comprend,outrel’élémentracine,unensemblededéclarationsetd’instructionsutilespourl’interprétationdu contenu.

Cettedistinction,ainsi quela différenceentredocumentXML et fichier, sont illustréspar l’exemplesuivant. Imaginonsquedansnotreapplication,chaquesalleestgéréeparun responsablequi doit tenir à

Page 19: Comprendre XSLT

1.2. XML, FORMAT UNIVERSEL 19

jour les informations. Il existealorsautantde fichiersXML qu’il y a de salles.Le documentrelatif à lasalle2 estle suivant:

Exemple4 Salle2.xml: La salle2, représentéeindépendamment

<?xml version="1.0" encoding="ISO-8859-1"?>

<SALLE NO=’2’ PLACES=’120’><FILM>

<TITRE>Vertigo</TITRE><AUTEUR>Alfred Hitchcock</AUTEUR><ANNEE>1958</ANNEE><GENRE>Drame</GENRE><PAYS>Etats Unis</PAYS><RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet

au vertige depuis qu’il a vu mourir son collègue. Elster, sonami, le charge de surveiller sa femme, Madeleine, ayant destendances suicidaires. Amoureux de la jeune femme Scottie neremarque pas le piège qui se trame autour de lui et dont il vaêtre la victime...

</RESUME></FILM><SEANCES>

<SEANCE>22:00</SEANCE></SEANCES>

</SALLE>

On retrouve les attributs et les éléments� SEANCE� , et l’élément � FILM � auquelon a ajoutédesinformationscomplémentaires: annéede production,metteuren scène,résumé,etc. Le contenudece fichier correspondà un documentreprésentédansla figure 1.3, avec la racinedu documentnotéeSalle2.xml:/ , puisl’élémentracineSALLE.

Salle2.xml:/

<- - Salle 2 du cinéma Epée de Bois - ->SALLE

NO=’2’ PLACES=’120’

FILM

TITRE

Vertigo

AUTEUR

Hitchcock

ANNEE

1958

GENRE

Drame

PAYS

USA

RESUME

Scotty...

SEANCES

SEANCE

22:00

Figure1.3: Arbred’un documentXML complété

Page 20: Comprendre XSLT

20 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

À partir de l’ensembledesdocumentsdécrivantlessalles,il estpossibledereconstituerun documentglobal en assemblantdansun fichier les informationspropresau cinéma,et en importantles documentsrelatifs aux salles. On utilise la notion XML d’entité externequi permetde faire référenceà unesourcededonnéesexterneaufichier XML «principal» (appeléentitédocument), et d’inclure le contenudecettesource.

Voici unenouvellereprésentationdu documentXML pourle cinéma«L’Epéedebois» (figure1.2). Ils’agitbiendumêmedocument(avecundescriptionplusdétailléedesfilms), maisrépartidanstroisfichiersou entitésexternes:

Exemple5 Epee.xml: Fichier constituantpar assemblageun documentsur le cinéma

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="Cinema.xsl" type="text/xsl"?><?xml-stylesheet href="CinemaWML.xsl" type="text/xsl" media="wap"?><?cocoon-process type="xslt"?>

<!DOCTYPE CINEMA [<!ENTITY salle1 SYSTEM"Salle1.xml"><!ENTITY salle2 SYSTEM"Salle2.xml">

]><CINEMA>

<NOM>Epée de bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censier-Daubenton</METRO>

<!-- Inclusion du fragment XML décrivant la salle 1 -->&salle1;

<!-- Inclusion du fragment XML décrivant la salle 2 -->&salle2;

</CINEMA>

L’entitédocumentEpee.xmlcontientdanssonentêtedeuxdéfinitionsd’entitéexternesverslesfichiersSalle1.xmlet Salle2.xml:

<!ENTITY salle1 SYSTEM"Salle1.xml">\\<!ENTITY salle2 SYSTEM"Salle2.xml">

Lesréférencesverslesentitéexternesdansl’entité documentsontreprésentéespar le nomde l’entitécorrespondanteentourédessymboles& et ; :

<!-- Inclusion du fragment XML décrivant la salle 1 -->&salle1;

<!-- Inclusion du fragment XML décrivant la salle 2 -->&salle2;

Dansla représentationarborescentedu documentXML (figure1.2), touteslesréférencesverscesen-titésserontremplacéesparle contenudesentitésSalle1.xmlet Salle2.xml.

Nousseronsamenédansla suitede ce livre à généraliserconsidérablementce premierexempleoùun documentXML estobtenuparassemblagedeplusieurssources.Ici noussommesdansun cassimpleoù les sourcessontd’autresfichiers,mais il estpossibled’intégrerdescomposantstrèsdivers, incluantdesparties«statiques» (par exempleun ou plusieursfichiers, éventuellementrépartissur l’Internet) etdesparties«dynamiques», fragmentscréésà la volée,parexemplepar extractionà partir d’une basededonnées.

Page 21: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 21

1.3 Publication de donnéesavecXSLT

Nousallonsmaintenantmontrercomment,àpartird’un documentXML proposantuncontenustructuré,onobtientavecdestransformationsXSLT despublicationsdececontenudestinéesauxsupportslesplusvar-iés. L’idée debased’un environnementXML/XSLT estdeséparerle traitementdesdonnéesdu processusdepublication.

� le traitementdesdonnéesconsisteà lesmettresousformededocumentXML obéissantà unestruc-turearborescentedonnée(parexemplela structurecinéma-salle-filmillustréedanscequi précède);� la publicationdesdonnéesconsisteàextraireuncontenud’un documentXML etàle mettredansfor-matreconnuparuneapplicationdepublicationparticulière(parexempleauformatHTML reconnuparlesnavigateursweb).

Dansuntel environnementlesresponsabilitéssontclairementpartagées.Ony distingueceuxqui gèrentlescontenusetdoiventétablirlesdocumentsXML, éventuellementàpartirdeplusieurssourcesdedonnées– nousreviendronssurcetaspectultérieurement– deceuxqui doiventcréerunemiseenformepourtel outel support.NousprenonscommeexemplelesdocumentsXML dela sectionprécédente,sansavoir besoindefaired’hypothèsessurl’origine decesdocuments.LestransformationsXSLT vont permettred’obtenirtroisversionsdifférentesdecemêmecontenu:� un(petit) siteweb,affichantlesinformationssurle cinéma,sessallesetsesséances;� unsiteWAP permettantdeconsultersurun téléphonemobilelesmêmesinformations;� enfin un documentPDF donnantl’ébauchede ce qui pourrait être un «Officiel desspectacles»

imprimé.

1.3.1 Siteweb (HTML)

HTML estun langagede balisagedédiéà l’échangede documentssur le Web sousforme de documenthypertextes2 danslesquelscertainsmotsougroupesmots(lesancres) serventd’accèsàd’autresdocumentsHTML, parfoissituéssurd’autressitesweb. L’utilisation desancrespermetde«naviguer» surle Websansmêmeconnaîtresesnotionsdebase(le protocoleHTTP, le systèmed’adressagepardesURL, etc).

Contrairementà XML, HTML fournit un ensemblefixedebalisesauxquellessontattachéesdesfonc-tionnalitésprécisesdeprésentation. L’utilisation desbalisesHTML estdoncavanttout destinéeà donnerdesdirectivesdemiseen formeaunavigateurqui secharged’afficher le document.À l’opposé,l’auteurd’un documentXML définitsonproprevocabulairedebalises,le choixétantguidéparle besoindedécrireaumieuxpossiblela structureet la significationdesdonnées.

Nousreviendronsendétailsurle langageHTML, sesdifférentesversions,etsesrapportsavecXML. IcinousnouscontenteronsdemontrercommentnouspouvonsobteniruneversionHTML denosdocumentsXML par transformationXSLT, encommençantparprendrel’exempletrèssimplede la descriptiond’unfilm. Voici le documentHTML quenousdésironsobtenir.

Exemple6 Vertigo.html: DocumentHTML pour le film Vertigo:

<html><head>

<title>Film: Vertigo</title></head><body bgcolor="white">

<img src="Vertigo.gif" height="220" align="left"></img><h1><i>Vertigo</i></h1> Drame, <i>Etats Unis</i>, 1958

<p> Mis en scène par <b>Alfred Hitchcock</b></p><h3>Résumé</h3>

Scottie Ferguson, ancien inspecteur de

2«HTML » estl’abréviationde«HyperText MarkupLanguage».

Page 22: Comprendre XSLT

22 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

police, est sujet au vertige depuis qu’il a vu mourir soncollègue. Elster, son ami, le charge de surveiller sa femme,Madeleine, ayant des tendances suicidaires. Amoureux de la jeunefemme Scottie ne remarque pas le piège qui se trame autour delui et dont il va être la victime...

</body></html>

Il s’agit,unenouvellefois, d’un arbredontla racineestl’élément � html � , avecdeuxfils : � head �et � body � . Le restedudocumentestdutexte libre, encadrépardesbalisesdemiseenforme.Sansentrerpourl’instantdansle détail,on peut:

� centrerunepartied’un documentenutilisantla balise � center � ;� différencierdifférentsniveauxdetitre desections(balises� h1 � , � h2 � , . . . , � h5 � ) ;� mettredu texteenitalique(balise � i � ) ouengras(balise � b � ) ;� créerdesparagraphes(balise � p � ) ;� incluredesimages(balise � img � ) qui sontstockéesdansdesfichiersexternes.

Ce documentHTML peuttout à fait êtrevu commeun documentXML, avec unestructureimposée(notammentpour la racinede l’arbre et sesdeuxfils), et desnomsde balisefixéespar la normeHTML.En fait HTML s’estdéveloppéindépendammentdeXML et s’avèrebeaucoupmoinsrigoureux.Lesnavi-gateursacceptentparexempledesdocumentssansla racine � html � , et dansdenombreuxcasla balisefermanted’élémentsvidesestconsidéréecommeoptionnelle.Unenormerécente,XHTML, reconsidèreladéfinitiondeHTML commeun «dialecte» XML.

Figure1.4: PageHTML affichéavecNetscape

La figure1.4montrel’affichagedecedocumentdansle navigateurNetscape.On peutvoir quele titredufilm apparaîtencaractèresgrasitaliques,le paysd’origineencaractèresitaliquesetle nomduréalisateurencaractèresgras.Deplusle texteentoureuneimagedel’affiche(versionfrançaise)du film.

Transformations XSLT

Nousallonsutiliserunefeuille destyleXSLT pourproduireautomatiquementle documentHTML àpartird’un documentXML, appelédocumentsourcedansce qui suit. Commec’est la premièrefois quenous

Page 23: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 23

rencontronsce langage,nouscommençonspar une brève introductionpermettantd’en comprendrelesprincipesdebase.

L’application d’une feuille de style XSLT consisteà parcourir les nœudsdu documentXML, et àappliquerdesrèglesde transformationà cesnœuds.La notionderègle(nomméestemplate) estcentraledansXSLT, et la bonnecompréhensiondesaspectssuivantsestessentielle.

� unerègles’appliquetoujoursdansle contextedel’un desnœudsdu documentsource;� l’applicationdela règleconsisteà produireun fragmentdedocument,qui peutcombinerdu texteetdesdonnéesextraitesdudocumentXML.

Voici unpremierexemplederègledetransformationXSLT. Elle consisteàproduireunephrasesimplechaquefois qu’un élément� FILM � estrencontrédansle documentsource.

<xsl:template match="FILM">Ceci est le texte produit par application de cette règle.

</xsl:template>

Onconstatequ’unerègleestunélémentXML définiparlabalisexsl:template . L’attributmatch="FILM"est le motif de sélectionde cettebaliseet indiqueà quel(s)type(s)d’élémentsdu documentXML traités’appliquela règle. La règleci-dessuss’appliqueradonc toujours dansle contexte d’un élémentde typeFILM . Enfin le contenudel’élémentxsl:template estle corpsdela règleet définit le texte produitàchaquefois quela règles’applique.

Un programmeXSLT est en généralconstituéde plusieursrèglesdont chacunepeut s’appliqueràdifférentspartiesd’un documentXML. Chaquerègleproduitunsous-arbrespécifiquequandelle rencontreunélémentdéclencheur, et l’assemblagedecessous-arbresconstituele résultatdela transformation.Dansle casle plussimple,onspécifiedesrèglesdifférentespourchaquetyped’élémentd’un document,commenousl’avonsfait ci-dessuspourl’élément � FILM � dudocumentXML àtransformer. Parfoisladistinctionpar le typedel’élémentpeutêtreinsuffisanteet/outrop imprécisepourchoisir lesrègleset desmotifs desélectionpluscomplexes,quenousprésenteronsplustard,s’avèrentnécessaires.

Le corpsdela règleindiquele texteproduitquandunnœuddubontypeestrencontrédansle documentXML. Dansnotrepremierexemple,le texteproduitesttoujours

Ceci est le texte produit par application de cette règle.

et cequelquesoit le contenudel’élément � FILM � . En pratiquecegenrederèglen’estévidemmentpastrèsintéressante,et on rencontreplus souvent desrèglesoù le texte reprendet réorganisedespartiesdudocumentXML traité.Rappelonsquela règles’appliquedansle contexted’un nœud: le principeconsistealorsà sélectionner, à partir decenœud, lespartiesdu documentqui vont êtreproduitesparla règle.

Prenonsl’exempledu documentXML représentantle film Vertigo. Quandnotrerègles’exécute,lenœudcontexte est l’élément racinede l’arbre. On a accès,depuiscetteracine,à tous les fils du nœud� FILM � , soit les éléments � TITRE � , � AUTEUR� , � ANNEE� , etc., mais aussià d’autresnœudscommeparexemplelesnœudsdescendants(lesfils desfils, etc...)ou lesnœudsparentsetancêtres.

Poursélectionnerle contenud’un élément,on utilise l’élémentXSLT xsl:value-of en indiquantsimplementle chemind’accèsàpartir du nœudcourant.Par exemplele titre du film estobtenupar:

<xsl:value-of select="TITRE"/>

Le fait depréfixer parxsl touteslesbalisesrelevantdu langageXSLT permetauprocesseurdedis-tinguerlesélémentsqui doiventêtresimplementinclusdansle résultat,desélémentsqui correspondentàdesinstructionsXSLT.

La figure 1.5 montrel’interprétationde xsl:value-of , avec sesdeux paramètresdéterminants:le contexte d’exécution,qui est ici l’élément � FILM � , et le chemind’accès,en l’occurrencel’élément� TITRE � , fils del’élément-contexte. Il s’agit ici del’exemplele plussimple– maisaussile pluscourant– où on accèdeauxdescendantsdirectsd’un élément,maisnousverronsquele modededésignationdesélémentsà partir d’un nœudcontexteestbeaucoupplusgénéral.

Page 24: Comprendre XSLT

24 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

FILM

TITRE

Vertigo

AUTEUR

Hitchcock

ANNEE

1958

GENRE

Drame

PAYS

USA

RESUME

Scotty...

select="TITRE"

Contexted’applicationdela règleXSLT

Figure1.5: ExtractiondesinformationsdansunerègleXSLT

Noussommesmaintenanten mesured’enrichir notrepremièrerèglepour produireun premierdocu-mentHTML sommaire,maiscomplet.

<xsl:template match="FILM"><html>

<head><title>Film:

<xsl:value-of select="TITRE"/></title>

</head><body>

Ici je peux mettre d’autres informations sur le film</body>

</html></xsl:template>

L’élément � xsl:value-of select="TITRE"/ � est remplacéà l’exécutionpar la valeur del’élément � TITRE � , soit Vertigo . Appliquéeà Vertigo.xml, cetterègleproduiradoncle résultatsuiv-ant:

<html><head>

<title>Film: Vertigo</title>

</head><body>

Ici je peux mettre d’autres informations sur le film</body>

</html>

Bien entenduon peut appliquerla mêmerègleà tout documentXML ayantla mêmestructurequeVertigo.xml.

Transformation XML - � HTML

Notreobjectifestdoncd’obtenirledocumentHTML del’exemple6 partransformationXSLT dudocumentVertigo.xmlci-dessous.

Exemple7 Vertigo.xml: Le documentXML pour le film Vertigo

Page 25: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 25

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="Film.xsl" type="text/xsl"?><?xml-stylesheet href="FilmWML.xsl" type="text/xsl" media="wap"?><?cocoon-process type="xslt"?>

<FILM><TITRE>Vertigo</TITRE><AUTEUR>Alfred Hitchcock</AUTEUR><ANNEE>1958</ANNEE><GENRE>Drame</GENRE><PAYS>Etats Unis</PAYS><RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet

au vertige depuis qu’il a vu mourir son collègue. Elster, sonami, le charge de surveiller sa femme, Madeleine, ayant destendances suicidaires. Amoureux de la jeune femme Scottie neremarque pas le piège qui se trame autour de lui et dont il vaêtre la victime...

</RESUME></FILM>

Demanièregénéralele résultatestobtenueninsérantdansdesbalisesHTML desextraitsdudocumentXML. Touscesextraits sont facilementaccessiblesà partir de la racine � FILM � , et nousallonsdoncpouvoir nouscontenterd’uneseulerèglequi va«piocher», àpartir dela racine,lesdifférentsconstituantsdécrivantle film, etproduirelesfragmentsHTML appropriés.

La figure1.6illustreceprincipepardeuxarbressuperposés: l’arbresupérieurcorrespondaudocumentXML qui doit êtretransforméenHTML; l’arbre inférieurdéfinit la structurede la pageHTML à générer(pourunemeilleurereprésentation,la racinedel’arbre esten-bas).TouslesnœudssaufseptfeuillessontétiquetéspardesbalisesHTML qui définissentla structuredudocumentproduit.Lesautresnoeudssontdetypexsl:value-of etdéfinissent,pourleurpart,la partiedynamiqueducontenu,obtenueparextractiondecertainsélémentsdudocumentXML. Onpeutnoterquel’élément � TITRE � estréférencétrois fois etquel’ordre desinstructionsdesubstitutionnecorrespondpasàl’ordre desélémentsinsérésdansle résultat.

La règle de transformation,inséréedansune feuille de style complète,créeun documentHTML pourchaquefilm, autrementdit pour chaquedocumentXML ayantla mêmestructurequeVertigo.xml. Soncorpscorrespondà l’arbre inférieurdansla Figure1.6.

Exemple8 Film.xsl: ProgrammedetransformationXSLT correpondantà la Figure1.6.

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="html"/>

<xsl:template match="FILM"><html>

<head><!-- Titre du film --><title>Film: <xsl:value-of select="TITRE"/></title>

</head><body bgcolor="white">

<p><!-- Insérer une image GIF avec le titre comme nom --><img SRC="{TITRE}.gif" align="left" height="220"/><h1>

Page 26: Comprendre XSLT

26 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

FILM

TITRE

Vertigo

AUTEUR

Hitchcock

ANNEE

1958

GENRE

Drame

PAYS

USA

RESUME

Scotty...

xsl:templatematch="FILM"

html

head

title

Film:

xsl:value-of

body

p

img h1

i

xsl:value-of

xsl:value-of i

xsl:value-of

xsl:value-of

p

Mise . . . b

xsl:value-of

h3

Résumé: xsl:value-of

select="T

ITR

E"

select="T

ITR

E"

select="TIT

RE

"

select="G

EN

RE

"

select="PA

YS

"

select="AN

NE

E"

select="AUTEUR" select="RESUME"

Figure1.6: TransformationXSLT

Page 27: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 27

<i><xsl:value-of select="TITRE"/></i></h1>

<!-- Genre, pays, et année du film --><xsl:value-of select="GENRE"/>,<i> <xsl:value-of select="PAYS"/></i>,<xsl:value-of select="ANNEE"/>

</p><p>

<!-- Auteur du film -->Mis en scène par <b><xsl:value-of select="AUTEUR"/></b>

<!-- Résumé du film --><h3>Résumé</h3><xsl:value-of select="RESUME"/>

</p></body>

</html></xsl:template>

</xsl:stylesheet>

UnprogrammeXSL commeceluiprésentéci-dessusestundocumentXML interprétéparunprocesseurXSLT : on peutvérifierquec’estunarbreconstituéd’uneimbricationdebalisesouvranteset fermantes.Ildoit obéir à certainesrèglesde structurationet denommagedesbalises.En particuliertoutesles balisespropresà XSLT doiventêtrepréfixéesparxsl: avecquele processeurpuisselesdistinguerdesbalisesàinsérerdansle résultat.Cepréfixedéfinit un espacedenomqui caractériselesbalisesXSLT.

L’élémentracinedu documentXSLT Film.xsl estdetypexsl:stylesheet et contientdeuxsous-élémentsde type xsl:output et xsl:template . L’élémentxsl:output informe le processeurXSLT quele documentgénéréestun documentHTML conformeà la version4.0 et utilisant le codage“iso-8859-1”.

Cheminscomplexes

Nousprenonsmaintenantl’exemplede la productiondu documentHTML décrivantunesalledecinémapourillustrer la capacitédeXSLT àspécifierdescheminsd’accèscomplexespourextrairedesinformationsd’un documentXML.

Dansle documentHTML montrantunfilm, touslesnœuds� TITRE � , � AUTEUR� etautresauxquelson accédaitétait lesfils (ausensde : descendantsdirects)de l’élément � FILM � tenantlieu decontextede la règle. Le casd’un documentdécrivant unesallede cinémaprésenteunestructureplus riche. Lafigure1.7montrela salle1 denotrecinéma.Si on prendcommecontexted’unerègledetransformationlenœud� SALLE� , on constateque:

� certainesinformations(le numérode la salle, le nombrede places)sont représentéescommedesattributs;� le nœuda troisfils : � FILM � , � REMARQUE� et � SEANCES� ;� les informationsdécrivantle film sontdespetits-filsde � SALLE� : � TITRE � et � AUTEUR� ensontséparéspar � FILM � ;� l’élément � SEANCE� estpetit-filsde � SALLE� , etpeutdeplusêtrerépétéunnombrequelconquedefois ;� enfin l’élément � REMARQUE� estoptionnel: il apparaîtpour la salle1, maispaspour la salle2(voir figure1.3,page19).

Cesnouvellesparticularitésrendentplus complexe l’accèsaux informationspermettantde créerundocumentHTML àpartird’un nœuddetypeSALLE. Gardonspourl’instantle principeden’utiliserqu’une

Page 28: Comprendre XSLT

28 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

15:00 18:00 21:00

Réservationconseilléevaisseau spatial...

PLACES=320chemin "FILM/TITRE"

"REMARQUE"

chemin

chemin

SEANCES/SEANCE

bouclefor-each

chemin "@NO"Contexte d’application de la règle

AUTEUR ANNEE GENRE PAYS RESUME

FILM

SALLE

SEANCES

SEANCE SEANCE SEANCE

REMARQUE

USAAlien Scott Science-Fiction 1979 Près d’un

TITRE

NO=2

Figure1.7: Le documentXML pourla premièresalle

seulerèglefaisantappelàdesxsl:value-of . LespartiesdudocumentSalle1.xmlsontalorsdésignéespar descheminsqui prennenttous leur origine du nœud � Salle � . Voici quelquesexemples,illustrésdansla figure1.7.

� l’attribut d’un élémentestdésignéparla concaténationdusymbole’@’ etdunomdel’attribut ; doncle numérodela salleestdésignéparselect="@NO" ;� le descendantd’un élémentestdésignéendonnantlesnœudssuccessifsrencontrésà chaqueniveaudela branchemenantà l’élément; doncle titre dufilm estdésignéparselect="FILM/TITRE" ;� pour parcourir toutesles occurrencesd’un mêmetype d’élément,on peut effectuerune bouclexsl:for-each surl’ensembledesséancesdésignéesparselect="SEANCES/SEANCE" ;� enfinl’élémentcontexte lui-mêmeestdésignéparle symbole’.’, commedansselect="." .

Voici la règle produisantune présentationHTML et récupérantles informationsen exprimant lescheminsprésentésci-dessus.

<xsl:template match="SALLE"><!-- Extraction d’attribut : no de salle et places --><h2>Salle No <xsl:value-of select="@NO"/></h2><h3>Capacité: <xsl:value-of select="@PLACES"/> places</h3>

<!-- Description du film: tous les chemins commencent par FILM/ --><h3>Film: <a href="{FILM/TITRE}XML.html">

<b> <xsl:value-of select="FILM/TITRE"/></b></a></h3>de <b> <xsl:value-of select="FILM/AUTEUR"/></b><br/><i> <xsl:value-of select="FILM/PAYS"/></i>,

<xsl:value-of select="FILM/ANNEE"/>

<!-- Boucles sur toutes les séances --><h3>Séances</h3>

<ol><xsl:for-each select="SEANCES/SEANCE">

Page 29: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 29

<li> <xsl:value-of select="."/></li></xsl:for-each>

</ol><xsl:for-each select="REMARQUE">

<font color="red"><xsl:value-of select="."/></font></xsl:for-each>

</xsl:template>

L’instruction xsl:for-each permetde créerunebouclepour ajoutertoutesles séanceset remar-quesdansle résultat. La transformationdéfinie par le contenud’un élément � xsl:for-each � nes’appliquepasà l’élémentqui esten coursde transformation(la salle),maisaux élémentssélectionnéspar l’attribut select (les séances).Ainsi, l’instruction � xsl:value-of select="."/ � danslapremièreboucleseraremplacéparle contenudechaqueséanceretrouvée.

Appel de règle

Il resteà ajouterlesbalises� html � , � head � et � body � pourobtenirun documentHTML complet.Jusqu’àprésentnousnoussommesvolontairementlimités à desexemplesde productionsbaséssur uneseulerègle.En pratiqueon estle plussouventamenéà définir plusieurs règlesdansun programmeXSLT,et àdéclencherdesappelsderèglesà partir d’autresrègles.

La règleinitiale s’appliqueengénéralà la racinedu documentXML, désignéepar ’/’. Elle génèreundocumentHTML completavecunélémentracine� html � etdeuxsous-éléments� head � et � title � .Cetterègleestla première règleappliquéepar le processeurXSLT pendantla transformationd’un docu-mentXML.

<xsl:template match="/"><html>

<head><title>Salle: <xsl:value-of select="SALLE/@NO"/></title></head><body bgcolor="white">

<xsl:apply-templates select="SALLE"/></body>

</html></xsl:template>

L’élément� body � necontientqu’unseulsous-élémentquiestuneinstructionXSLT detypexsl:apply-templates . Le processeurXSLT remplacecet élémentpar le résultatde la transformationqu’il dé-clenche.Autrementdit on va appliquerauxéléments� SALLE� fils dela racine’/’ du documentla règlespécifiqueà ce type d’élément,et insérerentreles balises � body � et � /body � le fragmentHTMLproduit.

L’intérprétationdu mécanismed’appelde règlesest donnédansla figure 1.8. La partiesupérieuremontrel’arbreXML, et la partieinférieurelesdeuxrèglesdu programmeXSLT.� La premièrerègle(enbasà gauche)s’appliqueà l’élémentracine,’/’. Elle produitsuccessivement

unélément� html � , racinedel’arbre résultat,puisdeuxfils, � head � et � body � .� Au seindel’élément � body � setrouveuneinstructiond’applicationd’unerègleauxélémentsfilsde l’élémentcourantqui sontde typeSALLE. Le processeurXSLT cherchedoncsi un tel élémentexiste: c’est le caset la deuxièmerègle (en basà droite) estdonc déclenchée.Elle produit desfragmentsHTML qui viennents’insérerdansl’élément � body � .

La figure1.9montrele résultatobtenualors,tel qu’il s’afficheavecNetscape.

Réutilisation de règles

PassonsmaintenantàundernierstadepourcomplétercetteintroductionàXSLT. NousvoulonsproduirelapageHTML récapitulanttout le programmeproposéparL’Épéedebois. La figure1.10montrele résultatobtenu3. Il apparaîtclairementquela présentationde chaquesalleest identiqueà cellequi était obtenue

3Il vasansdire quenousprivilégionsici la simplicitéducode,audétrimentdela qualitédeprésentation.

Page 30: Comprendre XSLT

30 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

TITRE AUTEUR ANNEE GENRE PAYS RESUME

SEANCESFILM

SALLE

SEANCE

<xsl:template match="SALLE">

Vertigo 1958Hitchcock Scotty...USA1958 22:00

Transfrom

ation de <S

ALLE

>

sele

ct=

"SA

LLE

"

<xsl:template match="/">

...

...

Transfroam

tion du document (racine)

PLACES="120"

html

xsl:value-of xsl:value-of

h3h2

xsl:apply-templates

bodyhead

/

"Salle No" "Capacité:" "places"

NO="2"

Figure1.8: Appel derèglesà partir d’autresrègles

parapplicationdela règledestinéeàprésenterunesalleindividuelle.Pour créerla présentationd’un cinéma,nousallons donc reprendrela règleexistantede traitement

des élémentsSALLE, et déclencherson application. On utilise pour cela un élémentxsl:apply-template . Voici toutd’abordla règles’appliquantà l’élémentracinedudocumentXML.

<xsl:template match="/"><html>

<head><title>Programme de <xsl:value-of select="CINEMA/NOM"/></title>

</head><body bgcolor="white">

<xsl:apply-templates select="CINEMA"/></body>

</html></xsl:template>

La seconderègled’appliquedansle contexte d’un élément � CINEMA� . Elle extrait desinforma-tions relativesau cinéma,et propagela productionde codeHTML parun nouvel appelà xsl:apply-templates .

<xsl:template match="CINEMA"><h1><i> <xsl:value-of select="NOM"/> </i></h1><hr/> <xsl:value-of select="ADRESSE"/>,<i>Métro: </i> <xsl:value-of select="METRO"/><hr/>

Page 31: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 31

Figure1.9: Copieécrandu résultatdela transformationdeSalle1.xml

<xsl:apply-templates select="SALLE"/>

</xsl:template>

Cedernierappeldéclenchela règlerelative auxsalles,pourtousleséléments� SALLE� qui sontfilsdel’élement � CINEMA� . Nousneredonnonspascettedernièrerègle.

L’application de chaquerègle engendreun fragmentd’arbre HTML, et tout appel xsl:apply-templates insèredansce fragmentun ou plusieurssous-arbres.La figure1.11montre(partiellement)l’arbrefinal HTML obtenu,endistinguantlespartiesissuesdechacunedestrois règlesimpliquéesdanslatransformation.

1. la premièrerègle,appliquéeà la racinedu documentXML, produit un «squelette» de documentHTML, avec les trois balises � html � , � head � et � body � indispensables,puis elle passelamainà la règles’appliquantauxélémentsdetypeCINEMA;

2. la seconderègleproduit les informationsglobalessurun cinéma,puisdéclenchel’applicationdelarègleauxéléments� SALLE� ;

3. enfin la troisièmerègles’appliqueaux deuxéléments� SALLE� présentsdansla descriptionducinémaL’Épéedebois, etproduit lesdeuxsous-arbresHTML décrivantcesdeuxsalles.

Un programmeXSLT peut donc être vu commel’application successive d’un ensemblede règles,chacuneconcourantà la créationdu résultatfinal par«assemblage» defragmentsqui viennents’associerpour former unehiérarchie.Dansla copied’écrandu résultatde la transformation(figure 1.10)on peutclairementdistinguerla partiecrééeparla règledetransformationpourlessalles,reproduisantunmotif deprésentationidentiquepourchaqueélément� SALLE� rencontré.

1.3.2 SiteWAP (WML)

Passonsmaintenantà la créationd’une représentationpermettantde consulterles séancesà partir d’untéléphonemobile,enpartantdu mêmedocumentXML décrivantlesséancesà«L’Epéedebois».

Publication WAP (WML)

Le langageutilisé pourspécifierl’affichagesurun mobileestWML. Il s’agit d’un «dialecte», ou spécial-isationdeXML, qui sebasesurunensembledenomsd’élémentset définit leur signification.

Page 32: Comprendre XSLT

32 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Figure1.10:La paged’accueildeL’Épéedebois

Un documentWML est un arbreavec pour racineun élément � wml � (de mêmequ’un documentHTML estunarbreavecpourracinel’élément � html � ), maisil estdiviséensous-éléments,les«cartes»,définisantl’unité d’affichagesurl’écrandumobile.Lescartesd’unmêmedocumentpeuventêtreliéesentreellespardesliens,cequi permetà l’utilisateurdenaviguergrâceauxboutonsdesontéléphone.

Un exemplededocumentWML comprenantuneseulecarteestdonnéci-dessous,aveclesinformationssurle film Alien. TouteslesbalisesWML sontenminuscules,et toutessonttrèsconcisesafin delimiter lecoûtdestransfertsdedocuments.

Exemple9 Alien.wml: Un documentWML

<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML1.1//EN"

"http://www.wapforum.org/DTD/wml_1.1.xml" ><wml>

<card><p><b>Alien</b>, 1979, Ridley Scott<br/>Près d&apos;un vaisseau spatial échoué sur une lointaineplanète, des Terriens en mission découvrent de bien étranges&quot;oeufs&quot;. Ils en ramènent un à bord, ignorantqu&apos;ils viennent d&apos;introduire parmi eux un huitièmepassager particulièrement féroce et meurtrier. </p>

</card></wml>

Unecarteestorganiséeenparagraphesgrâceàlabalise� p � , avecaumoinsunparagrapheparcarte,cequi estle casdansl’exempleci-dessus.Quelquesautresbalises,reprisesdeHTML, peuventêtreutilisées

Page 33: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 33

Règle "/"

Règle "CINEMA"Règle "SALLE"

html

head

h1

i

hr adresse p

h2 h3

Salle No 2 Film : VertigoFilm: Alien

p

Salle No 1

h2 h3

body

title

Epée de bois

Figure1.11:L’arbreHTML, résultatdela transformationXSLT

pourdéfinirunemiseenpage(limitée)dutextesurl’écrandumobile: la balise � b � affichele contenudel’élémentengras,et la balise � br � permetdepasserà la ligne. La figure1.12montrel’affichageobtenudansun téléphoneNokia 6150.

VoyonsmaintenantcommentobtenircettereprésentationWML àpartir dudocumentAlien.xml, donnéci-dessous.

Exemple10 Alien.xml: DocumentXML pour le film Alien

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="FilmWML.xsl" type="text/xsl" media="wap"?><?cocoon-process type="xslt"?>

<FILM><TITRE>Alien</TITRE><AUTEUR>Ridley Scott</AUTEUR><ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE><PAYS>Etats Unis</PAYS><RESUME>Près d’un vaisseau spatial échoué sur une lointaine

planète, des Terriens en mission découvrent de bien étranges"oeufs". Ils en ramènent un à bord, ignorant qu’ils viennentd’introduire parmi eux un huitième passager particulièrementféroce et meurtrier.

</RESUME></FILM>

Nousallonssimplementutiliser deuxrègles.Unepremièrerègle,d’initialisation, créele «squelette»dudocumentrésultat,soit l’équivalentpourWML dela structure� html � , � head � , � body � quenousavonsutiliséepourHTML. Celaconsiste:

� àouvrir, puisrefermerla baliseprincipale � wml � ;

� àdéclencher, dansla baliseprincipale,unappelauxautresrègles.

Voici cettepremièrerègle.

Page 34: Comprendre XSLT

34 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Figure1.12:L’affichagedela cartedel’exemple9

<xsl:template match="/"><wml>

<xsl:apply-templates/></wml>

</xsl:template>

La seconderègles’appliqueà un élémentde type � FILM � . Cetterègleproduit unecarteWML, etplacedanscettecarteun extrait desélémentsconstituantla descriptiondu film, à savoir le titre, l’année,l’auteuret le résumé.Notonsquel’ordre danslequelon utilisecesélémentspeutêtretotalementreconsid-éréparrapportà celui du documentXML initial.

<xsl:template match="FILM"><card>

<p><b> <xsl:value-of select="TITRE"/></b>,

<xsl:value-of select="ANNEE"/>,<xsl:value-of select="AUTEUR"/><br/><xsl:value-of select="RESUME"/><br/>

</p></card>

</xsl:template>

Voici finalementla feuille destylecomplète.Il va sansdire qu’elle s’appliqueà tout documentXMLdontla structureestidentifiqueà celledeAlien.xml, parexempleVertigo.xml(voir page24).

Exemple11 FilmWML.xsl: La feuilleXSLT créantuneversionWML

Page 35: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 35

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/ Transf orm">

<xsl:output encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:processing-instruction name="cocoon-format">

type="text/wml"</xsl:processing-instruction>

<wml><xsl:apply-templates/>

</wml></xsl:template>

<xsl:template match="FILM"><card>

<p><b> <xsl:value-of select="TITRE"/></b>,

<xsl:value-of select="ANNEE"/>,<xsl:value-of select="AUTEUR"/><br/><xsl:value-of select="RESUME"/><br/>

</p></card>

</xsl:template>

</xsl:stylesheet>

L’applicationdecettefeuille destylepermetd’obtenirle documentdel’exemple9, et doncl’affichagedela figure1.12.

Création d’un site WAP

Nouspouvonsmaintenant,àpartirdenotredocumentXML décrivantL’Epéedebois, créerunensembledecartespermettantdechoisirla salleet le film, deconsulterlesséancespourcettesalle,etenfind’afficherlesinformationsdétailléessurle film. La structuredudocumentWML résultatestdonnéedansla figure1.13.Il contientcinqéléments� card � : un pourle menud’accueil,montrantlessallesdeL’Epéedeboiset lefilm qui y estprojeté,deuxcartespourlesdeuxsalles,enfindeuxcartesdonnantdesdétailssurlesfilms.

Pourpermettrela navigationdanscedocument,chaquecartedoit êtreidentifiéeparla valeur– uniqueau seindu documentWML – de l’attribut id dansla balise � card � . La figure1.13montreles id dechaquecarte: index , S1, S2, Alien etVertigo . Pourcréerunlien versunecarte,onutiliseenWML,commeen HTML, la balise � a � . Voici par exemplel’élémentWML permettantde référencerla cartedécrivantAlien:

<a href="#Alien">lien vers le film Alien</a>

En sepositionnantsur le texte tenantlieu de lien, l’utilisateur peutafficher la cartecorrespondante.Les flèchesen tiretéssur la figure indiquentla navigation entreles cartes: de l’index (affichagedanslafigure1.14,à gauche),on peutserendresurunesalle(affichagedansla figure1.14,aucentre),puisd’unesallesurle film projetédansla salle(figure1.14,à droite).

Voici maintenantquelquesdétailssur la feuille XSLT permettantde produirele documentWML. Larègled’initialisationprocèdecommeprécédemment,enproduisantunélément� wml � , puiselledéclenchetroisautresrègles,correspondantrespectivementauxtroistypesdecartes: listedessalles,listedesséances,affichagedu film. Voici cettepremièrerègle.

<xsl:template match="/">

Page 36: Comprendre XSLT

36 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

card card

pp

a

a

card card card

p p p

wml

a a

id=index id=S1

href=S1

href=S2

id=S2 id=Alien id=Vertigo

href=Vertigohref=Alien

Figure1.13:L’arbreXML du siteWAP

<wml><!-- création de la carte d’accueil --><xsl:apply-templates select="CINEMA"/>

<!-- création des cartes pour les salles et séances --><xsl:apply-templates select="CINEMA/SALLE"/>

<!-- création des cartes pour les films --><xsl:apply-templates select=".//FILM"/>

</wml>

Rappelonscommenton désignele chemind’accèsauxélémentsauxquelson appliquedesrègles.Leprincipetientendeuxpoints:

1. prendreencomptela positioncourantedansl’arbre;

2. indiquerle cheminà suivre dansl’arbre,à partir dela positioncourante, pouratteindrel’élémentàtraiter.

Ici la positioncourante(autrementdit à laquellela règlecourantes’applique)est la racinedu docu-ment,dénotée«/ ». On veut traiter trois typesd’éléments,� CINEMA� , pour produirela carted’index,� SALLE� , pour produirela cartedonnantles séances,et � FILM � pour produirela cartedonnantladescriptiondechaquefilm.

Étantdonnéela positioncourantesituéeà la racine,et la positiondecesélémentsdansl’arbreXML, ladésignationdecesélémentssefait detroismanièresdifférentes:

1. l’élément � CINEMA� estunfils dela positioncourante: on le désignesimplementparCINEMA;

2. lesélémentsdetypeSALLEsontpetit-filsdela positioncourante,aveccommeniveauintermédiaire� CINEMA� : on lesdésigneparCINEMA/SALLE qui indiquele cheminà parcourir;

3. enfin les élémentsde type FILM sont arrière-petit-filsde la position courante; on pourrait lesdésignerparCINEMA/SALLE/FILM ,maisonutiliseici unmoyenplusgénéral: .//FILM désignetouslesélémentsdescendantdela positioncourante,quelquesoit leur niveau,nommés� FILM � .

Un part importantede la programmationXSLT consisteà savoir désigner, à partir d’un nœudcourantdansl’arbre XML, les élémentsauxquelson veut appliquerdesrèglesde transformation.Les quelquesexemplesdonnésci-dessuscorrespondentàdescasrestreint,et font notammentl’hypothèsequele chemin

Page 37: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 37

Figure1.14:Un téléphonemobileaveccarteWML

d’accèsà un élémentsefait en descendantdansl’arbre. Nousverronsquele langageestbeaucoupplusgénéral.

Il resteà créerunerèglepourchacundestypesdecarte.Voici la règle,déclenchéesurlesélémentsdetypeCINEMA, qui produit la carteaffichantla listedessalles.

<xsl:template match="CINEMA"><card id="index" title="Programme">

<p align="center"><xsl:value-of select="NOM"/>

</p><xsl:for-each select="SALLE">

<p> <a href="#S{@NO}">Salle <xsl:value-of select="@NO"/>:

</a><xsl:value-of select="FILM/TITRE"/>

</p></xsl:for-each>

</card></xsl:template>

Rappelonsquetoutcequi necommencepasparxsl: , indiquantlestypesd’élémentspropresàXSLT,estconsidérécommedu texte et inclus dansle résultat. Pourun cinéma,on va afficher avec unebouclexsl:for-each un paragraphe(élementdetypep) pourchaquesalle. Ceparagraphecontientl’intitulédela salle,etsertégalementd’ancre(élément� a � ) versla cartedétaillantlesséancesdela salle.La carted’unesalleestréférencéepar#S� où � estle numérode la salle,présentdansl’attribut NO. AvecXSLT,on créecetidentifiantavecl’expression#S{@NO}.

Page 38: Comprendre XSLT

38 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Voici maintenantla règleservantà produirelescartesdessalles.Notezquechaquecartecomprendunattribut id ayantpourvaleurS� où � estle numérodela salle.On insèreuneancreversla cartedétaillantle film diffusédansla salle.

<xsl:template match="SALLE"><card id="S{@NO}">

<p>Séances salle <xsl:value-of select="@NO"/></p><p>

<a href="#{FILM/TITRE}">Film : <xsl:value-of select="FILM/TITRE"/>

</a></p>

<xsl:apply-templates select="SEANCES"/></card>

</xsl:template>

Enfin la règleproduisantla cartedesfilms est identiqueà celle quenousavonsdéjàétudiée(exem-ple11).

1.3.3 Documentpapier (PDF)

Chaquetypededocumenta descontraintesspécifiques– affichage,moded’utilisation – définiesparsoninterfaceutilisateur. L’auteurdoit prendreencomptela taille dela fenêtred’affichage,la couleurdespages,la couleuret la taille descaractères,la possibilité– ounon– d’effectuerundéfilement,etc.Cescritèressonttrèsstrictsparexemplepourun téléphoneportabledont l’écranesttrèspetit et lesmanipulationslimitéesparun clavier réduità unequinzainedetouches.

La créationd’un documentdestinéà l’impressionestessentiellementdifférentede ceuxdestinésauWeb et constitueun changementradicaldesupport.UnepageHTML estaffichéesur un écraninforma-tiqueet doit avoir unetaille limitée, approximativementégaleà la taille de l’écran. De plus la lecturededocumentsHTML n’est pasfondéesur un parcourslinéaire,de basen hautet de gaucheà droite, maissur une«navigation» définiepar le hyper-liens. Par contraste,un documentpapierestorganiséen uneséquencedepages,avecunordredelectureséquentielle.Enconséquence,quandonimprimeundocumentHTML, le résultatestsouventinsatisfaisant.Nouscomplétonscetteprésentationdel’utilisation deXSLTpour la transformationdedocumentsXML avec la productiondedocumentspapiergrâceaux formattingobjects.

Les formattingobjects

Le processusdepublicationpermettantdecontrôlerle résultatet la qualitédel’impressiond’un documentXML s’effectueendeuxétapes(figure1.15):

1. L’étapede transformationpermetde revoir complétementla structuredu documentXML en ap-pliquantdesrèglesde transformation.Les élémentsd’origine peuventêtreremplacéspar d’autreséléments,déplacés,effacés,et de nouveauxélémentspeuventêtreinsérés.On obtientun nouveaudocument.

2. L’étapedemiseenforme(formattingenanglais)estappliquéeaprèsla transformationpourobtenirun documentfinal adaptéausupportdepublication.Dansle casd’un documentpapier, la miseenformeprendencomptela taille despages,lesmargesà respecter, la taille et le poidsdescaractères,l’alignementdu texte, l’espaceentrelesparagraphes,l’en-têteet le pieddepage,etc.

La recommendationXSL proposeun vocabulairede balisesXML, connusousle nom XSL-FO (FOest un acronyme pour formatting objects), qui permetla spécificationprécisedes caractéristiquesty-pographiquesd’un document. Un documentXSL-FO est un documentXML qui peut être utilisé pardifférentesapplicationspourgénérerundocumentdansunformatd’impressioncommePostscriptouPDF.Voici unpremierdocumentXSL-FO:

Page 39: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 39

Document XSL-FO Document PDFDocument XML

� � � �� � � �� � � �� � � � � � �� � �

� � �� � �� � � �� � � �� � � �

� � �� � �� � �� � �� � �� � �� � �� � �

������������������������������������������������ � � �� � �� � �� � �� � �� � �� � �� � �

� � �� � �� � �� � �� � ���������������������������������������������������������

� � �� � �� �� � � � �� � �� �� �

� � � �� � � �

Transformation Mise en Forme

Figure1.15:Transformationet Mise enForme

Exemple12 SimpleFO.xml: Un documentXSL-FOsimple

<?xml version="1.0" encoding="iso-8859-1"?><fo:root xmlns:fo="http://www.w3.org/1999/XSL/Forma t">

<fo:layout-master-set><fo:simple-page-master master-name="page"

page-height="29.7cm" page-width="21cm"><fo:region-body

margin-top="2cm" margin-bottom="2.5cm"margin-left="2.5cm" margin-right="2.5cm"/>

</fo:simple-page-master><fo:page-sequence-master master-name="simple" >

<fo:single-page-master-reference master-name="page" /></fo:page-sequence-master>

</fo:layout-master-set><fo:page-sequence master-name=’simple’>

<fo:flow flow-name=’xsl-region-body’ font-size="20pt"><fo:block>

Ceci est le premier paragraphe,</fo:block><fo:block space-before="20pt" font-size="10pt">

et ceci est le deuxième.</fo:block>

</fo:flow></fo:page-sequence>

</fo:root>

Ce documentdébute par quelquesélémentsqui indiquentles propriétésglobalesde la miseen pagesouhaitée.Sansentrerdansle détaildechaquebaliseutilisée,on trouve:

! l’élément " fo:simple-page-master # quidéfinitladimension(page-height="29.7cm" ,page-width="21cm" ) despages;! l’élément " fo:region-body # qui fixe l’espaceentrela «région» du contenuet les bordsdechaquepage(margin-top="2cm" , margin-bottom="2.5cm" , . . . ) ;! l’élément " fo:page-sequence-master # qui estutilisépourdéfinir la structuredudocument(parexemple: unetabledesmatières,deschapitres,un index, etc);! enfin l’élément " fo:block # qui défini desparagraphesavec l’espacede séparation(space-before=”20pt” et la taille descaractères(font-size=”10pt” ).

Page 40: Comprendre XSLT

40 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Lesélémentsqui suiventcorrespondentaucontenududocument.Cederniercontientdeuxparagraphes(élémentsdetypefo:block ) dontledeuxièmeestséparédupremierparunespacede20points(space-before="20pt" ). La taille descaractèresestaussi20 pointspardéfaut(font-size="20pt" dans" fo:flow # ) saufpourle deuxièmeparagraphe,où la taille descaractèresestlimité à10 points.

Le documentobtenupeutmaintenantêtretransmisà un processeurXSL qui va sechargerdeproduireuneréalisationconcrète.Nousutilisons le processeurFOPqui produit desdocumentsPDF: il va nouspermettred’engendreruneversionimprimabledu programmedeL’Épéedebois.

Le programmede L’Épéedebois

OnpeutmaintenantinsérerlesinformationsconcernantnotrecinémaEpéedebois. Pourcelaonvadéfinirdeuxrèglesdetransformation.La premièremetenformele nomet l’adressedu cinéma.

<xsl:template match="CINEMA"><fo:block text-align="center">

<fo:block font-size="40pt" font-weight="bold" space-after="20pt"><!-- Sélection du nom du cinema --><xsl:value-of select="NOM"/>

</fo:block><!-- Sélection de l’adresse du cinema --><xsl:value-of select="ADRESSE"/><!-- Sélection du métro près du cinema -->(<xsl:value-of select="METRO"/>)</fo:block><fo:block space-before="20pt"><!-- Transformer chaque salle --><xsl:apply-templates select="SALLE"/>

</fo:block></xsl:template>

Le nom du cinémaet son adressesont dessous-blocsd’un bloc spécifiantque le texte seracentré(attribut text-align="center" ). Le nomdu cinémaestécrit en caractèresgrasde 40 points,suivide l’adresseet de la stationde métro. Pour afficher les séances,la règlesuivanteestappelée(élément" xsl:apply-templates select="SALLE"/ # ) :

<xsl:template match="SALLE"><fo:block text-align="center" space-before="40pt">

<fo:inline font-weight="bold" font-size="26pt"><!-- Sélection du titre du film --><xsl:value-of select="FILM/TITRE"/>

</fo:inline> de<fo:inline font-style="italic">

<!-- Sélection de l’auteur du film --><xsl:value-of select="FILM/AUTEUR"/>

</fo:inline><fo:block space-before="5pt">

<!-- Sélection de l’année et du pays du film -->(<xsl:value-of select="FILM/PAYS"/>,

<xsl:value-of select="FILM/ANNEE"/>)</fo:block>

</fo:block><fo:block space-before="10pt">

<!-- Sélection du résumé du film --><xsl:value-of select="FILM/RESUME"/>

</fo:block><fo:block space-before="10pt">

<fo:inline font-weight="bold"><!-- Sélection du numéro de salle -->

Page 41: Comprendre XSLT

1.3. PUBLICATION DE DONNÉESAVEC XSLT 41

21cm

29

.7cm

2cm

2.5

cm

2.5

cm

2.5cm

26pt, gras 20pt, italique

40pt, gras

20pt

Figure1.16:Mise enFormeavecXSL-FO

Salle <xsl:value-of select="@NO"/></fo:inline>(<xsl:value-of select="@PLACES"/> places) :<!-- Sélection des séances --><xsl:for-each select="SEANCES/SEANCE">

<xsl:value-of select="."/> -</xsl:for-each><!-- Sélection de la remarque --><xsl:value-of select="REMARQUE"/>

</fo:block></xsl:template>

Cesdeuxrègleseffectuentsimultanémentla transformationde la structuredu documentXML et lamiseen forme du résultatsousforme d’un documentXSL-FO. Le documentXSL-FO peutensuiteêtretransforméparun transformateuradaptéXSL-FO$ PDF, avecle résultatdela figure1.16.

En résumé,à partir d’un mêmedocumentXML, noussommesen mesurede produireavec un seullangagedesreprésentationstrèsdiverses.

Page 42: Comprendre XSLT

42 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

1.4 Échangeet intégration de donnéesenXML

La technologieXML n’estpaslimitéeà la générationdepagesweb(HTML, WAP) oud’autresdocumentsplus traditionels.Par sacapacitédereprésenterdesdonnéestrèsdiverses,XML a rapidementétépromucommeformatuniverselpourl’échangededonnéesentredifféréntesapplicationsinformatiques.

Danscettesectionnousdécrivonsl’utilisation de XML commeinterfaceentreplusieursapplicationssouhaitantéchangerdesdonnées.Notreexempleva montrerl’intérêt deXML commeformat d’échangeentreserveursweb,maisil s’extrapolefacilementà l’utilisation deXML pouréchangerdesinformationssousformedemessagesentredesapplicationsréparties.

Nousmettonsplus l’accentsur le processusde transformationimpliquédansceséchangesquesur latransmissiondesdonnéesqui estliéeà l’infrastructureclient-serveuretauxprotocolesdecommunication4.

1.4.1 Exemple: Le Sitewww.sallesenligne.com

L’utilisation deXML commeformatd’échangeestillustréeparun sitewebqui récupèredesinformationssur lesprogrammesde cinémadisponiblessur différentssiteslocaux,les intègreet fournit un moteurderecherche.La Figure1.17montrele site www.sallesenligne.com, relié à de nombreuxsiteslocauxdontdeux,www.cine-marseilleetwww.epee-de-bois.fr, sontreprésentés.

réponse

requête

www.sallesenligne.fr

www.cine-marseille.fr

www.epée-de-bois.fr

Figure1.17:Échangesdedonnéesdu sitewww.sallesenligne.com

Le moteurde recherchesur les séancesde cinémasebasesur le titre du film, le début de la séanceet la ville. L’utilisateur remplit un formulaire avec les critèresdésiréset obtient une liste desséancescorrespondantesavecdesliensverslessiteslocaux(Figure1.18).

Le sitewww.sallesenligne.comoffre doncunevaleurajoutéeauxinformationsdéjàexistantesauniveaudechaquesiteélémentaire.Encontrepartie,il demandequelesinformationsnécessairesà la rechercheluisoientfourniessousun formatXML imposédontvoici un exemple:

<FILM><TITRE>Vertigo</TITRE><CINEMA>Epée de Bois</CINEMA><VILLE>Paris</VILLE><URL>www.epée-de-bois.fr/ExCinema1.xm l</URL ><HEURE>22:00</HEURE>

</FILM>

À part le titre, le cinéma,la ville et les heuresde projection,l’élément " FILM # contientun sous-élémentde type URLavec l’adressede la pageweb du cinéma.Cesinformationsformentun résumédetoutescellesdisponiblesau niveaudu site d’un cinéma,et ellessontde plus représentéesdifféremment,aussibien au niveaude la structuredesdocumentsquedu nom desbalisesutilisées. Le but estdoncde

4Différentschoix techniquespossiblespourlesaspectsd’échangeet decommunicationserontétudiésà la fin decelivre.

Page 43: Comprendre XSLT

1.4. ÉCHANGEET INTÉGRATION DE DONNÉESEN XML 43

Figure1.18:Formulairedesaisieetpagerésultatfourni parle moteurderecherche

convertir le documentXML pourchaquecinémaversla structuredéfiniepour le moteurderecherche,detransférercetteconversionverswww.sallesenligne.comet enfin d’assemblertouscesfragmentsdansunseuldocumentsurlequels’effectuerontlesopérationsderecherche.

1.4.2 Description de la structure d’un documentXML

Pour écrire un programmede transformation,il faut connaîtrela structuredu documentà transformer,maiségalementla structuredu documentà engendrer. Commedanslesexemplessur la publication,où lastructuredurésultatd’unetransformationdevait êtreconformeaux«formats» HTML, WML ouXSL-FO,l’information exploitéeparle moteurderecherchedoit « ressembler» à la structuredel’élément " FILM #précédent.

En l’occurrence,le serveurcentralveutacquérirdesélémentsde typeFILM , avecdessous-élémentsdetypeTITRE , CINEMA, VILLE , URLetHEURE. Chaquesous-élémentn’apparaîtqu’uneseulefois sauflessous-élémentsdetypeHEURE.

Cettedescriptioninformelledela structuredesdocumentsXML échangéspeutêtreutilisé pourécrireunprogrammeXSLT qui génèredes«résumés» à partir desdocumentsstockéessurlessiteslocaux.Pouréviterlesmalentendusetambiguitésqui sontpossiblesdansun langagenaturel,il existedeslangagesplusformelspour décrirela structured’un documentXML. Nousintroduisonsci-dessousla méthodela plusrépandueà l’heureactuellepourdéfinir destypesdedocuments: lesdocumenttypedefinitionou DTD.

DansuneDTD, la structured’un documentXML estspécifiéeparla descriptionstructurelledestypesd’éléments.Ainsi, à traversuneDTD, un élémentn’estplusseulementcaractériséparle nomdela balise,maiségalementparla structuredesoncontenu.Par exemple,l’expression

<!ELEMENT TITRE ( #PCDATA ) >

indiquequele contenu(aussiappelémodèlede contenu) d’un élémentde typeTITRE estunechaînedecaractères(#PCDATA), commelesélémentsdetypeTITRE , CINEMA, VILLE , URLetHEURE.

Le contenudesélémentsdetypeFILM estdéfiniparuneexpressionpluscomplexe:

<!ELEMENT FILM (TITRE, CINEMA, VILLE, URL?, HEURE+)

Cetteexpressionindiquequelecontenud’unélément" FILM # estconstituéd’unesuccessiond’élémentsdontlestypesrespectifssontTITRE , CINEMA, VILLE , URLetHEURE. Laséparationdesnomsd’élémentspardesvirgulessignifiequel’ordre desélémentsestfixé etdoit correspondreà la séquenceindiquée.Tousles typesd’élémentsne peuvent apparaîtrequ’une seulefois commefils d’un élément " FILM # , saufl’élémentdetypeURLqui estoptionel(cequi estindiquéparle symbol?) et lesélémentsdetypeHEUREqui peuvent apparaîtreplusieursfois (indiquépar le symbole+ aprèsHEURE). Voici la DTD complète,spécifiantlesinformationsacceptéesparle moteurderecherche:

Page 44: Comprendre XSLT

44 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Exemple13 Echange.dtd: DTD desdocumentsacceptéspar le moteurderecherche.

<!ELEMENT FILM ( TITRE, CINEMA, VILLE,URL?, HEURE+) >

<!ELEMENT TITRE ( #PCDATA ) ><!ELEMENT CINEMA ( #PCDATA ) ><!ELEMENT VILLE ( #PCDATA ) ><!ELEMENT URL ( #PCDATA ) ><!ELEMENT HEURE ( #PCDATA ) >

Il estpossibled’indiquer, dansl’en-têted’un documentXML, à quelleDTD seconformele contenudu document. Cette information, quoiquenon obligatoire,est très importantecar elle définit la classedesapplicationsqui vont pouvoir interpréteret traiter le document.Réciproquement,uneapplication(parexemple: un navigateur)estconçuepour traiter la classede tousles documentsXML conformesà uneDTD donnée(parexemplela DTD HTML).

Unefeuille destylepeutégalementêtreconsidéréecommeun programmedédiéà uneDTD. C’estcequenousavonsexprimé– demanièrepeuprécise– ensignalantqu’un programmedetransformationdudocumentAlien.xmls’appliqueégalementà Vertigo.xml. De plus,si le résultatesttoujoursun documentXML conformeàuneautreDTD, un programmeXSLT peutêtrevu commeuneconversiondedocumentsXML entredeuxstructuresbiendéfinies.

Les exemplesde publicationsquenousavonsdécrits(HTML, WML, XSL-FO) étaientconformesàce cadre,puisquepour chacunde ceslangagesil existe uneDTD. Maintenant,XML étantun langageeXtensible, chacunpeutdéfinir sapropreDTD, et la publicationXSLT s’étendà la miseenformedenosdonnéesafin qu’ellessoientreconnueset traitéespar quelqu’und’autre. Le casquenoustraitonsn’estdoncqu’unegénéralisationnaturelled’uneproblématiquedepublicationqui selimiterait àHTML, ouauxquelqueslangageslargementdiffusés.

1.4.3 Transformation et échangede données

L’application– le sitecentral– traitedesdocumentsconformesà la DTD Echange.dtd, et lesintègredansuneliste formantun index detouteslesséancesdecinémas.La structuredecedocumentesttrèssimple:l’élémentracinede type MOTEURcontientun sous-élément" FILM # pour chaquefilm projetédansuncinéma.Notezdansl’en-têtela référenceà la DTD Moteur.dtdqui décrit la structuredu document.

Exemple14 Moteur.xml: DocumentXML interrogépar le moteurderecherche

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="MoteurCherche.xsl" type="text/xsl"?><?cocoon-process type="xslt"?>

<MOTEUR><FILM>

<TITRE>Alien</TITRE><CINEMA>Epée de bois</CINEMA><VILLE>Paris</VILLE><URL>www.epée-de-bois.fr/ExCinema1.xml</U RL><HEURE>15:00</HEURE><HEURE>18:00</HEURE><HEURE>21:00</HEURE>

</FILM><FILM>

<TITRE>Vertigo</TITRE><CINEMA>Epée de bois</CINEMA><VILLE>Paris</VILLE><URL>www.epée-de-bois.fr/ExCinema1.xml</U RL><HEURE>22:00</HEURE>

Page 45: Comprendre XSLT

1.4. ÉCHANGEET INTÉGRATION DE DONNÉESEN XML 45

</FILM></MOTEUR>

Afin d’obtenir un résumédu documentEpeeDeBois.xmlqui puisseêtre intégrédansle moteurderecherche,il resteà lui appliquerunetransformationà l’aide dela feuille destylesuivante.

Exemple15 Echange.xsl: TransformationXSLT pour échangededonnées.

<?xml version="1.0" encoding="iso-8859-1" ?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml"/><xsl:output encoding="iso-8859-1"/>

<xsl:template match="/"><xsl:for-each select=’CINEMA/SALLE’>

<FILM><TITRE><xsl:value-of select=’FILM/TITRE’/></TITRE><CINEMA><xsl:value-of select=’../NOM’/></CINEMA><VILLE>Paris</VILLE><URL>www.epée-de-bois.fr/ExCinema1.xm l</URL ><xsl:for-each select=’SEANCES/SEANCE’>

<HEURE><xsl:value-of select=’.’/></HEURE></xsl:for-each>

</FILM></xsl:for-each>

</xsl:template></xsl:stylesheet>

Le mécanismedetransformationdevrait maintenantêtreclair pour le lecteur. Notonsquecettetrans-formationpeutintervenir soit auniveaudechaquecinéma,qui fait alorsl’ef fort defournir un programmede transformationde sesdonnéesen escomptanten tirer profit, soit au niveaudu moteurde recherchelui-même.

1.4.4 Un moteur de rechercheXML/XSL T

Pourconclurecetexemple,nousallonsdécrirel’implantationd’un petit moteurderecherchepourtrouverdesséancesdecinémadansundocumentXML. NoussupposonsquetouteslesinformationssontstockéesdansMoteur.xml.

Exemple16 MoteurHTML.xsl: ProgrammeXSLT pour publier touteslesséancesdansMoteur.xml.

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="html"/><xsl:template match="/">

<html><head> <title>Résultat de la recherche</title> </head><body bgcolor="white">

<h1>Résultat de la recherche</h1><xsl:apply-templates select=’MOTEUR’/>

</body></html>

</xsl:template>

<xsl:template match="MOTEUR"><xsl:for-each select="FILM">

<xsl:apply-templates select="." /><p/>

Page 46: Comprendre XSLT

46 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

</xsl:for-each></xsl:template>

<xsl:template match="FILM">Ville: <i> <xsl:value-of select="VILLE"/> </i><br/>Cinéma: <A HREF=’http://{URL}’>

<xsl:value-of select="CINEMA"/> </A> <br/>Film: <xsl:value-of select="TITRE"/> <br/>Séances:

<xsl:for-each select="HEURE"><xsl:value-of select="."/> -

</xsl:for-each></xsl:template></xsl:stylesheet>

Ce programmepublie toutesles séancessousforme d’un documentHTML. Il peut facilementêtreadaptépoursélectionnerun sous-ensembledesfilms à publierenutilisantdesparamètres. En occurrence,poursélectionnerlesfilms à publier, on peutintroduiretrois paramètresdesélection$titre , $seanceet $ville dansla feuille destyle,commesuit:

<xsl:param name="titre"/><xsl:param name="seance"/><xsl:param name="ville"/>

Cesdéclarationsglobalessont ajoutéesaprèsl’élément " xsl:output method="html"/ # etavant la premièrerèglede transformation.Il suffit ensuitede modifier la règlede transormationpour lesélémentsdetypeMOTEURenajoutantuneconditiondesélectionavantla transformationd’un film :

<xsl:template match="MOTEUR"><xsl:for-each select="FILM">

<xsl:if test=" ($titre = ’’ or TITRE = $titre)and ($seance = ’’ or HEURE&gt;= $seance)and ($ville = ’’ or VILLE = $ville)">

<xsl:apply-templates select="." /><p/></xsl:if>

</xsl:for-each></xsl:template>

L’instruction xsl:if comparele contenudesélémentsde type TITRE , HEUREet VILLE avec lesparamètrescorrespondants.Si la conditionestsatisfaite, l’élémentdetypeFILM esttransformé.Danslecasopposé,la bouclexsl:for-each passeaufilm suivant.

Les valeursdesparamètresformels $titre , $seance et $ville peuvent être obtenuesde dif-férentesmanières.Dansle casd’uneapplicationweb,on utilise naturellementun formulaireHTML (fig-ure 1.17)qui passeles paramètresdansl’URL de la feuille de style (méthodeGETdu protocoleHTTP).Onobtientparexemple:

http://wwww.sallesenligne.fr/Moteur .xsl?t itre= Verti go&vil le=Pa ris

En résumé,lesprogrammesXSLT interviennentici à deuxniveaux: pourla transformationdesdocu-mentsissusdechaquesite,envued’uneuniformisationdela stucturedesdonnéestelle qu’elle estdéfiniepar la DTD du moteurde recherche,et pour l’extraction sélective de partiesdu documentintégrateuràl’aide deparamètres.

1.4.5 Intégration dynamiquede fragmentsXML

Danstouslesexemplesquenousavonsétudiésjusqu’àprésentles informationsétaientissuesdesourcesXML, éventuellementtransforméesaupassageparXSLT. Nousallonsconclurecetourd’horizon– partiel

Page 47: Comprendre XSLT

1.4. ÉCHANGEET INTÉGRATION DE DONNÉESEN XML 47

– despossibilitésdepublicationà partir deXML/XSLT enétudiantla situationoù la représentationXMLestproduitedynamiquementà partir d’uneautresourcededonnées.

Cettenotiondedynamicitéestmaintenantbienétabliedansle domainedessitesweb. Lessitescon-stituésde pagesHTML au contenufigés sont en effet extrêmementdifficiles à maintenir, et tout à faitinappropriéspourinteragiravecun internautequi vient visiter le site,y rechercherdesinformations,voiredéposersespropresdonnées.La plupartdessitesprofessionnelssontdoncassociésà unebasededonnéesqui gèrel’information indépendammentde toute représentation,les donnéesétantextraiteset misesenforme«àla volée» pardestechniquesdeprogrammationspécialiséesbaséessurl’interfaceCGI (CommonGateway Interface). Les principauxlangagesdédiésà ce type d’applicationsontPerl, PHPet Java, cederniersousla formedeservletsou deleur dérivé, lesJavaServerPages(JSP).

Dansle casde PHPou desJSP, le principeconsisteà intégrerdansun documentHTML despartiesprogramméesqui vont seconnecterà la basededonnées(ou à touteautresourced’information),effectuerdesrequêtesSQLetformaterle résultatdecesrequêtesavecdesbalisesHTML. Il esttoutàfait souhaitabledepouvoir fairedemêmeavecXML, dansla mesureoùonadmetqu’unsystèmed’informationnegérepastoutessesdonnéessousformeXML, maisfait appelà desapplicationsspécialisées: traitementde texte,tableur, annuaire,et biensûrSGBD.

NotonsquePHPou lesJSPsont– du moinsà l’heureactuelle– conçuspourêtreutilisésuniquementavec HTML. Le scénarioquenousconsidéronsici estplus général,et sedérouleen deuxétapes.Dansun premiertempsl’organismeou la sociétéqui souhaitepublier unepartiedu contenude son systèmed’information intégrece contenusousuneforme homogèneXML. Puis,à partir de cetteintégrationlesdifférentstypesde présentationétudiésprécédemment(HTML, WML, PDF, etc) sont généréspar desfeuillesdestylesXSLT.

Nousprenonsdanscequi suit l’exempled’uneintégrationdynamique(autrementdit aumomentoù ledocumentestutilisé) à partir d’unebasededonnéesrelationnelle.CettebasecontientunetableFilm dontnousallonsextraireuneou plusieurslignes.

titre auteur année genre pays résuméAlien Ridley Scott 1979 USA Science-Fiction Près d’un vaisseauspatial

échoué sur une lointaineplanète, des Terriens enmissiondécouvrentde bienétranges"oeufs"...

Vertigo Alfred Hitchcock 1958 Drame USA ScottieFerguson,ancienin-specteurde police, estsujetau vertigedepuisqu’il a vumourir soncollègue...

... ... ... ... ... ...

XML n’estpasunlangagedeprogrammationetnepermetdoncpasdirectementd’exécuterdesrequêtesSQLpourextrairelesdonnéesdecettetable.Il n’existepas– pasencore? – denormepourdéfinircommentdespartiesprogramméespeuventêtreintégréesdansduXML, maisle schémagénéralementsuivi estceluiillustrédansla figure1.19.

1. desbalises«dynamiques», interprétéesparl’applicationcommecorrespondantàl’exécutiondecoded’accèsà unebasededonnées,sontinséréesdansle documentinitial ;

2. avant la transformationpar une feuille XSLT, cesbalisesdéclenchentle codequi va extraire desinformationsetenfaireun fragmentXML ;

3. finalementce fragmentvient remplacerlesbalises«dynamiques»: un documentintermédiaireestobtenu,qui peutêtrepubliéavecXSLT.

Nousutilisonsen l’occurrencelesoutils suivants: MySQL pour le SGBD,Java pour le codedecon-nexion et d’interrogationde la base,enfin XSP, un langagequi reprendle principe desJSPet permet

Page 48: Comprendre XSLT

48 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Partiestatique

Partiestatique

Balises"dynamiques"

Partiestatique

Partiestatique

<fragment XML>

Publication

XSLT

de donnéesBase

SQL

Document initial Document intermédiaire

Code

Figure1.19:Architectured’uneintégrationXML/Basededonnées

d’exécuterdu codeJava inclus dansun documentXML. Le mécanismepeutêtretransposé,mutatismu-tandis, à d’autresenvironnement,parexemplel’environnementXML proposéparOraclequi proposesen-siblementle mêmeschéma.

L’exempledéveloppéci-dessousvaextraireladescriptionXML d’unfilm etl’intégrerdansle documentXML correspondantauxséancesdeL’Épéedebois.

D’une baserelationnelleà XML

Voici pour commencerle codeJava qui permetd’accéderà la baseMySQL, d’effectuerla requêteSQLrecherchantun film (ici c’estAlien) et dele mettreauformatXML. Le petit programmeci-dessousutilisel’interfaceJDBC(JavaDatabaseConnectivity) pourseconnecterà MySQL.

Exemple17 ExJDBC.java: CodeJavapourextraire un film au formatXML

// D’abord on importe le package JDBCimport java.sql.*;

class ExJDBC{

public static void main (String args []) throws SQLException{

// Enregistrement du driver JDBC pour se connecter à// MySQLDriverManager.registerDriver(new org.gjt.mm.mysql.Driver());

// Connection à la basetry{

Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/Films",

"visiteurFilms", "mdpVisiteur");

// Exécution de la requête qui ramène le film AlienStatement stmt = conn.createStatement ();ResultSet rset = stmt.executeQuery

("select * from Film where titre=’Alien’");

// Sortie du résultat avec balises XMLwhile (rset.next ()){

System.out.println ("<FILM>");System.out.println ("<TITRE>" + rset.getString (1) + "</TITRE>");

Page 49: Comprendre XSLT

1.4. ÉCHANGEET INTÉGRATION DE DONNÉESEN XML 49

System.out.println ("<ANNEE>" + rset.getString (2) + "</ANNEE>");System.out.println ("<AUTEUR>" + rset.getString (3) + "</AUTEUR>");System.out.println ("<GENRE>" + rset.getString (4) + "</GENRE");System.out.println ("<RESUME>" + rset.getString (5) + "</RESUME>");System.out.println ("<PAYS>" + rset.getString (6) + "</PAYS>");System.out.println ("</FILM>");

}}catch (SQLException e){

System.out.println ("Problème quelque part !!!");System.out.println (e.getMessage());

}}

}

Lescommentairesdeceprogrammedevraientsuffireàdonnerunecompréhension,neserait-cequ’intuitive,de sonfonctionnement.Une requête(au senslarge: interrogationou miseà jour) correspondà un objetde la classeStatement . Cet objet doit avoir étécréépar un objet Connection , ce qui le rattacheautomatiquementà l’une destransactionsencours.

La méthodeexecuteQuery , commesonnoml’indique, exécuteunerequête(d’interrogation)placéedansune chaînede caractères.Le résultatest placédansun objet ResultSet qui, commeson noml’indique encoreunefois, contientl’ensembledeslignesdu résultat.

Un objet ResultSet correspondà la notion de curseuremployéesystématiquementdansles inter-facesentreun langagedeprogrammationet SQL. La classeResultSet proposeun ensembledeméth-odesget*** qui prennentunnumérod’attribut enentréeetrenvoientla valeurdecetattribut. L’exécutiondeceprogrammedonnele résultatsuivant:

Exemple18 ExJDBC.xml: Résultatdel’exécutiondu programmejava

<FILM><TITRE>Alien</TITRE><ANNEE>1979</ANNEE><AUTEUR>Ridley Scott</AUTEUR><GENRE>Science-fiction</GENRE<RESUME>Près d’un vaisseau spatial échoué sur une lointaine planète,des Terriens en mission découvrent de bien étranges "oeufs". Ilsen ramènent un à bord, ignorant qu’ils viennent d’introduire parmieux un huitième passager particulièrement féroce et meurtrier.</RESUME><PAYS>USA</PAYS></FILM>

On est donc en présenced’une information transitoire,qu’il est possibled’intégrer à un documentstatiqueavantd’effectuerla transformationXSLT.

Intégration Java/XML/XSL T

Maintenantquelesfilms sontdansunebasededonnées,il devient inutile deplacerla descriptiond’Alienou VertigodansdesfichiersXML : il estbienpréférabledecréerà la demandela versiontransitoireXML,puisd’appliquerla feuille destyleexistante.

Voici le nouveaudocumentdécrivantAlien, lesélémentsstatiquesétantremplacésparducodeJavaquilesengendredynamiquement.

Exemple19 AlienXSP.xml: La versionXML/XSPincluantdu codejava

<?xml version="1.0" encoding="ISO-8859-1"?>

Page 50: Comprendre XSLT

50 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

<?cocoon-process type="xsp"?><?cocoon-process type="xslt"?><?xml-stylesheet href="Film.xsl" type="text/xsl"?>

<xsp:pagelanguage="java"xmlns:xsp="http://www.apache.org/1999 /XSP/C ore"

><xsp:structure>

<xsp:include>java.sql.*</xsp:include><xsp:include>java.util.Date</xsp:incl ude>

</xsp:structure>

<FILM><xsp:logic>

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());// Connection à la baseConnection conn = DriverManager.getConnection

("jdbc:mysql://localhost/Films","visiteurFilms", "mdpVisiteur");

Statement stmt = conn.createStatement ();ResultSet rset = stmt.executeQuery (

"select * from Film where titre=’Alien’");// Affichage du résultatwhile (rset.next ()){

<TITRE><xsp:expr>rset.getString (1)</xsp:expr></TITRE><ANNEE><xsp:expr>rset.getString (2)</xsp:expr></ANNEE><AUTEUR><xsp:expr>rset.getString (3)</xsp:expr></AUTEUR><GENRE><xsp:expr>rset.getString (4)</xsp:expr></GENRE><RESUME><xsp:expr>rset.getString (5)</xsp:expr></RESUME><PAYS><xsp:expr>rset.getString (6)</xsp:expr></PAYS>

}</xsp:logic></FILM>

</xsp:page>

Il s’agit d’un documentXML, avec un élémentracinede type xsp:page et une nouvelle classed’élémentsXSP dont toutesles balisesétantpréfixéespar xsp: . On retrouve à peu de choseprèslastructuredu programmeJavadel’exemple17,avec,successivement:

1. l’appelauxpackagesnécessaires,obtenuavecle typed’élémentxsp:include ;

2. l’inclusion directedecodeJavadanslesélémentsdetypexsp:logic ;

3. enfin la productionavec le élémentsde type xsp:expr de chaînesde caractèresqui viennents’intégreraudocumentXML.

Le documentesttraitéendeuxphases.Dansunepremière,le codeJava estévaluéet remplacéparleschaînesdecaractèresproduites,cequi revientenl’occurrenceàobtenirunfichier– temporaire– décrivantle film Alien. Dansla secondephasela feuille destyleestapppliquéeet on obtientla pageHTML.

Le lecteurfamilier avec lesJavaServerPages(JSP)noteraqueXSPs’en inspirelargement: danslesdeuxcason inclut du codedansun langagedebalisage,en limitant lespartiesprogramméesauxendroitsoù desinformationsdynamiquesdoiventêtreinsérées.La grandedifférenceestqu’unepageJSPmélangeHTML, Java, et mêmeSQL. Ici on a séparéle contenu(en XML) de la présentation(obtenuepar unprogrammeXSLT).

Page 51: Comprendre XSLT

1.5. COMMENT LIRE LA SUITEDE CE LIVRE ? 51

Séparationdespoints de vue

Il restecependantun aspectinsatisfaisantdanscetteséparationdesrôles: enincluantdirectementdu codeJavadansduXML, onmélangetoujoursla gestionducontenuet la «logique» del’application.Autrementdit la personnequi est en charge de définir les informationsà publier et leur structure,est égalementconfrontéeaucodequi permetdeproduirecesinformations.Idéalementcesdeuxpointsdevuesdevraientégalementêtreséparés.C’estcequepermetl’utilisation debalises«dynamiques». Envoici un exemple:

Exemple20 AlienXSPLib.xml: Le documentpourAlienavecbalisedynamique

<?xml version="1.0" encoding="ISO-8859-1"?>

<?cocoon-process type="xslt"?><?xml-stylesheet href="FilmXSP.xsl" type="text/xsl"?>

<FILM xmlns:BDFilm="http://cortes.cnam.fr/XBOOK "><TITRE>Alien</TITRE><BDFilm:film titre=’Alien’/>

</FILM>

Cettefois plus aucuncoden’apparaîtdansle documentqui estréduit à uneextrêmesimplicité. Unenouvelleclassedebalises,BDFilm , aétédéfiniepourservird’interfaceavecla basededonnées.La balise

<BDFilm:film titre=’Alien’/>

exprimedela manièrela plussimplequi soit unedemanded’insertionde la représentationXML d’Alien.Par un mécanismepropreau serveur d’application,et que nousne décrironspasici, le processeurvaassociercettebaliseaucodeJava/JDBCprésentéprécédemment,constituerla représentationXML tempo-rairedu film, puisappliquerla transformationXSLT.

Onobtient,aveccettearchitecture,uneséparationcomplètedesrôles:

1. la logiquede l’applicationestcodéeen Java (ou tout autrelangagereconnupar le serveur),cequiautorisetouslescalculs,accèsauxbasesdedonnées,échangesréseauxet appelsdeservicesdiverset variés; l’information obtenueestrenduedisponiblepar l’intermédiaired’une librairie debalises(taglib) ;

2. le contenuest intégrésousforme XML, à partir de sourcesd’informationsqui peuvent être desfichiers,dessites,ou lesbalisesdeslibrairies;

3. enfinla présentationestobtenueparun ensembledeprogrammeXSLT.

1.5 Comment lir e la suitedecelivre?

Le momentestvenuderécapitulercepremierchapitre,etdevoir commentil fournit la clépourappréhenderle contenudecelivre,etdoncenguiderla lecture.

Récapitulatif

En utilisant XML, nousrendonsnotrecontenuindépendantdu format propreà uneapplicationdonnée.Du mêmecoup,nousdissocionscecontenudetoutesignificationintrinsèque.Un documentXML n’a pasd’autreinterprétationquecelle qu’un traitementparticulierva lui associerà un momentdonné. Prenonsdeuxexemplespourbienclarifier cettenotion:

1. quandun traitementdetextesauvegardeun documentdanssonformatpropriétaire,ceformata unesignification,définieparle renduqu’enfait le traitementdetexte lorsd’un affichageà l’écran; il n’ya rien detel avecXML puisqu’undocumentestindépendantdetouteapplication;

Page 52: Comprendre XSLT

52 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

2. dansune pageHTML, on trouve égalementdesbalises,mais la différenceessentielleest que lasignificationde cesbalisesestfixée, dansun contexte donnéà l’avancequi est l’affichagedanslafenêtred’un navigateur: une balise " BR# correspondà un sautde ligne, et ne s’interprètepaslibrement.

Cequi compteenXML c’estla structure,àsavoir l’arbrecorrespondantàun document,et l’utilisationde nomsd’élémentscommemoyen pour différencierou au contrairegrouperde nœuds.En revanchelechoix desnomslui-mêmeestsansimportanceet on aurait tout aussibien pu utiliser pour décrirenotrecinémales balises " A # , " B # , " C# et " D# ou les balises " MOVIE# , " NAME# , " ADDRESS# et" SUBWAY# sansmodifierla structure.

Chacunestdonclibrededéfinir, enfonctiondesesbesoins,sonproprelangagebasésurXML (XML estparfoisprésentécommeunméta-langage– un langagepourdéfinirdeslangages).C’estcequenousavonsfait pourdécrirenosséancesdecinéma,c’estcequefont égalementlesnavigateurswebavec(X)HTML,les mobilesavec WML, etc. Tousceslangagespartagentdesrèglesde structurationcommunes,ce quipermetdeleur appliquerdesoutils standards(édition,analyse)et depasserdel’un à l’autresansdifficultémajeure.

Échangeet intégration avecXML

Le rôle de XML commelangaged’échangeet d’intégrationde donnéesdécouledescaractéristiquesquiprécèdent.Dansbeaucoupdecas,un systèmed’informationconfiesesdonnéesà deslogicielsspécialisésdansunetâchedonnée(serveurweb,basededonnées,fichiersdeconfiguration,etc)et lesrenddu mêmecoupimpropresàuneutilisationautrequecelleà laquelleellesont étéinitialementaffectées.

Transformersesdonnéesau format XML, temporairementou définitivement,revient à les rendredisponiblespourd’autresapplicationset d’autresutilisateurs.Intégrercesinformations,issuesdesourcesdiverses,dansun format commun,permetà la fois de donnerunevision uniformedesinformations,etd’éviter deconfronterle responsabledela publicationà deslogicielset langagesdiverset complexes.Defait la connaissancedeXSLT suffit.

Publication XML/XSL T

Il existe desapplicationsqui sont conçuespour travailler sur desdocumentsXML ayantune structureparticulière,et utilisant une terminologie(un nommagedesnœuds)spécifique. De telles applicationsdéfinissentla significationdetelsdocuments,enfournissantunmiseenforme(surécranousurpapier)ouun modedetraitement(insertiondansunebasededonnées,envoi demessages)deleurcontenu.

L’exempletypiqueestfourni parundocumentHTML – ou,pourêtreplusprécis,XHTML – qui obéitàdesrèglesdestructurationetdenommageparticuliers.Un documentXHTML estundocumentXML, maisdoit impérativementavoir pourracine " HTML# , cetteracineayantelle-mêmedessous-éléments" HEAD#et " BODY# (danscetordre),etc. Tout documentconformeauxrèglesdestructurationXHTML peutêtreaffichédansun navigateurwebqui interprètelesbalisesdu documentscommedescommandesdemiseenformeà l’écran.

XHTML n’estqu’un desexemplespossiblesde«dialecte» XML, et la présentationdeXML commeun «super-HTML » ou commeun HTML «extensible» estselonnousunesourcedeconfusion.XHTMLne constituequ’un desnombreuxexemplesde format de donnéesdécrit par un langageplus généraletuniversel,XML. En d’autrestermes,XML peutêtreconsidérécommeun outil pour définir desformatsdedonnéesqui sontliés à desapplicationsspécifiques.Nousverronsdanscelivre plusieursexemplesdedialectesXML, dontWML pourl’affichagesurdestéléphonesmobiles,RSS,unenormededescriptiondedocumentsutilespourlesannuairesdeliens,SMIL, un formatdédiéauxprésentationmultimédia,etc.CesdialectesdeXML sontdéfinispardesDocumentTypeDefinition(DTD).

À partir d’un documentXML donné,il estpossibled’effectuerdestransformationsdu contenuafind’obtenir desreprésentationsspécialiséesqui peuventalorsêtretraitéespar les applications.Il existe denombreusestechniqueset outils pour effectuerde tellestransformations.La perspective adoptéepar celivre est celle d’une transformationavec desfeuilles de style XSLT. Une feuille de style appliqueuneconversionà un documentXML. Il estbienentendupossiblededéfinir plusieursfeuillesdestylepourunmêmedocument,cequi aboutità un mécanismedepublicationdecontenuillustré dansla figure1.20.

Page 53: Comprendre XSLT

1.5. COMMENT LIRE LA SUITEDE CE LIVRE ? 53

TransformationXSLT Document XML

Document XML

application XMLapplication web application WAPapplication édition

formatéPage XHTML

Contenu Page WML

XSLT

XSLTXSLT XSLT

XSLT

Base de données

MessageXML

Fichiers

Figure1.20: IntégrationXML, et transformationsXSLT

Cettefigure déclinequelques-unesdessituationsqui serontexploréesdansles prochainschapitres.PourunmêmedocumentXML, on obtientpardestransformationsXSLT :

1. uneou plusieurspagesXHTML constituantun siteweb;

2. un formatageadaptéà un traitementdetexte,envuedefairedel’édition ;

3. des«cartes» WML pourcommuniquerparle WAP avecdestéléphonesmobiles;

4. enfinonpeutimaginertouteconversiond’un dialecteXML versunautre,l’objectif danscecasétantdefairecommuniquerdesapplicationsenvuederéutiliserdesinformationsexistantes.

En résumé,XML estun langagede descriptionde donnéesqui vise à l’universalitéen sebasantsurun principesimple: le contenuestséparéde la présentation,et la manièredont ce contenuestconstituéestelle-mêmeindépendantede la productiond’uneprésentation.On obtientun processusdepublicationenplusieursétapes,chacunerelevantd’unecompétenceparticulière,cequi constrasteaveclestechniquescourantesde productionsde site qui impliquent la maîtriseet l’emploi simultanéd’un grandnombredetechniqueset d’outils.

Organisationdeschapitresqui suivent

La suitede ce livre reprendde manièresystématiquetous les thèmesabordésdansce qui précède.Lechapitre3 donneunedescriptioncomplètedela syntaxeXML, et introduit lesopérationsapplicablesà undocumentXML. Le chapitre4 reprenddemanièrerigoureusele langageXSLT, tandisqueleschapitres5 et6 développentl’utilisation deXSLT poureffectuerdestransformationsversdesDTD courantes: HTML,WML, SMIL, RSS,XSL-FO... Leschapitressuivantscontinuentl’explorationdestransformationsXSLT,eny ajoutantdesprocessusd’intégrationet d’échangesdedonnées.

Nousespéronsquela lecturedecepremierchapitreaurapermisdeclarifier leschoixd’organisationquiont étéfaits,et donnerontl’opportunitéau lecteur, enfonctiondesescompétences,dechoisiréventuelle-mentun ordredelecturedifférent.

Page 54: Comprendre XSLT

54 CHAPTER1. INTRODUCTIONÀ XML ET XSLT

Page 55: Comprendre XSLT

Chapter 2

DocumentsXML : structur eetnavigation

Sommaire

2.1 La syntaxeXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

2.1.1 DéclarationXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

2.1.2 Déclarationdu typededocumentetdesentités . . . . . . . . . . . . . . . . . . 57

2.1.3 Commentaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

2.1.4 Instructionsdetraitement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

2.1.5 Éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.1.6 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

2.1.7 Espaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

2.1.8 SectionsCDATA. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

2.1.9 Référencesd’entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

2.1.10 Balises,donnéescaractèreset valeurtextuelle . . . . . . . . . . . . . . . . . . 62

2.2 Le modèleDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2.2.1 TypesdenœudsDOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2.2.2 InterfaceDOMString . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

2.2.3 InterfacesNodeList et NamedNodeMap. . . . . . . . . . . . . . . . . . . . . 66

2.2.4 InterfaceNode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

2.2.5 InterfaceDocument . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

2.2.6 InterfacesElementet Attr . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

2.2.7 InterfacesDocumentType, Entity et EntityReference . . . . . . . . . . . . . 74

2.3 Du documentsérialiséà l’arbr eDOM . . . . . . . . . . . . . . . . . . . . . . . . . 74

2.3.1 Constructiond’un arbreDOM . . . . . . . . . . . . . . . . . . . . . . . . . . 76

2.3.2 Traitementdesespacespendantla construction. . . . . . . . . . . . . . . . . . 78

2.3.3 Deuxfonctionsdenavigation . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

2.4 Le langageXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

2.4.1 ReprésentationXPathd’un documentXML . . . . . . . . . . . . . . . . . . . 82

2.4.2 ExpressionsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

2.4.3 Lesaxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

2.4.4 Lesfiltres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

2.4.5 Prédicats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

2.4.6 TypesetopérationsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

2.4.7 Exemplesd’expressionsXPath . . . . . . . . . . . . . . . . . . . . . . . . . . 107

55

Page 56: Comprendre XSLT

56 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Nousapprofondissonsdanscechapitrela notiondedocumentXML, enmettantl’accentsurla structured’un documentet sur la navigationdanscettestructure. Cesdeuxaspectssonten effet à la basede laprogrammationXSLT.

Nous suivons la démarcheadoptéedès l’introduction, consistantà considérerun documentXMLcommeun arbre.Cepoint devuea le grandavantaged’être indépendantde l’origine du documentet defaireabstractiondesareprésentationphysiqueoutextuelle: la représentationarborescenteestconceptuelleet a pourbut dedécriresansambiguïtéla structureet le contenud’un document.Cen’estpasle casd’unereprésentationtextuelleou «sérialisée» où un mêmecontenupeutêtrereprésentéavecdesconstructionssyntaxiquesdifférentes.Par exempleun élémentvide a uneseulereprésentationdansl’arborescence(unnœudsansfils) mais possèdedeux représentationstextuelleséquivalentes: " a #%" /a # et " a/ # . Unautreexempled’unetel ambiguïtéestle caractère’>’ qui peut-êtrereprésentépar ’&#62;’ et ’&gt;’ dansun documentXML.

Nousdécrironsla structurearborescented’un documentXML ennousappuyantsurunmodèlenormal-isédereprésentationet demanipulationdedonnéesXML, le modèleDOM. Dansla suite,et quandil estnécessairededistinguerexplicitementlesdeuxtypesdereprésentation,nousutiliseronsle termedocumentsérialisépour désignerla représentationtextuelle d’un documentXML et le termearbre DOM pour sareprésentationarborescente.

Avant d’être transmisà un traitement,quel qu’il soit, un documentXML (sérialisé)est traité par unprocesseurXML ou parseur qui va analyserson contenuet déterminersa structure. Dansle casd’unparseurDOM le résultatde cet analyseestun arbreDOM. Danstouslescas,cettephased’analysepeutéchouersi le documentn’estpasbienformé, autrementdit s’il nerespectepasla syntaxedu langageXML.Bien quecettesyntaxe nesoit pasnécessairepour expliquer le fonctionnementdeXSLT proprementdit,il estimportantdebiencomprendrecommentun documentXML esttransforméenarborescenceDOM etinversement.

Nousutiliseronségalementle modèleDOM (DocumentObjectModel) pourcompléternotredescrip-tion de la structured’un documentpar lesopérationsdenavigationdanscedocument.DOM fournit unespécificationorientée-objetbaséesur desméthodesd’investigationet d’extractionde données.Bien quecettespécificationdéfinissedemanièrepréciselesopérationssurun arbreXML, samiseenœuvreenpra-tiquenécessitele recoursà un environnementde programmationcommeJava. Le langage XPath, étudiédansla secondepartie de ce chapitre,offre un outil plus simple pour déclarerdescheminscomplexesd’accèsà deséléments.C’est XPath qui estutilisé dansXSLT, et pasles opérationsDOM, mais il estimportantde signalerdèsmaintenantque l’évaluation d’un programmeXSLT peutêtredécriteen DOM(mêmesi le systèmelui-mêmen’utilise pasnécessairementcetteAPI), et que la compréhensionde cemodèledonnedoncla cléd’unebonneinterprétationdesrèglesXSLT.

2.1 La syntaxeXML

LesdocumentsXML sontla plupartdu tempscréés,stockésouéchangéssousunereprésentationtextuelleousérialiséequi «marque» la structurepardesformessyntaxiques(essentiellementdesbalises)mêléesaucontenutextuel. NousdonnonsmaintenantlesrèglessyntaxiquesdebasepourreprésenterdesdocumentsXML sérialisés.Nousverronsdansla sectionsuivantecommenton passede cettereprésentationà unereprésentationarborescentesousformed’un arbreDOM.

Commençonsparl’exempled’un documentXML dontle contenu– sommaire– résumelesprincipauxaspectssyntaxiquesdu langage.

Exemple21 ExXML4.xml: Illustrationdela syntaxeXML

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?><!DOCTYPE A SYSTEM"minimal.dtd" [

<!ENTITY monTexte "texte simple"><!ENTITY maSignature SYSTEM"signature.xml">

]><!-- Instruction de traitement --><?xml-stylesheet href="prog.xslt" type="text/xslt"?>

Page 57: Comprendre XSLT

2.1. LA SYNTAXE XML 57

<A>Du &monTexte;, sans caractères réservés:ni &lt; ni &gt; ni &amp; ni &apos; ni &quot;<B> contenu texte </B><!-- Un élément vide --><C/><D attr1="1" attr2="azerty">

<B>Encore &monTexte;,</B></D><![CDATA[Du texte <non interprété> &monTexte;]]>&maSignature;

</A>

Cetexemplevanousservirdesupportàlaprésentationdesdifférentscomposantsd’un documentXML.

2.1.1 Déclaration XML

La déclarationXML estunebalisespécialequi doit apparaîtreaudébut du document.Saformeminimaleindiquela versiondela normeXML à laquelleseconformele document:

<?xml version="1.0"?>

Cetteinformation est principalementdestinéeau traitementqui va analyserle document,afin qu’ilpuissetenir comptedeséventuellesvariantesdesyntaxeentrelesdifférentesversionsXML. Onpeutaussilui associerdesattributs (voir plus loin) caractérisantle document.Nousutilisonspar exemplesystéma-tiquementl’attribut encoding avecla valeurISO-8859-1 qui indiqueuncodagedecaractères«latin»incluantlescaractèresaccentués.

L’attribut (optionnel)standalone indiquesi le documentXML contientdesréférencesversd’autresfichiersou«entitésexternes» (voir plusloin) qui doiventêtrechargéespendantl’analysedudocument.Lavaleuryes permetau processeurXML de savoir qu’il n’est pasnécessaired’accéderà d’autressourcespour analyseret restituerle documentXML en entier. Dansnotre exemplenousavons défini stan-dalone=’no’ (qui estaussila valeurpardéfaut)car, commenousallonsle voir maintenant,il contientuneréférenceversuneentitéexterne.

<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>

La déclarationdedocumentestuniquementdestinéeauparseur, etn’estplus«visible» dansl’arborescenceDOM d’un documentXML. Onnepeutdoncy avoir accèsdansun traitementXSLT.

Contrainte : La déclarationXML estoptionnelle, maissaprésenceestcependantrecommandée.Si elleestprésente,elle doit êtrela premièreligne du document.

2.1.2 Déclaration du type de documentet desentités

La balisespéciale" !DOCTYPE# définit la DTD (DéfinitionduTypedeDocument)qui estunedescriptiongénéralede la structuredu document.Cettedescriptionpeutêtreentièrementinclusedansla balisesousformededéclarationslocales,maisle plussouventon fait appelàunesourceexterne(cepeutêtreunnomdefichier local,ou uneURL). La formegénéraledela déclarationestalors:" !DOCTYPE nomDocument SYSTEM" sourceExt " [ decLoc ] #

Cettedéclarationindiquetout d’abordquele documentestdetypenomDocument . Aprèsle mot-cléSYSTEMon trouve l’URL sourceExt qui correspondà un fichier avecdesdéclarationsexternessur lastructuredu document.LesdéclarationslocalesdecLoc sontentouréesdessymboles[ et ] .

Un problèmebienconnudesURL pouridentifierdesunitésd’informationscommeunepageHTML ouunfichierDTD estl’utilisation d’un mécanismed’adressagephysique. Cetyped’adressageestrisquédansun environnementévolutif où les serveursWeb changentd’adresseet où les fichierssontdéplacésd’un

Page 58: Comprendre XSLT

58 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

répertoireà l’autre. Pourremédierà ceproblème,XML proposeégalementl’utilisation «d’identificateurspublics», qui serontdécritsdansle chapitre4.

Les entitésfournissentun moyen de factoriserdesfragmentsXML et desréutiliseren plusieursen-droits. Dansnotreexemple,lesdéclarationsd’entitéssont locales(comprisesentrelescrochets[ ]) maisil peuventégalementfairepartiedu fichier externesourceDTD . NotredocumentExXML4.xml, page56,contientla déclarationd’une entitéinterne (unesimplechaînede caractères)et d’une entitéexterne(unfichier):

<!ENTITY monTexte "texte simple"><!ENTITY maSignature SYSTEM"signature.xml">

Le nomde la premièreentitéestmonTexte et savaleurtexte simple . La deuxièmeentitéa lenommaSignature etsavaleurestdéfinieparle contenudufichiersignature.xml . Lesdeuxentitéspeuventensuiteêtreréférencéesdansle documentparleur nom.

Contrainte : La déclarationdu typededocumentestoptionnelle.Si elle estprésente,elle doit apparaîtreavantle premierélémentdu document.

2.1.3 Commentaires

Un commentaireestunezonede texte libre encadréepar " !-- et -- # . Il peutcontenirn’importequeltexte, à l’exceptionde -- , selonn’importequelledisposition(sautsde lignesparexemple).Le commen-tairesuivantestsyntaxiquementcorrect(bienformé):

<!-- Instruction de traitement <?xml-stylesheet ...> -->

Lesdeuxcommentairessuivantsnesontpascorrects:

<!-- erreur: -- n’est pas permis --><!-- erreur: --->

Le deuxièmecommentairen’estpasbienformé,carun commentairenedoit pasterminerpar« ---> ».

Contrainte : Lescommentairespeuventêtreplacésn’importeoù dansle document,saufdansunebalise.

2.1.4 Instructions de traitement

Lesinstructionsdetraitement(processinginstructions) sontconçuespourintégrerdesinstructionspropresàun processeurparticulierdansun documentXML. Touteinstructionapparaîtdansunebalisedela forme" ?nomInstruction attributs # . Nousutiliseronsparexempletrèssouventl’instructionsuivantequi indiqueàunprocesseurXSLT l’adressedufichierqui contientle programmepourla transformationdudocument:

<?xml-stylesheet href="prog.xslt" type="text/xslt">

Le motqui suit le «?» estla cible (target), le resteconstituantle contenudel’instructiondetraitement.Il fautnoterquela déclarationdedocumentXML, bienqueconformeà la définitionsyntaxique,n’estpasuneinstructionde traitement.De plus, le nomdecible ’xml ’ (enminuscule,majusculeou mélangé)estréservépourdesversionsfuturesdu standardXML.

Contrainte : Lesinstructionsdetraitementpeuventêtreplacésn’importeoù dansle document,saufdansunebalise.

Page 59: Comprendre XSLT

2.1. LA SYNTAXE XML 59

2.1.5 Éléments

Les élémentsconstituentle principal composantd’un documentXML. La représentationsérialiséedetout élémentse composed’une balise ouvrante " balise # , de son contenuet d’une balise fermante" /balise # . La présencedesbalisesouvranteset fermantesestobligatoire. En revanchele contenud’un élémentpeutêtrevide. Il existealorsuneconventionqui permetd’abrégerla notation.L’élémentvide

<C></C>

peutêtrenoté

<C/>

Le contenud’un élémentpeut aussi– et surtout– être constituéd’une combinaisonarbitrairementcomplexedecommentaires,d’autreséléments,deréférencesentitésetdesectionsdetexte (voir plusloin).Par exemple,le contenude l’élémentdetypeA dansle fichier ExXML4.xmlestunetelle combinaisondecatégoriessyntaxiques.

Contrainte : Tout documentcomprendun et un seulélémentracinequi définit le contenumêmedu doc-ument.

NotreexempleExXML4.xmlcontientun élémentracinedetypeA. Le documentsuivantn’estpasbienformécaril a deuxélémentsracine.

<?xml version="1.0"?><A>Un premier contenu</A><B>Un deuxième contenu</B>

Contrainte : Le nom du type de l’élément racinedoit être identiqueau nom du type de document(sicelui-i estprésent).

Le documentsuivantn’estpasbienformécarle typedel’élémentnecorrespondpasautypedu docu-ment:

<?xml version="1.0"?><!DOCTYPE A SYSTEM"fichier.dtd"><B>contenu</B>

Le nomd’unebalise,qui correspondautypedel’élément(voir plusloin), peutcomprendredeslettresde l’alphabet,deschiffres, les caractères«- », «_», maispasde blancni de lettresaccentuées.De plusle nomnedoit pascommencerparun chiffre. Enfin XML distinguelesmajusculesdesminuscules,et labalise " NOM# seradoncconsidéréecommedistinctede la balise " nom# (cesdeuxbalisesdéfinissentdeuxélémentsde typesdifférents). Sousréserve de cesquelquesrestrictions,les nomsd’élémentsontlibresenXML : il n’existepasdenomréservé.

2.1.6 Attrib uts

Un élémentpeutavoir desattributs. Les attributs apparaissenttoujoursdansla baliseouvrante,souslaforme nom="valeur" ou nom=’valeur’ , séparéspar un espaceblanc (voir plus loin). Les nomsd’attributssuiventlesmêmesrèglesquelesnomsd’éléments.

Contrainte : La baliseouvranted’un élémentnedoit pascontenirdeuxattributsavecle mêmenom.

Parexemplele fragmentXML suivantn’estpasbienformé:

<A at1=’1’ at1=’2’/>

Page 60: Comprendre XSLT

60 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Pourceuxqui auraientl’habitudedespratiquesassezlaxistesdeHTML, il estbondenoterque

! un attribut doit toujoursavoir unevaleur, doncla baliseHTML " OPTION SELECTED# n’estpasduXML bienformé;

! la valeurdoit toujoursêtrecompriseentredesapostrophessimples(’10’) ou desguillemets("10") ;la valeurelle-mêmepeutcontenirdesapostrophessimplessi elle estencadréepardesguillemets,etréciproquement;

UnecaractéristiqueessentielledeXML estquel’ordredesattributsd’un élémentn’estpassignificatif.L’élément:

<A at1=’1’ at2=’2’/>

estdoncidentiqueà:

<A at2=’2’ at1=’1’/>

Autrementdit tout traitementdoit donnerle mêmerésultat,indépendammentde l’ordre desattributs.Enpratiqueil faudratoujoursaccéderàun attribut parsonnom,et pasparsaposition.

Il existeplusieursnomsd’attribut réservésdansXML (touscommencentparle préfixexml: ) :

! xml:lang : cet attribut permetd’indiquer la langueutilisée dansle contenud’un élément. Lescodesutiliséspour les languessontdéfinispar le standardIETF RFC1766.Par exemple,lescodesen , fr et de indiquentrespectivementdescontenusenAnglais,Françaiset Allemand.

! xml:space : cetattribut précisele traitementdesespacesdansle contenud’un élément.Il a deuxvaleurspossibles,defaultou preserved. Dansle premiercas,c’est l’application qui détermineletraitementdesespaces.Dansle secondcas,touslesespacesdoiventêtrepréservésparl’application.

! le nom d’attribut xmlns et tous les nomsqui commencentpar xmlns: sontégalementréservéspourla spécificationd’espacesdenom.

Remarque: Lesespacesdenom(namespace) constituentunaspectimportantdeXML : ils serontdécritsdemanièreapprofondiedansle chapitre6.

2.1.7 Espaces

Lesespacesjouentunrôlespécialdansla représentationsyntaxiqued’undocumentXML. Un «espace» estunechaînedecaractèrescomposéeuniquementdecaractèresespaceblanc(Unicode#x20),retourchariot(Unicode#x9), line feed(Unicode#xD) et tabulation (Unicode#xA) (voir page64pourplusdedétailssurle standardUnicode).

Généralementles espacesblancsservent commeséparateursentreles différentscomposantssyntax-iquesd’un documentsérialisé. Par exemple,le fichier ExXML4.xmlcontient18 lignes, c’est à dire 18retourschariot. On voit égalementque,pour augmenterla lisibilité, le mêmedocumentcontientdeses-paces(#x20)poursoulignerla structurehiérarchiquedu document.

À priori un parseurXML doit transmettretouslesespacesà l’applicationexploitant le document(parexempleauprocesseurXSLT). Néanmoins,un programmeXSLT permetdespécifierunepriseencomptespécifiquedesnombreuxespacesapparaissantdansundocumentXML. Il estcourantparexempled’ignorertouslesespacesendehorsdel’élémentracined’un documentoudesélémentsqui contiennentuniquementun espaceblanc. Il estsurprenantde constaterquela gestiondesespacesconstitueun point trèsdélicatdansla manipulationdedocumentsXML. Nousauronsdoncsouventl’occasionderevenirsurle traitementdesespaceset la la distinctionentreespacessignificatifset non-significatifs.

Page 61: Comprendre XSLT

2.1. LA SYNTAXE XML 61

2.1.8 SectionsCDATA

Il peutarriverquel’on souhaiteplacerdansundocumentdutextequi nedoit pasêtreanalyséparle parseur.C’estle casparexemple:

1. quandonveutincluredecodedeprogrammationqui contientdescaractèresréservésdansXML : les’ " ’ et ’&’ abondentdansducodeC ou C++;

2. quandle documentXML est consacrélui-mêmeà XML, avec desexemplesde balisesque l’onsouhaitereproduirelittéralement.

Les sectionslittéralesCDATAdéfinissentunezonequi n’est pasanalyséepar le parseur, et estdonctransmisetellequelleauprogrammetraitantle documentXML (parexempleunprogrammeXSLT). Notrepetit exemplecontientunesectionCDATA:

<![CDATA[Du texte <non interprété> &monTexte;]]>

Cettesectionesttransmiselittéralement,etcorresponddoncà

Du texte <non interprété> &monTexte;

Il estclair quele traitementdececontenumèneraità résoudrelesréférencesà l’entité monTexte , etàtenterd’interpréter" non interprété # commeunebalise,cequi d’ailleurséchoueraitcaril nes’agitpasd’un nomd’élémentvalide.

2.1.9 Référencesd’entités

Chaqueréférenceàuneentitédoit sefairesousla forme&nom; oùnomestle nomdel’entité. Enpratique,dansun programmeXSLT on considèrequele parseurdu documenta remplacétouteslesréférencesauxentitésparleur valeur. Par exemple,la référence

&monTexte;

dansle documentExXML4.xmlestremplacéeparsavaleur, eton obtient:

texte simple

Celasignifie quenousn’avonspasà noussoucierdesentitésdansnos programmesXSLT puisqueceux-citravaillentsurla représentationdudocumentobtenueà l’issuedela phasedeparsing, etdoncaprèsrésolutiondesréférencesauxentités.

Remarque: Le remplacementdesréférencesverslesentitéspar leur valeurn’estpasuneobligationim-poséeparla recommandationXML. L’avantaged’un tel remplacementestuneprogrammationplusfacilequi n’estpasobligéedesepréoccuperdela compositionphysiqued’un documentXML.

La syntaxe XML permetde spécifierdescaractèrespar leur codeUnicode. Ainsi, au lieu d’écrire Cenmajuscule,on peutégalementutiliser la référence&#67; où l’entier 67 correspondà l’Unicode dececaractère.Cemécanismederéférencementestutile pour incluredescaractèresqui nesetrouventpassurle clavier qu’onutilise. Parexemple,le caractère« c

&» dontle codeestsoit 169,soitxA9 enhexadécimal

( ')(+*�'-,+.0/213'),4/ , le symbole«x » après’#’ indiquantquele codeestenhexadécimal)peutêtreinclusdansun documentXML pardesréférencesversdesentitéscaractères#169; ou#xA9; .

Mais les référencesversles entitéscaractèressontsurtoututilespour incluredescaractèresavecunesignificationspécifiquedansla syntaxe XML : «< », «> », «&», « ’ » et «" ». Par exemple,pour inclurele symbole«< » dansle textesansqu’il soit interprétéparle processeurXML commele début d’unebaliseon peututiliser la référence&#60; .

À priori, touteslesentitésréférencésdansun documentXML doiventêtredéclaréesdanssaDTD. Ilexistedeuxexceptions: lesentitéscaractèreset lesentitésdu tableau2.1si le documentn’a pasdeDTD :

Notreexemplecontientle fragmentsuivant:

Page 62: Comprendre XSLT

62 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Déclaration entité (prédéfinie) Référence Caractère<!ENTITY lt "&#60;"> &lt; <<!ENTITY gt "&#62;"> &gt; ><!ENTITY amp "&#38;"> &amp; &<!ENTITY apos "&#39;"> &apos; ’<!ENTITY quot "&#34;"> &quot "

Table2.1: EntitéscaractèresprédéfiniesdansundocumentXML sansDTD

Du &monTexte; , sans caractères réservés:ni &lt; ni &gt; ni &amp; ni &apos; ni &quot;

Cequi donnera,aprèsrésolutiondesréférencesauxentitésle textesuivant:

Du texte simple, sans caractères réservés:ni < ni > ni & ni ’ ni "

Lesentitésexternespermettentquantà ellesd’inclure le contenud’un fichier.

<!ENTITY maSignature SYSTEM"signature.xml">

Onpeutdoncinsérerle contenudesignature.xmlparunesimpleréférence&maSignature; . Cemé-canismepermetdeconstituerun documentparassemblagedeplusieursautres,éventuellementaccessiblessur le réseau.Par défaut,on supposequele fichier inclussetrouve au«mêmeendroit» quele documentprincipal,maisil estégalementpossiblededéfinirunchemind’accèsdifférentà traversuneURL absolue.

XML distingueentredeux typesd’entitésexternes: les entitésXML (parsedentities) et les entitésnon-XML (unparsedentities) :! UneentitéXML doit êtreconformeàla définitionducontenud’un élément.Ainsi uneentitéexterne

peutêtreun documentXML bien-formémaisaussiun fragmentXML avecplusieurs(ou sans)élé-mentsracinesmélangésavecdessectionsdetexteetdescommentaires.Cefragmentdoit néanmoinsêtrebien-forméet«complet» dansle sensoùtouteslesbalisesouvrantessontferméesdansla mêmeentité.! Uneentiténon-XML peutêtreunfichieravecn’importequelcontenucommeparexempleuneimageou un fichier audio. Cecontenunerespecteévidemmentpasla syntaxe XML cequi a commecon-séquence,qu’il nepeutpasfairepartiedu contenud’un élément.XSLT neprévoit pasun traitementspécifiquepourlesréférencesverslesentitésnon-XML dansun documentXML.

Uneentitéexternepeutcontenirdesréférencesversd’autresentitéset, pourchaquedocumentXML,on peutcréerunearborescenced’entités(plusprécisémentun grapheacyclique)qui seréfèrent.La racinedecettearborescenceestle documentXML, égalementappeléentitédocument.

2.1.10 Balises,donnéescaractèreset valeur textuelle

La représentationsérialiséed’un documentXML estun texte composédebalises(markup) et dedonnéescaractères(character data). Les balisespermettentde sépareret d’identifier les différentescatégoriessyntaxiquesqui précèdentet définissentles instructionset déclarationsutiles pour constituer, structurer,valider et interpréterle contenu«textuel» d’un documentXML. DansXML, tout ce qui ne relève pasl’une descatégoriessyntaxiquessuivantesconstituedonclesdonnéescaractèresd’un document:

! la déclarationdu document<?xml ....> ;! la déclarationdetype(si présente)<?DOCTYPE...> ;! lescommentaires<!--... --> ;! lesinstructionsdetraitement;

Page 63: Comprendre XSLT

2.1. LA SYNTAXE XML 63

! lesréférencesd’entités(interneet externe);! lesbalisesd’éléments(ouvrantes,fermanteset vides);! lesséparateurs dessectionsCDATA (sansleur contenu): <![CDATA[ et ]]> : le texte entrecesséparateurscontientdesdonnéescaractères!

Lesdonnéescaractèresreprésententtoutela partietextuelled’un documentXML qui n’estpasinter-prétéepar un parseur. Par exemple,les donnéescaractèresdu documentExXML4.xmlsont les suivantes(lesespacessontreprésentéspar«_» et lesretourschariotspar« |») :

||__|__|||||__Du_,_sans_caractères_réservés:|__ni__ni__ni__ni__ni_|___contenu_texte_|___Un_élément_vide_|__|__|___Encore_,|__|__Du_texte_<non_interprété>_&monTex te;|__|

On voit quelesretourschariotset lesespacesfont partiedesdonnéescaractèresd’un documentet quelesréférencesverslesentitésont disparu.Ainsi, lesdonnéescaractèresnecorrespondentpasexactementaucontenu«textuel» d’un documents’il contientdesréférencesversdesentités.Pourfairecettedistinction,nousallonsutiliser le termevaleurtextuellepourdésignerlesdonnéescaractèresd’un document(ou d’unélément)une fois remplacéestoutesles référencesaux entitéspar leur valeur. Par exemple, la valeurtextuelledel’élémentA dansle documentExXML4.xmlest:

|__Du_texte_simple,_sans_caractères_ réserv és:|__ni_<_ni_>_ni_&_ni_’_ni_"|___contenu_texte_|__|__|__|___Encore_texte_simple,|__|__Du_texte_<non_interprété>_&monTex te;|__signature|

Dansla valeurtextuellede l’élémenttoutesles référencesont étéremplacéespar leur valeur(nousavonssupposéquele fichier signature.xml contientuniquementla chaînedecaractères«signature»). Onpeutremarquerquele contenud’unesectionCDATA correspondà savaleurtextuelle.

Un autreexemplede la différenceentrelesdonnéescaractèresdansun documentou d’un élémentetsavaleurtextuelleconcernelesespaces.À priori un parseurXML doit transmettretouslesespacesqui nefont paspartiede sectionsde balisageà l’applicationexploitant le document(parexempleauprocesseurXSLT). Néanmoins,lesespacespeuventinterprétésdifféremmentselonl’endroit où ils apparaissent.

Page 64: Comprendre XSLT

64 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Par exemple,les espacesqui se trouvent avant l’élément racineet ne font paspartiedu contenududocumentont «moins» de significationqueceux qui se trouvent dansle contenud’un élément. Nousreviendronsplusieursfois surle traitementdesespacesblancsdansXML etXSLT (pages74etchapitre3).

Remarque: La notiondevaleurtextuellenefait paspartiedela recommandationXML, maisaétéintro-duitedansXSLT.

2.2 Le modèleDOM

Un documentXML, quellequesoit sareprésentationdedépart,correspondà unestructurearborescente,et c’estsurcettestructureques’appliquele traitementXSLT. Dansla mesureeneffet où l’exécutiond’unprogrammeXSLT consiste– en simplifiant beaucoup– à sepositionnersur desélémentset à produiredu texte en«piochant», à partir de l’élémentcourant,despartiesdu contenudu documentXML, le pro-cesseurXSLT doit sebasersurunereprésentationd’ensembledu documentqui supportelesopérationsdenavigationetd’extraction.Ceseraittrèsdifficile surunereprésentationsérialisée,c’estplusfacile,nousleverrons,surunereprésentationarborescente.

Commenousl’avonsmentionnéaudébut decechapitre,unedesnormesdedescriptiond’unestructureXML est le DocumentObject Model, DOM1. La modélisationDOM d’un documentXML consisteàdécrirecedocumentcommeungraphecomposéd’objetsappartenantàunensembledéterminédetypesdenœuds,la compositiondesobjetsétantrégiepardesrèglesqui définissentla grammairedeXML.

DOM estunespécificationdehautniveau,indépendanted’un langageparticulier. Uneconnaissancedesconceptsorientés-objetdebaseestdoncsuffisante.Nousdonnonsunepremièreprésentationdesaspectsessentielsdecettespécification,avantdela compléterpardesexemples.

2.2.1 Typesde nœudsDOM

DanssareprésentationDOM, un documentXML estessentiellementun arbreconstituédenœudsdedif-férentstypes.Lestypesdenœudssontdéfinissousformed’interfaces. Ainsi, un documentXML devientun objetqui contientd’autresobjetsavecdespropriétéset méthodesqui peuventêtreutiliséespourécriredesapplicationsXML 2. Le tableau2.2résumetouslestypesdenœudsfournisparDOM.

Type deNœuds CatégoriesyntaxiqueXMLDocument documentXML (racine)DocumentType typedu document(DTD)ProcessingInstruction instructiondetraitementElement élémentXMLAttrib ute attribut XMLEntity déclarationd’entitéEntityReference référenceversentitéComment commentaireCharacterData commentaireet sectiondetexteText sectiondetexteCDataSection sectionCDATADocumentFragment fragmentdedocumentXMLNotation notation(fait partiedela DTD)

Table2.2: TypesdenœudsDOM

1La présentationqui suit correspondauDOM (Core) Level1.2CommeJava,DOM utilise la notiond’interfacepoursoulignerl’indépendanced’un langagedeprogrammationetd’uneimplan-

tationspécifique.Nousallonsutiliser dansla suitele termetypeDOM poursoulignerlesaspectsstructurauxet interfaceDOM pourlesaspectsliés à la programmation.

Page 65: Comprendre XSLT

2.2. LE MODÈLE DOM 65

La plupartdecesinterfaces(onzesurtreize)correspondentauxdifférentscatégoriessyntaxiquesXMLquenousavonsdécritespage56. LesseulesexceptionssontDocumentFragmentet Notation :! L’interfaceDocumentFragmentestessentiellementdestinéeà faciliter la programmationet corre-

spondà uneversionallégéedel’interfaceDocument. Elle peutêtreignoréesansdommagedanslecontexteXSLT.! L’interfaceNotation correspondà unenotion faisantpartiede la DTD du documentet elle permetà uneapplicationXML dechoisir lesactionspourtraiterdesdonnéesnon-XML dansle contenududocument.

TouscesinterfacessontconsidéréesparDOM commedesspécialisationsd’uneinterfaceNodedontilshéritenttouteslespropriétésetméthodes.La figure2.1montrecettehiérarchiedespécialisation(l’interfaceDocumentFragmentn’apparaîtpasdansla figure). LesinterfacesTreeNode, Leaf et Containermontrées

Node

Leaf

ProcessingInstruction

Text

CDataSection

Comment

Attribute

Entity

ReferenceElement

DocumentType

DocumentEntity

TreeNode

DataCharacter

Container

Notation

Figure2.1: HiérarchiedespécialisationdesinterfacesDOM

dansla figure2.1nefont paspartiedumodèleDOM, maisnouslesavonsajoutéespourclarifier le rôledesdifférentsinterfacesdansunearborescenceDOM :! l’interfaceTreeNodepermetdedifférentierlesattributsXML qui correspondentàdesnœudsdetype

Attr desautresnœudsd’unearborescenceDOM : nousrevenonssurcettequestionci-dessous;! parmilesnœudsdetypeTreeNodenousdistinguonsceuxqui acceptentdesfils (typeContainer), etceuxqui sontforcémentdesfeuillesdel’arbre (typeLeaf).

Le modèleDOM spécifieuneinterfacede programmationqui permetsoit de modifier un document,soit de l’inspecteren vue d’en extrairedesinformations,point de vue quenousprivilégions. Toutescesopérationssontdisponiblessousformedepropriétés3, etdeméthodespropresà chaquetypedenœud.

3Nousutilisonsle motpropriétéaulieu decelui,pluscourammentemployé,d’attribut afindenepasintroduiredeconfusionaveclesattributsXML.

Page 66: Comprendre XSLT

66 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Avantd’y revenirendétail,nousintroduisonstrois interfacessupplémentairesqui définissentquelquesstructuresde donnéesnécessairesà représentationcomplèted’une arborescenceDOM. Cesinterfacesnesontpasreprésentéesdansla hiérarchiedela figure2.1.

2.2.2 Interface DOMString

Dansle modèleDOM, commedansla syntaxeXML, unechaîneestuneséquencedecaractèresUnicode.Ce systèmed’encodageest largementrépandudansles applicationsinformatiqueset aussiutilisé, parexemple,dansle langageJava pour la représentationdeschaînesdecaractères(le typeDOMString peutêtredirectementimplantéparle typeStringdeJava). Le standardUnicodedéfinit chaquecaractèreparunentiersurdeux(16-bit Unicode)ou quatreoctets(16-bit Unicodeétendu).Plusprécisément,DOM (et larecommandationXML) distingueentre5 lescaractèresblancs: #x9(tabulation),#xA(sautà la ligne),#xD (retourchariot)et #x20. Générale-

ment,onutiliseunereprésentationhéxadécimalequi permetdereprésenterunevaleurpardeuxsym-bolesdansl’ensemble6-798;:;:):<8>=98;?48;:;:):@8>ACB . Ainsi, lesentiers#x9, #xA, #xD et #x20correspondentauxentiers9, 10,13 et32 dansle systèmedécimalpourla représentationdesentiers;5 lescaractères16-bit Unicodedont lesvaleurshéxadécimalessontcomprisesentre#x21et #xD7FF,etentre#xE000et #xFFFD;5 lescaractères16-bitUnicodeétendu,dontlesvaleurshéxadécimalessontcomprisesentre#x10000et#x10FFFFetentre#xE000et#xFFFD. Bienquela représentationinternedescaractères«étendus»soit deuxfois plus longue(4 octets)quela représentationdesautrescaractères(2 octets),toussontconsidéréscommedescaractèressimples(une position) dansles fonctionsqui calculentla tailled’unechaînedecaractèresou la positiond’un caractère.

DansDOM, la comparaisondedeuxchaînesdecaractèress’effectuesur la représentationUnicodedeleurscaractèresetprenddoncencompteainsila cassedeschaînescomparées.

2.2.3 InterfacesNodeList et NamedNodeMap

DOM définit deuxinterfacessupplémentairespermettantde constituerdesgroupesde nœuds.Cesdeuxinterfacessontutiliséespourdécrirelesrésultatsdecertainesméthodes.

Le typeNodeList correspondàla notiondetableauindicé. Il représenteuneliste(ordonnée)denœuds.Cesnœudsnesontpastousforcémentdemêmetype.NodeListpeutpermettreparexemplelamanipulationde l’ensembledesfils d’un nœudde l’arbre, parmi lesquelson peut trouver desnœudsde type Text,Element, CDataSection, etc.

Le type NamedNodeMapcorrespondà la notion de tableauassociatif(ou tablede hachage).Il sertà représenterun ensemble(doncsansordre)denœudsidentifiésparun nom. Cetypeestessentiellementdestinéà géreruneliste d’attributsXML.

2.2.4 Interface Node

Le type Node est la racinede toutesles autresinterfacesproposéespar DOM. Il définit les propriétésessentielleset fournit la plusgrandepartdesopérationsimportantesdansDOM.

Lespropriétésspécifiéesparl’interfaceNodesontrécapituléesdansle tableau2.3.Lestroispremièrespermettentdedéterminerles informations« locales» concernantun nœud,c’est-à-diresontype,sonnometsavaleursousformed’un objetdetypeDOMString . Le nomet la valeurneconstituentpasdesnotionspertinentespourtouslestypesdenœuds: un nœuddetypeText parexemplen’a pasdenom,et un nœuddetypeElementn’a pasdevaleur.

On peut remarquerquedansune spécificationobjet plus rigoureusel’information sur le nom ou lavaleurne devrait pasapparaîtreà un niveauglobalNodemaisau niveaud’une interfacespécialiséespé-cifique aux sous-typesde Node ayantsoit un nom, soit une valeur, soit les deux. DOM n’adoptepasunetelle approche,d’unepartparcequeXML s’y prêteassezdifficilement,d’autrepartpourdesraisons

Page 67: Comprendre XSLT

2.2. LE MODÈLE DOM 67

Propriété TypenodeType unsignedshortnodeName DOMStringnodeValue DOMStringparentNode NodefirstChild NodelastChild NodechildNodes NodeListpreviousSibling NodenextSibling Nodeattributes NamedNodeMap

Table2.3: Propriétésdu typeNode

d’efficacitéde l’implantation. On peutdoncaccéderà touteslesopérationsnécessairesauniveaudu typeNode, à chargepourle programmeurdetesterle typed’un objetappartenantà l’interfacegénériqueNodepoursavoir quellessontlesopérationsappropriées(techniqueditedecasting, àéviterenprincipedansuneapprocheobjet).La propriétéNodeTypeestjustementdestinéeàeffectuercetest.

Cetteconceptionconstitueune limite de DOM, modèlequi se trouve à mi-cheminentreune mod-élisationconceptuellerigoureuseet indépendantede l’implantation, et descompromistechniquesim-poséespardescritèresd’efficacitéou defacilitédedéveloppement.L’inconvénientestqu’il fautconnaîtrel’interprétationdespropriétésenfonctiondu typedenœud,cequeprésentele tableau2.4.

Type de nœud nodeName nodeValueCDATASection #cdata-section contenudela sectionCDATAComment #comment contenudu commentaireDocument #document NULLDocumentType nomdela DTD NULLElement nomdel’élément NULLProcessingInstruction nomdela cible le contenu(moinsla cible)Text #text contenudu nœudTextNotation nomdenotation(voir page154) NULLEntity nomdel’entité NULLEntityReference nomdel’entité référencée NULLAttr nomdel’attribut valeurdel’attribut

Table2.4: InterprétationdespropriétésnodeNameet nodeValue

La figure 2.2 montreuneinstanced’un documentDOM, avec deschoix de représentationquenousadopteronsdanstoutela suitedecelivre etqu’il estbondesoulignerdèsmaintenant.

Danschaquenœudfigurenttrois informations: le typeDOM (premièreligneengras),sonnom(deuxièmeligne)et la valeur(troisièmeligne). Commesoulignéprécédemment,le nomet la valeurnesontpertinentsquepour certainstypesde nœuds.Par exempleles nœudsDOM de type Text ont unevaleurmaispasdenom,cequenousreprésentonsparun symbole«–» dansla deuxièmeligne, et, à l’in verse,lesnœudsDOM detypeElementont un nom,maispasdevaleur. Danscecasla troisièmeligne estabsente.

L’arbre DOM de la figure 2.2 contientneuf nœudsdont deux sont desattributs. Pour simplifier ladescriptiondecetarbre,nousidentifionschaquenœudparunentierouuncaractère(s’il s’agitd’un attribut)écrit entreparenthèsesà côtédu type du nœud.La racine(nœud1) du documentestde type Documentet contientun fils unique(2) de type Element. L’élémentracinea deuxattributs (notésa et b) et deuxsous-éléments(3 et 5) de typeElement. Le premierélément,de typeB (il ne fautpasconfondrele type

Page 68: Comprendre XSLT

68 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document (1)-

Element (2)A

Attr (a)

at1val1

Attr (b)

att2val2

Element (3)B

Texte (4)-

texte1

Element (5)B

Comment (6)-

comment

Texte (7)-

texte2

Figure2.2: Instanced’un arbreDOM

d’un nœudDOM avecle typed’un élément)et contientun seulnœuddetypeText ; le deuxièmeélémentcontientun commentaireet du texte. Si on parcourtcet arbreà partir de la racine,en allant de gaucheà droite et en profondeurd’abord,on obtient la séquencede nœuds1 2 3 4 5 6 7 (on remarquequelesattributsn’apparaissentpasdansceparcours).

Propriétésstructur ellesde Node

La structurearborescenteet lesliensqui permettentdesedéplacerdanscettestructuresontreprésentésparlesautrespropriétés(saufattributs) del’interfaceNode(tableau2.3,page67).

Parmi lespropriétésstructurelles,la plusimportanteestchildNodesqui estdetypeNodeList et donnela liste desfils d’un nœudde type Container. La structuregénéraled’un arbreDOM estmontréedansla figure 2.3. Pourchaquetype de nœudon indiqueles enfantspossiblespar un arc. Tousles arcssontétiquetésparchildNodes[], le symbole[] indiquantquelesfils sontstockéssousformed’unelisteordonnée.

Leaf ContainerchildNodes[]

childNodes[]

Figure2.3: Structuregénéraled’un arbreDOM

Voici lesautrespropriétés:

1. parentNoderéférencele pèred’un nœud;

2. firstChildet lastChild référencentrespectivementle premieret le dernierfils ;

3. previousSiblinget nextSibling référencentrespectivementle frère gaucheet le frère droit4. Deuxnœudssontsiblings’ils ont le mêmepère,maispass’ils sontaumêmeniveaudansl’arbremaisavecdespèresdifférents.

Le tableau2.5montrela«valeur» decespropriétéspourquelquesnœudsdel’arbreDOM présentédansla figure2.2: pourlespropriétésparentNode, firstChild, lastChildpreviousSiblinget nextSiblingla valeurcorrespondàuneréférenceversunnœudreprésentéparsonidentificateur. LapropriétéchildNodesretourneuneliste denœuds(NodeList) qui estreprésentéeparuneséquenced’entiersentrecrochets.Finalement,

4Le motsiblingenanglaisdésigneindifféremmentle frèreou la sœur, etn’a malheureusementpasd’équivalentenfrançais.Nousutiliserionsvolontiersle mot «sœur» si «nœud» étaitdugenreféminin...

Page 69: Comprendre XSLT

2.2. LE MODÈLE DOM 69

la propriétésattributesretourneun ensembled’attributs (NamedNodeMap) quenousreprésentonssousformed’un ensembled’identificateursd’attributs(unensembleestnoté{} pourle différentierd’uneliste).

Bien entendu,tout ou partiedecesvaleurspeuventêtreà NULL (nondéfinies): il nepeutpasy avoirdepèrepourun nœuddetypeDocument, pasdefils, defrèreprécédentousuivantpourtouslesnœudsdetypeLeaf.

Touteslespropriétésstructurellesprécédentess’appliquentà touslesnœudsDOM (mêmelesattributs)etcontiennentcommevaleurpourlesnœudsqui nesontpasdetypeContainerdeslistesvides(parexemplepour childNodes) ou la valeurNULL. Il faut noterquela propriétéparentNoden’est pasdéfiniepour lesnœudsdetypeAttrib ute.

Propriété Nœud ValeurparentNode 1 NULL

2 1firstChild 5 6

6 NULLlastChild 5 7

6 NULLchildNodes 2 [3, 5]

4 NULLpreviousSibling 3 NULL

5 3nextSibling 2 NULL

3 5attributes 2 {a, b}

4 NULL

Table2.5: Propriétésstructurellespourl’arbreDOM dela figure2.2

DespropriétéscommefirstChild ou lastChild ne font jamais référenceà desattributs. Le dernièrepropriétédel’interfaceNodequenousn’avonspasdétailléestattributes. Cettepropriété,seulementdéfiniepour les éléments,estde type NamedNodeMapqui fournit un ensembled’opérationspour inspecteretmettreà jour lesattributsd’un élément.

Remarque: Bienquel’interfaceNamedNodeMappermettedechoisirunattribut parsonnom(méthodegetNamedItem() ) et par saposition(méthodeitem() ), rappelonsqueles attributsd’un élémentnesontpasordonnés.En d’autrestermes,si deuxélémentssedistinguentseulementpar l’ordre desattributsdansla propriétéattributes, ils sontconsidéréscommeidentiques.

Opérationsdu type Node

PassonsmaintenantauxopérationsdutypeNode, donnéesdansle tableau2.6.Ellespermettentdemodifierundocumentenajoutant,remplaçantetsupprimantlesfils d’unnœud.LesméthodeshasChildNodes()et hasAttributes() permettentde vérifier l’existencedefils ou d’attributset la méthodecloneN-ode() permetdecréerunecopied’un nœud(ainsiquedetoussesdescendantssi la valeurdu paramètrebooléenprof esttrue ).

Certainesde cesopérationsne sontpasautoriséessur certainstypesde nœuds,commepar exemplel’insertiond’unfils pourunnœuddetypeText. Il estdoncdela responsabilitédecelui/cellequiprogrammeuntraitementdes’assurerqu’aucuneopérationinterditenepourraêtredéclenchéeparle traitement,cequilà encoremontrequeDOM nes’appuiequepartiellementsurlesconceptsorientés-objet.

Page 70: Comprendre XSLT

70 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Résultat Méthode Paramètres ExplicationNode insertBefore() Nodenouv ,

NodefilsInsertion du nœud nouv avant le filsfils ; retournenouv

Node replaceChild() Nodenouv ,Nodeanc

Remplacementdu fils anc par le nœudnouv ; retourneanc

Node removeChild() Nodefils Suppressionde fils dansla liste desfils;retournefils

Node appendChild() Nodenouv Ajout dunœudnouv àla fin dela listedesfils; retournenouv

boolean hasChildNodes() Retournevrai si le nœudà des fils etfaux sinon

Node cloneNode() booleanprof Retourneunecopiedu nœud

Table2.6: Opérationsdu typeNode

Exemple: parcoursd’un arbr eDOM

Lespropriétéset lesméthodesde l’interfaceNodepeuventêtreutiliséespourcréerdesprogrammes.Parexemple,la fonctionsuivanteréaliseunparcoursd’un arbreDOM enpré-ordre, c’est-à-direenprofondeurà gauche:

fonction parcours_préordre( Node nœud) {print nœudD id ;print ’ ’;si nœudD hasChildNodes()

pour tous les nœuds fils dans nœudD childNodesparcours_préordre( fils );

}

La fonctionparcours_préordre() prendunnœudDOM commeargumentetutiliselespropriétésnodeNameetchildNodeset la méthodebooléennehasChildNodes() del’interfaceNode. La propriétéid nefait paspartiedel’interfaceNodeetelledonnelesidentificateursdesnœudsquenousavonsintroduitplushaut.

L’applicationdecettefonctionà un nœudimprimed’abordl’identificateurdu nœudsuivi d’un espace,vérifie ensuitesi le nœuda desfils et,si c’estle cas,effectueun parcourspourchacundesfils dansl’ordredela liste childNodes. Le résultataffichéparla fonctionparcours_préordre() pourtouslesnœudsdansl’arbredela figure2.2estdonnédansle tableau2.7.

Appel de fonction Paramètre Résultat affichéparcours_préordre() 1 1 2 3 4 5 6 7

2 2 3 4 5 6 73 3 44 45 5 6 76 67 7

Table2.7: Parcoursenpré-ordredel’arbreDOM dela figure2.2

Pour les feuilles (4, 6 et 7), la fonction affiche uniquementleurs identificateurs.Pour les nœuds3et 5, elle affiche l’identificateurdu nœudsuivi de sesenfants(qui sontdesfeuilles). En remontantdans

Page 71: Comprendre XSLT

2.2. LE MODÈLE DOM 71

l’arborescenceon arrive à la racinequi produit l’affichagede tousles nœudsdu documents(saufles at-tributs)dansl’ordre.

Commenousl’avonsdéjàremarqué,l’ordre desnœudsestsignificatif(toujoursenexcluantlesattributsXML). Deux documentsayantles mêmesnœudsmais pasdansle mêmeordreserontdonc considéréscommedifférents. Cettenotion d’ordre est reflétéepar le type de la propriétéchildNodesqui est uneliste denœudset permetdedistinguerlesfils d’un élémentpar leur position(le premierfils, le deuxième,etc.. . ). Ceci signifie,enpratique,qu’un traitementqui parcourtla liste desfils d’un élémentnedonnerapasforcémentle mêmerésultatsi l’ordre vien àchanger.

Reprenons,parexemple,l’arbre de la figure2.2,maisenchangeantl’ordre desfils de la racineet deceuxdu nœud5 (la figure2.4).

Document (1)-

Element (2)A

Attr (a)

at1val1

Attr (b)

att2val2

Element (5)B

Texte (7)-

texte2

Comment (6)-

comment

Element (3)B

Texte (4)-

texte1

Figure2.4: Instanced’un arbreDOM avecun ordredifférent

Maintenant,si on appliquela fonction parcours_préordre() aux nœudsde l’arbre de la fig-ure 2.4, on constateque le résultatdansle tableau2.8 est différent du résultatdu parcoursde l’arbred’origine.

Appel de fonction Paramètre Résultat affichéparcours_préordre() 1 1 2 5 7 6 3 4

2 2 5 7 6 3 43 3 44 45 5 7 66 67 7

Table2.8: Parcoursenpré-ordredel’arbreDOM dela figure2.4

2.2.5 Interface Document

La structured’un documentXML bienformédoit respecterdescontraintesprécises.Ainsi, chaquearbreDOM qui correspondà un documentXML a uneseuleracinedetypeDocumentqui représentela racined’un documentXML (à distinguerde l’élémentracinedu document).Dansun arbreDOM, tout accèsaucontenud’un documentpassedoncinitialementparcenœud.

Le nœudDocumentdoit obéirauxrèglessuivantes:

Page 72: Comprendre XSLT

72 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

5 il a uneliste de fils comprenantun nombrequelconquede nœudsde type ProcessingInstruction,Commentetun – un seul– nœuddetypeElement. Cenœudestl’élémentracinedu document;5 il peut avoir (ce n’est pasobligatoire)un fils de type DocumentType qui doit apparaîtreavantl’élémentracineet qui correspondà la définitiondu typedu document(voir page154).

Lesnœudsqui précèdentl’élémentracineconstituentle prologuedu documentXML, et lesnœudsquisuivent l’épilogue.

Nom Typedoctype DocumentTypeimplementation DocumentImpldocumentElement Element

Table2.9: Propriétésdu typeDocument

Le tableau2.9 donnelespropriétésdu typeDocument. La propriétédoctypeestde typeDocument-Type et contientla DTD du documentXML. Elle està NULLsi la DTD estabsente.La propriétéimple-mentationestutiliséepour référencerl’objet «créateur» du documentde typeDocumentImpl. Souvent,maispasobligatoirement,cetobjetcorrespondauparseurqui génèreunereprésentationDOM àpartird’undocumentXML. Finalement,la propriétédocumentElementréférencel’élémentracinedu document.

Un nœuddetypeDocumentfournit desopérationspermettantdecréertouslesautresnœudsd’un arbreDOM. Cetyped’objetagitdonccommeune«fabrique» desdifférentstypesdenœudsd’unearborescenceDOM. Le tableau2.10donnequelques-unesdecesopérations:

Résultat Méthode ParamètresElement createElement() DOMString nom

Text createTextNode() DOMString texteComment createComment() DOMString texte

CDATASection createCDATASection() DOMString texteProcessingInstruction createProcessingInstruction() DOMString cible , texte

Attr createAttribute() DOMString nomEntityReference createEntityReference() DOMString nom

Table2.10:Opérationsdu typeDocument

ChaqueméthodecreateX() créeun objet de type X à partir desparamètresqui sontfournis sousformedechaînesdecaractèresdetypeDOMString (voir section2.2.2).Nousavonsvu dansla section2.1queceschaînesdecaractèresdoiventrespecterquelquescontraintesquandil s’agit d’un nomd’élément,d’un nomd’attribut ou d’unecible dansuneinstructiondetraitement(ProcessingInstruction). Enpartic-ulier, ils nedoiventpascontenird’espaces.

2.2.6 InterfacesElementet Attr

Un élémentXML estun arbreet peutcontenirdescommentaires,du texte, desréférencesverslesentitéset d’autreséléments.De plus, un élémentpeut avoir zéro, un ou plusieursattributs. Nous avons déjàsoulignéqu’un attribut estdetypeNodemaisn’estpastraitédela mêmefaçonquelesautresnœudsd’unarborescenceDOM. Il existeplusieursraisonsà cettedistinction:5 lesattributsnepeuventapparaîtrequecommefils d’un élément;5 lesattributsd’un élémentnesontpasordonnés;5 unélémentnepeutpasavoir plusieursattributsdemêmenom.

Page 73: Comprendre XSLT

2.2. LE MODÈLE DOM 73

Pour toutescesraisons,on peut considérerchaqueélémentà la foi commeun nœuddansun arbreDOM, et commela racined’un arbrenon-ordonnédont les fils sontdesattributs. Cesdeuxrôlesd’unélémentsontindépendants: on nemélangejamaislesfils «DOM » d’un élémentet sesfils detypeAttr .Cettedistinctionestillustréedansla figure2.5parla représentationdedeuxcompositionsdifférentes.

Element Attribute

TreeNode

attributes{}

childNodes[]

Figure2.5: Structured’un élément

Lesopérationsdéfiniespourlesélémentssontdonnéesdansle tableau2.11.

Résultat Méthode Paramètres ExplicationDOMString getAttribute() DOMString

nameRetourne la valeur de l’attributname

DOMString setAttribute() DOMStringname,DOMStringvalue

Affectela valeurvalue àl’attributname; retournevalue

void removeAttribute() DOMStringname

Supprime l’attribut avec le nomname dela listed’attributs

Attr removeAttributeNode() Attr oldAttr Supprimel’attribut oldAttr etre-tournel’attribut supprimé

Attr getAttributeNode() DOMStringname

Retourne la valeur de l’attributname

Attr setAttributeNode() Attr newAttr Insèrel’attribut newAttr danslaliste desattributs (si un attribut dumêmenom existe déjà il est rem-placé);retournel’attribut remplacéou NULL

NodeList getElementsByTagName() DOMStringname

Retournela liste desélémentsde-scendantsdont le type est égalà name; le résultat est trié dansl’ordre d’un parcoursenpré-ordre

void normalise() normalise le contenutextuel d’unélément: un élémentnormalisénecontientpasdenœudsdetypeTextadjacent(toussontfusionnésenunseulnœud).

Table2.11:Opérationsdu typeElement

L’opérationdenormalisationestutile si on a ajouteplusieursnœudsdetypeText consécutifscommefils d’un élément: dansla versionsérialiséedu mêmeélément,cesfils consécutifsne peuvent plus êtredistinguésl’un de l’autre. Ainsi, l’application de la méthodenormalise() à tous les élémentsd’unarbreDOM donneun nouvel arbrequi correspondexactementà l’arbre qu’on obtientparunesérialisationsuivie d’uneanalyseparunparseurDOM. Celapeutêtreimportantdansle casoùonutilisedesopérationsqui dépendentdu nombreou dela positiondesfils d’un élément.

Page 74: Comprendre XSLT

74 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

2.2.7 InterfacesDocumentType,Entity et EntityReference

La DocumentTypeDefinition (DTD) d’un documentXML est représentéepar un nœudde type Docu-mentType. Il estoptionnelet nepeutapparaîtrequ’uneseulefois dansun arbreDOM, commepropriétédu nœudDocument. DansDOM, la seuleinformationqui estaccessibleà partir decetteinterfaceestlalisted’entitéset denotationsdéclarésdansla DTD.

Lanotiond’entitépermetdedécomposerundocumentenplusieursentitésphysiquequi sontréférencéesdansle un document.Les interfacesEntity et EntityReferencesontsurtoutimportantespour le passaged’une représentationsérialiséeà une représentationDOM. Elles permettentde rassemblerdesinforma-tions distribuéespourcréerun nouveaudocumentet représententprécisémentla structurephysiqued’undocumentXML.

Unefois la représentationDOM créée,la structurephysiqueinitiale devient peuimportanteet on peutseconcentrersur la vision logiquedu document.Nousn’allonspasnousappesantirsurcesnotionsplusquenécessaire,etconsidéreronsquelesréférencesauxentitéssontrésolues(autrementdit la référenceestremplacéeparla valeur)aumomentdel’applicationd’un programmeXSLT. Ainsi, avecla disparitiondesentités,la DTD d’un documentdevient uneboîtenoirequi nepeutplusêtreexaminéeparun programmeXSLT.

2.3 Du documentsérialiséà l’arbr eDOM

Nous allons maintenantcomparerla version«sérialisée» d’un documentXML avec sa représentationsousformed’un arbreDOM. Cettecomparaisonpermetdecomprendrele passaged’unereprésentationàl’autre: dansle sensXML – E DOM, cepassagecorrespondàl’ analysed’un documenttexteparunparseur(processeurXML) qui construitunearborescenceDOM pourle traitementdudocumentparunprogramme.Le sensDOM – E XML correspondà la sérialisationd’un arbreDOM, sousformededocumenttexte.

Voici un documentXML contenantdesélémentsavecattributs.

Exemple22 ExXML2DOM1.xml: Fichier XML avecattributs

<?xml version=’1.0’ encoding="ISO-8859-1"?><A at1="val1">

<B>du texte</B><C>

<D at2="0">autre texte</D><D at2="1">texte</D>

</C></A>

Le premierattribut est défini dansl’élément F A E . Sonnom estat1 est sa valeurestval1 . Cetélémenta deuxfils F B E et F CE dont le premiercontientun texte et le deuxièmecontientde nouveaudeuxfils avecun attribut at2 chacun.L’arbreDOM correspondantestmontrédansla figure2.6.

Les attributs sontégalementreprésentéssousforme de nœudsdansl’arbre DOM (figure 2.6). Nousleur affectonsunereprésentationdifférenteà causedeleurscaractéristiquesspécifiques.

Voici un autreexempleavecuneinstructiondetraitementet un commentaire:

Exemple23 ExXML2DOM2.xml: DocumentXML avecinstructionsdetraitementetcommentaires

<?xml version=’1.0’ encoding="ISO-8859-1"?><?xml-stylesheet href="feuille.xsl" type="text/xsl"?><A>

<C><!-- un commentaire --><D at1="1">un &lt; et un &gt;</D>

</C></A>

Page 75: Comprendre XSLT

2.3. DU DOCUMENTSÉRIALISÉÀ L’ARBRE DOM 75

Document-

ElementA

ElementB

Texte-

du texte

Attrat1val1

ElementC

ElementD

Texte-

autretexte

Attrat2

0

ElementD

Attrat2

1

Texte-

texte

Figure2.6: ReprésentationDOM dufichier XML

Cedocumentcontientuneinstructiondetraitementdansla deuxièmeligne – bienquesyntaxiquementconformeà la définition, la premièreligne du documentn’estpasuneinstructionde traitement.La cibledecetteinstructionestxml-stylesheet et elle indiqueauprocesseurXSLT l’URL du programmeetle type du transformationà appliquer. Enfin le commentairedansla cinquièmeligne estunedescriptioncourtedel’élémentqui suit. Lesinstructionsdetraitementet lescommentairessontégalementreprésentéssousformedenœudsdansl’arbreDOM (figure2.7). Onpeutégalementconstaterquelesréférences&lt;et &gt; onétéremplacéesparleursvaleursrespectivesdansle fils detypeTextedel’élémentD.

Document-

Instructionxml-stylesheet

href="feuille.xsl"type="text/xsl"

ElementA

ElementC

Comment-

uncommentaire

ElementD

Attrat1

1

Text-

un G etun HFigure2.7: ReprésentationDOM aveccommentaireset instructionsdetraitement

Au momentde l’analyse,le processeursebasesur descaractèresréservéscomme F , E et & pourstructurerle document.En contrepartiele contenutextuel ne peutpascontenirde balises,ni mêmedecaractèrescomme F ou E puisqueceux-civont êtreinterprétéscommefaisantpartiedu marquage.LessectionsCDATA permettentdeprévenircetteinterprétation.

Exemple24 ExXML2DOM3.xml: DocumentXML avecunesectionCDATA

<?xml version=’1.0’ ?><A>&lt;B&gt;<![CDATA[

Page 76: Comprendre XSLT

76 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

<?xml version=’1.0’ ?><A>

&lt;B&gt;&lt;/B&gt;

</A>]]>&lt;/B&gt;</A>

Dansl’exempleci-dessus,le contenutextuel du documentXML comprendle contenud’un nœuddetype Text («Voici l’exempled’un documentXML ») et le contenud’une sectionCDATA. La figure 2.8montrel’arbreDOM correspondant.

Document-

ElementA

Text-G B H

CDATASection-G ?xmlversion=’1.0?HG A H

&lt;B&gt;&lt;/B&gt;G /A H

Text-G /B H

Figure2.8: ReprésentationDOM avecunnœuddetypeCDATASection

2.3.1 Construction d’un arbre DOM

Nousallonsmaintenantétudierplus en détail le schémade constructiond’un arbreDOM à partir d’undocumentXML sérialisé.Voici un fichier XML simpleavecquatreéléments:

Exemple25 ExXML2DOMa.xml: Fichier XML

<?xml version=’1.0’ encoding="ISO-8859-1"?><A>

<B>texte simple</B><C>

<D> </D></C>

</A>

Le documentXML estreprésentéelinéairementsousla formed’unechaînedecaractères,et structuréà l’aide debalisesqui peuventêtredistinguéesdesinformationstextuellesparlessymbolesF et E qui lesentourent.La constructiondel’arbreDOM consisteàparcourircettechaîneséquentiellementenappliquantl’algorithmeci-dessous,décrità l’aide desopérationsDOM qui ont étéprésentéesdansla section2.2.

Document fonction parseDoc(Stream fic ){Document document = new Document;appeler parse(fic, document, document);retourner document; }

Page 77: Comprendre XSLT

2.3. DU DOCUMENTSÉRIALISÉÀ L’ARBRE DOM 77

fonction parse(Stream fic , Document document , Node père) {Node fils;DOMString fragmentXML;DOMString filsType;boolean finNode = false;tant que le flux fic n’est pas vide et not finNode {

fragmentXML = lireToken( fic );si fragmentXML est une balise fermante

finNode = true;sinon {

filsType = getType(fragmentXML);fils = document D create( filsType ) ;père D appendNode(fils);si filsType est un sous-type de Container

appeler parse( fic , document , fils);sinon

fils D value = extractValue(fragmentXML);}

}}

Voici quelquesexplications:5 La fonction parseDoc() peutêtreconsidéréecommeune implantationsimplifiéed’un parseurDOM : elleprendcommeargumentunfichierXML fic etretourneundocumentdetypeDocumentqui estle résultatde l’analyse. Elle créetout d’abordun nœudde typeDocument qui estensuiteenvoyécommeparamètreà la fonctionparse() .5 La fonctionparse() effectuel’analysedufichier fic passéenparamètre.Enplusdesparamètres,elledéfinitquatrevariablesqui représententrespectivementunfils dunœudàconstruire(fils ), sontype (filsType ), un fragmentdu documentXML (fragmentXML ) à analyseret unevariablebooléennequi estégaleà true si l’analysedu nœudpère estterminée.

Ensuite,la fonction entredansune bouclequi lit successivementle fichier à analyseret s’arrêtequandle fichier est consomméou l’analysedu nœudactuelest terminé. Chaqueétapede cetteboucleeffectuelestâchessuivantes:

– La fonction lireToken() (codenonspécifié)séparelessegmentsdu flux decaractèresparrapportà leur typeDOM. Ainsi cettefonctiondoit reconnaîtretouteslesbalises(ouvrantesetfermantes),maiségalementdistinguerlesnomsd’attributset leur valeurs,et ainsidesuite.

– Si le fragmentretournépar la fonction lireToken() estunebalisefermante,on sortde laboucleet dela fonctionparse() enmettantfinNode à true .

– Sinonla fonction getType() (codenon spécifié)déterminele type du fragmentXML parsabalise(un fragmentsansbaliseestreconnucommeun nœuddetypeText). Cetypepermetensuitedecréerun nœuddu mêmetypequi seraajoutécommefils du nœudpère :

père D appendNode(fils)

Si le fils peutavoir lui-mêmedesfils, c’est-à-dires’il estde type Container, on fait un appelrécursifdela fonctionparse() avecle fils commenouveaupère.Sinonle fils estunefeuilleet savaleurestle fragmentXML retournéparla fonctionextractValue() .

Ce parseuresttrèssimplifié et, par exemple,ne prendpasen comptela la DTD du documentet lesentités.Néanmoinsil devrait permettreunemeilleurecompréhensiondu passageXML –> DOM.

L’application de cet algorithmeau documentprécédentest illustrée dansle tableau2.12. Pendantl’analysed’un documentXML, les espaces(#20 ) et retoursà la ligne (#xA) sont considéréscomme

Page 78: Comprendre XSLT

78 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Fragment lu Codeexécuté<A> b=aD createElement(A);

aD appendNode(b);parse(fic,a,b);

#xA#x20 c=aD createTextNode(#xA#x20);bD appendNode(c);

<B> d=aD createElement(B);gD appendNode(d);parse(fic,a,d);

texte simple e=aD createTextNode(textesimple);dD appendNode(e);

</B> retour(d)#xA#x20 f=aD createTextNode(#xA#x20);

bD appendNode(c);<C> g=aD createElement(C);

bD appendNode(d);parse(fic,a,g);

#xA#x20#x20 h=aD createTextNode(#xA#x20#x20);bD appendNode(h);

<D> i=aD createElement(D);gD appendNode(i);parse(fic,a,i);

#x20 j=aD createTextNode(#x20);i D appendNode(j);

</D> retour(i)#xA#x20 k=aD createTextNode(#xA#x20);

gD appendNode(k);</C> retour(g)#xA l=aD createTextNode(#xA);

bD appendNode(l);</A> retour(b)

Table2.12:Fragmentationdu documentXML

descaractères.En effet, la normedu W3C préconisequetousces«blancs» doivent être transmissansmodificationparle parseurà l’application.L’arbreDOM résultantestreprésentédansla figure2.9.

2.3.2 Traitement desespacespendant la construction

EnétudiantcetarbreDOM on peutobserverqu’il existesix nœudsdetypeText – identifiésparlesentiers3, 6, 8, 10,11et12– qui necontiennentquedesespaces(white-spacenode). Touscesnœuds(white-spacenode) saufle nœud10 apparaissentcommenœud«séparateurs» entredeuxéléments.Le nœud10 estleseulfils d’un élémentdetypeD.

Souventlesespacesentredeuxélémentsnesontpasporteursd’uneinformationsignificativeetserventessentiellementà améliorerla lisibilité d’un documentsérialiséparunehiérarchisationdu contenu.Aussi,la recommandationXML a décidéde distinguerentreles nœuds-espacesignificatifset non-significatifs:cettedistinctionestseulementpossiblesi le documentauneDTD etsi onutiliseunparseurXML validantqui vérifie la conformitédu documentparrapportàsaDTD.

XSLT permetégalementde distinguerespacessignificatifset non-significatifs.Néanmoins,les créa-teursdeXSLT ont décidéquecetteséparationnedoit pasdépendredu parseurutilisé avant le traitement

Page 79: Comprendre XSLT

2.3. DU DOCUMENTSÉRIALISÉÀ L’ARBRE DOM 79

Document (1)-

Element (2)A

Text (3)-

#xA#x20

Element (4)B

Text (5)-

textesimple

Text (6)-

#xA#x20

Element (7)C

Text (8)-

#xA#x20#x20

Element (9)D

Text (10)-

#x20

Text (11)-

#xA#x20

Text (12)-

#A

Figure2.9: ReprésentationDOM dufichier XML

XSLT, maisuniquementdu contenusourcedu documentet du programmeXSLT. Ainsi, un programmeXSLT supposepardéfautquetouslesespacesdansun document(plusprécisémentdansl’élémentracinede ce document)sont transmisau programme,à l’exceptiondesespacesdansles valeursd’attributs quisubissentun traitementspécifiques,et desfins delignesqui sontnormaliséeset représentéespar le carac-tère#xA .

Nous n’avons pasreprésenté,pour desraisonsde lisibilité; tous les espacesdansles arbresDOMjusqu’ici. Nouscontinueronsà le faire quandles espacesne sontpascruciauxpour la représentationducontenud’un documentou pourla compréhensiondu comportementd’un programme.

2.3.3 Deux fonctionsde navigation

Pourconclurecettepartiesur la syntaxe XML et le modèleDOM, voici deuxexemplesde fonctionsquipermettentd’extraire desélémentsdansun documentXML. Elles prennentcommeargumentun nœudDOM et unechaînedecaractèresqui correspondautypedesélémentsfils recherchés.

boolean fonction testNode( Node node , DOMString elType ) {retourner (node D nodeType == ELEMENT_NODE)et

( elType == “*” ou node D nodeName == elType );}

NodeList fonction child( Node node , DOMString elType ) {Node fils;DocumentFragment résultat = new DocumentFragment;integer i=0;tant que i < node D childNodes() D length() {

fils = node D childNodes() D item(i) ;si testNode(fils, elType) ;

résultat = résultat D appendChild(fils)i = i+1;

}retourner résultat D childNodes() ;

Page 80: Comprendre XSLT

80 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

}

La fonctionchild(node, elType) parcourttouslesfils dunœudsnode et vérifieavectestN-ode() quele nœudcorrespondà un élémentde typeelType (cetteconditionestégalementvérifiéesielType estégalà «* »).

L’évaluationdecettefonctionavecdifférentsnœudsdel’arbreDOM correspondantaufichierExXML2DOM.xmlestillustréedansle tableau2.13. Nousutilisonstoujoursnosidentificateurspourdistinguerentrelesdif-férentsnœudsdel’arbre.

Appel de fonction Résultatchild(1,"*") [2]child(1,"A") [2]child(1,"B") []child(2,"*") [4,7]child(2,"B") [4]child(2,"C") [7]child(2,"D") []

Table2.13:Applicationdela fonctionchild() àExXML2DOMa.xml

La fonctionsuivantecherchelesélémentsparmi lesdescendantsde typeElement du nœuddonnéetutilise la fonction testNode() définieplushaut.

NodeList fonction descendant( Node node , DOMString elType ) {Node fils;DocumentFragment résultat = new DocumentFragment;NodeList descList;integer i=0, j;tant que i < node D childNodes() D length() {

fils = node D childNodes() D item(i) ;si testNode(fils, elType)

résultat = résultat D appendChild(fils)descList = descendant(fils, elType) ;nombreDesc = descList D length() ;j = 0;tant que j < descList D length() {

résultat = résultat D appendChild(descListitem(j)) ;j = j+1;

}i = i+1;

}retourner résultat D childNodes() ;

}

Commela fonctionchild() , cettefonctionparcourtlesfils du nœuddonnéet sélectionneceuxquisatisfontle critèredesélectiondéfini par le paramètreelType . Mais elle nes’arrêtepaslà, et demande,par un appelrécursifavec le mêmecritèrede sélection,les descendantsde toussesfils. L’évaluationdecettefonctionestillustréedansle tableau2.14.

L’appeldescendant(1,"*") , ou 1 estl’identificateurde la racinedu document,retournetouslesélémentsdu documentXML.

Page 81: Comprendre XSLT

2.4. LE LANGAGEXPATH 81

Appel de fonction Résultatdescendant(1,"*") [2,4,7,9]descendant(1,"A") [2]descendant(1,"B") [4]descendant(1,"C") [7]descendant(1,"D") [9]descendant(2,"*") [4,7,9]descendant(2,"B") [4]descendant(2,"C") [7]descendant(2,"D") []

Table2.14:Applicationdela fonctiondescendant() à ExXML2DOMa.xml

2.4 Le langageXPath

Le modèleDOM définit les opérationsapplicablesà un documentXML, soit pour en modifier la struc-ture (exemplede la fonction parse() ), soit pour «naviguer» au sein de ce document(exemplesdesfonctionschild() et descendant() ).

Le termede«navigation» quenousavonsutilisé assezintuitivementjusqu’àprésent,peutêtredéfiniplusprécisémentcommele référencement, à partir d’un nœudcontexte, de un ou plusieursautresnœudsdel’arbreDOM. Le langageXSLT estfortementfondésurcetypederéférencement.

Bien quelesopérationsapplicablesauxobjetsconstituantun arbreDOM fournissentun moyenpréciset puissantd’effectuerun tel référencement,ellesimpliquentun recourssystématiqueà la programmationqui s’avèreraitassezlourd. Le langageXPath fournit desexpressionsbeaucoupplus simpleset concisespourdésignerdesnœudsdansunarbreDOM àl’aide dechemins.Ceréférencements’effectueendécrivantlesparcours– ou chemins– qui partentdunœudcontexteet mènentauxnœudsréférencés.

Voici quatreexemplesd’utilisationdeXPathcommelangagederéférencementdansXSLT :

1. Sélectionde nœudsauxquelson souhaiteappliquerunerègle: dansce casl’expressionXPath ap-paraîtdansl’attribut select d’une instructionXSLT de type xsl:apply-templates . Parexemplel’instruction XSLT suivante:

<xsl:apply-templates select="CINEMA/SALLE"/>

va sélectionnertousles nœudsde type SALLE, fils d’un nœudde type CINEMA, lui-mêmefils dunœudcontexte.

2. Sélectionde règlesqui doivent être appliquéesà des nœuds: l’expressionXPath apparaîtdansl’attribut match . Parexemplela règlesuivante:

<xsl:template match="FILM/TITRE">...</xsl:template>

pourrauniquementêtreappliquéaux élémentsde type TITRE , qui sontdesfils d’autresélémentsdetypeFILM . Seulun sous-ensembledesexpressionsXPath(les«patterns») peutêtreutilisé dansl’attribut match (voir page119).

3. Extractiondevaleurs: parexemplel’expression:

<xsl:value-of select="SALLE/@NO">

extrait la valeurdel’attribut NOd’un élémentdetypeSALLEfils dunœudcontexte.

Page 82: Comprendre XSLT

82 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

4. Prédicatsdetest: voici un exemplerencontrédansle premierchapitre:

<xsl:if test=" ($titre = ’’ or TITRE = $titre)and ($seance = ’’ or HEURE&gt;= $seance)and ($ville = ’’ or VILLE = $ville)">

2.4.1 ReprésentationXPath d’un documentXML

XPaths’appuiesurunemodélisationDOM restreinte: seulscertainstypesd’élémentssontconsidérés,et iln’estpaspossibledemodifierle documentsourceoudecréerdenouveauxdocuments.Ceslimitationssontcompensées– et justifiées– par la grandesimplificationqui en résulte.Le sous-ensembledesinterfacesDOM pris encompteparXPathestmis enévidencedansla figure2.10parun fondgris.

Comment Text

ProcessingInstruction

Document Element

Attribute

Node

Leaf

Entity

Reference

DocumentType

Entity

CDataSection

TreeNode

DataCharacter

Container

Notation

Figure2.10:Sous-ensembledesinterfacesDOM prisencompteparXPath

LesarbresDOM restreintsauxnœudsconnusparXPathserontdésignésquandbesoinestparle terme«arbresXPath» danscequi suit.

On nepeutdonctraiteravecXPath la DTD d’un documentXML (un nœuddetypeDocumentType)oudesréférencesversdesentitésexternes(nœudsdetypeEntity etEntityReference). Concrètement,celasignifiequ’uneapplicationfaisantappelàdesexpressionsXPath– parexempleunprocesseurXSLT – doitrésoudreaupréalablelesréférencesauxentitéset nepasprendreencomptela DTD, hypothèsesquenousavionsdéjàenvisagéesprécédemment.

En ce qui concerneles sectionslittérales(de type CDataSection), les simplificationssuivantessonteffectuées:

1. Le contenudesnœudsCDataSectionesttransforméentexte; toutcepassedonccommesi cetypedenœudétaitenfait detypeText, avecuncontenutransmistel quelparle parseur. CettetransformationdessectionsCDATAennœudsdetypeText estnaturellecar l’interfaceCDataSectionestun sous-typedel’interfaceText.

Page 83: Comprendre XSLT

2.4. LE LANGAGEXPATH 83

2. Puis,si plusieursnœudstextessontfrèresetadjacentsdansl’arbreDOM, ils sontréunisdansl’arbreXPath.

La secondeopérationvise à satisfaire unerèglede basede XML : la séparationd’un texte d’un seultenantendeuxpartiespourconstituerdeuxnœudsdistinctsn’est pasautorisée.Si on n’opéraitpascetteopérationdefusion(ditenormalise() dansDOM), l’arbreobtenuaprèsla premièresimplificationci-dessus(transformationdeCDataSectionenText) seraitincorrect.

Prenonsunexemplepourillustrer cettesimplification.La figure2.11montreunarbreDOM avecdeuxnœudsfrèresadjacents.Le nœuddetypeCDataSectioncontientdescaractèresréservésqui n’auraientpaspu passertelsquelsla phasedeparsings’ils n’étaientpasinclusdansunesectionlittérale.

Document-

ElementEXEMPLE

Text-

Du texte

CDATASection-

Ceciestunesectionlittéraleavecdes’&’, des’ G ’ et des’ H ’

Figure2.11:Un arbreDOM avecdeuxnœudsdetypeText et CDataSection

XPath travaille sur une versionsimplifiée de cet arbredanslaquelleles deux nœudsont été fusionnés(figure2.12). On constatedoncqu’il estpossiblede trouver descaractèresréservés(voire desbalisesoudesdocumentsXML entiers)danslesnœudsText desarbresXPath.

Document-

ElementEXEMPLE

Text-

Du texteCeciestunesectionlittéraleavecdes’&’, des’ G ’ et des’ H ’

Figure2.12:L’arbretraitéparXPath,aprèsregroupement

Un deuxièmepointdéjàsoulevédéjàplusieursfois danscelivreconcernele traitementdesespacesdansundocumentXML. Nousavonssignaléquela recommandationXML préconisela propagationdetouslesespacesblancsdansun documentXML à l’application qui traite le document.Voici doncun documentXML simpleavecdesespaces:

Exemple26 ExBlanc.xml: Fichier XML avecdesespaces

Page 84: Comprendre XSLT

84 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

<?xml version="1.0"encoding="ISO-8859-1"?>

<?xml-stylesheet href="ex.xsl"type="text/xsl"?>

<!-- commentaire -->

<!DOCTYPE A SYSTEM"ex.dtd" ><A>

<B at1=’ val1 ’at2=’ valeurs avec blancs ’

/><C> </C><D> texte </D>

</A>

En comptantbien,on peutvérifier quecedocumentcontientunetrentained’espacesqui peuventêtrecaractérisésparrapportà leur positiondansle document.Ainsi, on trouvedesespaces:5 avantla baliseouvrantedel’élémentracine;5 à l’intérieur d’unebalise;5 à l’intérieur d’un élément;5 à l’intérieur dela valeurd’un attribut ;5 entredeuxbalises;5 entredeuxattributs.

Unegrandepartiedecesespacesnejouepasun rôle significatif pour l’interprétationdu contenud’undocumentXML parXPath.Ainsi, il estévidentquela plupartdesespacesqui apparaissentavantl’élémentracinedu documentou dansdesnœudsde typesDOM qui nesontpasreprésentésdansXPath– commela déclarationXML ou la DTD – n’ont pasde significationet peuvent être ignorés. De même,certainsespacesservent uniquementcommeséparateursentredescomposantssyntaxiquesXML. C’est vrai parexemplepour lesespacesséparantlesattributsd’un élémentqui peuventêtre«simplifiés» ou remplacésparun espacesimple.

Enprenantencomptetoutescesremarques,le documentsuivantestéquivalentaudocumentprécédentdu pointdevuedeXPath:

<?xml-stylesheet href="ex.xsl" type="text/xsl"?><!-- commentaire --><A><B at1=’ val1 ’ at2=’ valeurs avec blancs ’/><C> </C><D> texte </D>

</A>

Aprèscettepremièreéliminationdesespacesnon-significatifs,XPathconsidèrequele parseurXML aeffectuélestransformationssuivantesavantdepasserlesdonnéesauprocesseurXSLT :

1. touteslesfinsdelignessontreprésentéesparle caractère#xA ;

2. les valeursd’attributs sont normaliséeset ne contiennentquedescaractèresblancs(#x20 ). Lesautrescaractères(#xA et #xD) nesontpaséliminésmaisremplacésparle #x20 . Danscertainscas(quandl’attribut n’estpasdetypeCDATA– voir section4.1) lescaractèresaudébut et à la fin delavaleursonteffacés.Si, parexemple,l’attribut at1 estdetypeNMTOKEN(voir page154),savaleurdevient«val1 ».

Page 85: Comprendre XSLT

2.4. LE LANGAGEXPATH 85

Document-

Instructionxml-stylesheet

href="ex.xsl" type="text/xsl"

Comment-

un commentaire

ElementA

Text-

#xA#20

ElementB

Attrat1

#20val1#20

Attrat1

#20valeurs#20avec#20blancs#20

Text-

#xA#20

Text-

#xA#20

ElementC

Text-

#20

Text-

#xA#20

ElementD

Text-

#20texte#20

Text-

#xA#20

Figure2.13:ArbreXPathdu documentExBlanc.xml

L’arbreXPathdu documentrésultantestdonnédansla figure2.13. Parmi lesespacesqui restent,onpeutdistinguerceuxqui setrouvent:

1. entredesélémentsouentred’autrestypesdenœudsDOM ;

2. commeuniquefils d’un élément(élémentdetypeD), dansun nœuddetypeText (" texte " ).

Cesontsurtoutlesdeuxpremierscasqui sontintéressants,caril représententdessituationsambiguësconcernantl’interprétationdesespaces:

1. Dansle casoù un espaceapparaîtcommenœuddetypeText entredeuxéléments,on peutsouventconsidérerqu’il sertuniquementà augmenterla lisibilité dudocument.

2. Dansle deuxièmecas,la questionestdesavoir si l’élémentdoit êtreconsidérécommevideou pas.

XPathnepermetpasuntraitementspécifiquedecescas,maisXSLT fournit lesinstructionsnécessairespour rendrecessituationsnon-ambigues.Une de ces instructionsest xsl:xsl:strip-space quipermetdedésignerunelistedetypesd’élémentsdontlesfils constituésuniquementd’espacepeuventêtresupprimés(strip). Ainsi, par exemple,la commandesuivantesupprimece type de nœudpour tous lesélémentsdu document:

<xsl:strip-space elements="*"/>

En ajoutantcetteinstructionaudébut d’unefeuille destyle,le documentprécédentdevient équivalentaudocumentsuivant,qui necontientplusdenœudsd’espace(normalementle documentcontientuneseuleligne quenousavonscoupéendeuxà causedela largeurlimitée despagesdecelivre):

<?xml-stylesheet href="ex.xsl" type="text/xsl"?><!-- commentaire --><A><B at1=’val1’ at2=’ valeurs avec blancs ’/><C/><D> texte </D></A>

L’arbreXPathdecedocumentestdonnédansla figure2.14.On remarquequel’élémentdetypeC estmaintenantunélémentvide et lesespacesdansle textedel’élémentDn’ont pasétésupprimés.

Page 86: Comprendre XSLT

86 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document-

Instructionxml-stylesheet

href="ex.xsl" type="text/xsl"

Comment-

uncommentaire

ElementA

ElementB

Attrat1val1

Attrat1

#20valeurs#20avec#20blancs#20

Comment-

autrecommentaire

ElementC

ElementD

Text-

#20texte#20

Figure2.14:ArbreXPathaprèssuppressiondesnœudsconstituésd’espaces.

2.4.2 ExpressionsXPath

Le langageXPathdésigneun ou plusieursnœudsenexprimantdescheminsdansun arbreconformeà lastructuredécriteprécédemment.L’évaluationd’un chemindonneun résultatqui peutêtresoit unevaleurnumériqueou alphanumérique,soit un sous-ensembledesnœudsde l’arbre. Enfin cetteévaluationtientcompted’un contextequi déterminele résultat.

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.15:Exempled’un arbreXPath

Nousallonsdévelopperchacunde cesaspectsci-dessous,en prenantpour exempleprincipal l’arbrede la figure 2.15. Commeon peut le constatercet arbreprésenteà peu prèstous les typesde nœudsmanipulablespar XPath, avec plusieursconfigurations.Rappelonsquedansnosreprésentationschaquenœudestcaractériséparlestroiscomposantssuivants:

1. le typeDOM du nœud,toujoursprésent,engras;

2. le nompourlesnœudsdetypeElement (ou la ciblepourle typeProcessingInstruction) ; pourtouslesautrestypesdenœudil n’y a pasdenom;

Page 87: Comprendre XSLT

2.4. LE LANGAGEXPATH 87

3. la valeur, valablepour tousles typesde nœuds,y comprisles attributs,à l’exceptiondu typeEle-ment.

Cet arbreestobtenuà partir du documentsérialisésuivant,quevouspouvez récupérersur notresitepourtesterlesexpressionsXPath(lesoutilspermettantd’effectuercestestssontprésentésdansl’annexeA).

Exemple27 ExArbreXPath.xml: Le fichier XML pour lesexemplesXPath

<?xml version="1.0" encoding="ISO-8859-1"?>

<?java ins1?><A>

<B att1=’a1’><D>Texte1</D><D>Texte2</D>

</B><B att1=’a2’>

<D>Texte2</D></B><C att2=’a3’ att3=’15’/>

</A><!-- CommFin -->

CheminsXPath

Un cheminpeut être absolu, et prendreson origine à la racinedu document,notée«/ ». Par exemplel’expression:

/A/B/@att1

correspondàun cheminqui partdela racinedu document(«/ »), puispasseparl’élémentracinesi le typede cet élémentestA, parcourttousles élémentsde typeB fils de cet élémentracine,et enfindésignelesattributsatt1 decesélémentsB. La figure 2.16montreles deuxnœuds,de type Attr , désignésparceschemins.

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.16:CheminverslesattributsdesnœudsB

Page 88: Comprendre XSLT

88 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Un cheminpeutégalementêtrerelatif etprendrepourorigineunnœuddudocument,dit nœudcontexte.En pratiquel’utilisation de cheminsrelatifs est la plus répandueavec XSLT puisquele principede baseconsisteà déclencherdesrèglesà partir de nœudsconsidéréscommeles nœudscontextesdescheminsXPath.L’expression(noterl’absencedu «/ » initial) :

A/B/@att1

désigneuncheminqui partantd’un nœudcontextedetypequelconque, passesuccessivementparlesnœudsde type A, B et aboutit aux attributs de nom att1 . Ce type d’expressionesten principeplus puissantpuisqu’il s’appliqueà touslestypesdedocumentsdanslesquelson retrouveun motif decetype,quelquesoit par ailleursla positionrelative de cemotif par rapportà la racinedu document.On peutconsidérerun cheminabsolucommeune forme particulièrede cheminrelatif danslaquelle le nœudcontexte estsystématiquementla racinedudocument.

SyntaxeXPath

Un cheminestconstituéd’unesuited’étapes,séparéespardes«/ ». La formegénéraleestdonc:

[/]étape I /étape J /.../étape Kle «/ » initial étantoptionnel,et distinguantlescheminsrelatifsdescheminsabsolus,commenousl’avonsexpliquéprécédemment.

Chaqueétapepeutelle-mêmesesubdiviserentroiscomposants:

1. l’axe qui définit le sensdeparcoursdesnœudsà partir du nœudcontexte;

2. le filtre qui indiquele typedesnœudsqui serontretenusdansl’évaluationdu chemin; la notiondetype recouvreici les typesDOM (commentaire,texte, instructionde traitement,...)ainsi que,pourlesélémentset lesattributs,le nomdela baliseou del’attribut ;

3. le (oules)prédicat(s)qui exprime(nt)despropriétésquedoiventsatisfairelesnœudsretenusàl’issuedufiltragepourêtrefinalementinclusdansle résultat.

La formegénéraled’uneétapeestdonc:

axe::filtre[prédicat1][prédicat2] :):;:Signalonsdèsmaintenantqu’il estpossible,quandon utilise XPathavecXSLT, d’effectueruneunion

de cheminsavec l’opérateur« |». Par exemplel’expression« //A | B/@att1 » désignel’union desensemblesdésignésparlesexpressions« //A » et «B/@att1 ».

Les expressionsde cheminsque nousavons utiliséesjusqu’ici correspondaientaux formesles plussimplesdu langageXPath. En particulier, commenousl’avonssoulignédansle chapitre1, nousn’avonsjamaisjusqu’ici eurecoursauxprédicatsqui sontoptionnelsetnousavonstoujourschoisid’utiliser commeaxesdeparcourslesfils ou lesattributsdu nœudscontexte. Le premieraxe, notéchild dansXPath,estégalementconsidérécommecelui par défaut. Le deuxièmeaxe, notéattribute , estdistinguépar lesymbole«@» avantle nomdel’attribut. On peutnoterquelesattributssonttraitésparun axespécifique.

Évaluation d’une expressionXPath

L’évaluationd’une étapepeutêtresoit unevaleur, soit un ensemblede nœuds(node-set). Nouslaissonsde côté,jusqu’àla page103, le casdesvaleurspour nousconcentrersur le casoù l’évaluationrevient àdésignerun ensembledenœudsdu documentsource.

Il estbondenoterqu’unnœudn’estjamaisextrait dudocumentet placéhorsdesoncontexte(àsavoirsapositiondansl’arbre). Un node-setdoit doncplutôt êtreconsidérécommeun ensemblede référencesversdesnœudsdel’arbreDOM. Notonségalementqu’unmêmenœudnepeutêtreréférencéqu’uneseulefois dansun mêmeensemble.

Quanduneexpressionestconstituéede plusieursétapes,on setrouve en généraldansla situationoùl’évaluationdechaqueétapedonneunensembledenœuds.L’évaluationdel’expressioncomplèteestalorsbaséesurlesprincipessuivants:

Page 89: Comprendre XSLT

2.4. LE LANGAGEXPATH 89

5 àpartir du nœudcontexte,on évaluel’étape1; on obtientun ensembledenœuds;5 on prendalors,un parun, lesnœudsdecetensemble,et on lesconsidère chacunà leur tour commenœudcontextepour l’évaluationdel’étape2 ;5 la règleprécédentesegénéralisecommesuit: àchaqueétape,onprendsuccessivementcommenœudcontextechacundesnœudsfaisantpartiedu résultatdel’étapeprécédente.

Reprenonsun desexemplesdonnésprécédemmentpourclarifier cetteévaluation:

/A/B/@att1

L’expressionci-dessusestuncheminabsolu,constituédetroisétapes,dontle nœudcontexte initial estdoncla racinedudocument(figure2.17).L’axederecherchen’estjamaisindiqué,etonsuitdoncceluipardéfaut,child , consistantàparcourirlesfils du nœudcontexte.

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.17:Le nœudcontexte initial

À partir dela racine,on évaluedoncl’étape1. Le filtre estA : on rechercheun nœudfils, dont le typeDOM estElement, et le nomdebaliseA. Si onle trouve,il nepeuty enavoir qu’unseulcarc’estl’élémentracinedudocument: le résultatdel’étape1 estdoncun ensembleréduità unseulnœud(figure2.18).

Maintenanton prendcenœudcommecontexte, et on évaluel’étape2 dont le filtre estB. Le résultatde cetteévaluationva êtrel’ensembledesnœudsdont le type DOM estElement, et le nom de baliseB(figure2.19).

Enfin, on va prendrechaquenœudde typeB commenœudcontexte, et on chercherapour chacununattribut att1 : le résultatfinal estun ensembled’attributs,autrementdit denœudsdont le typeDOM estAttr . Onobtientle résultatdela figure2.16,page87.

L’évaluationdu chemin/A/B/@att1 peutégalementêtre illustré par un programmequi utilise lafonctionchild( Node node, DOMString elType) . Cettefonctionprenaitcommeparamètreunnœud– le nœudcontexte – et un nomd’élément.Le résultatétait l’ensembledesfils detypeelType dunœudcontexte. Voici un fragmentde programmequi évaluele chemin/A/B/@att1 (on supposequedoc correspondaunœudracinedu document):

Page 90: Comprendre XSLT

90 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.18:Premièreétapedel’évaluationdu chemin/A/B/@att1

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.19:Secondeétapedel’évaluationdu chemin/A/B/@att1

Page 91: Comprendre XSLT

2.4. LE LANGAGEXPATH 91

pour tous les fils a dans child(doc, "A")pour tous les fils b dans child(a, "B")

pour tous les fils at dans attributes(b, "att1")ajouter at à la liste du résultat

Ceprogrammeutilise égalementunefonctionattributes() dont la définitionesttrèssimilaireàla fonctionchild() .

Contexted’évaluation

Chaqueétaped’uneexpressionXPathestévaluéeenfonctiond’un ensembled’informationsqui constituentle contexte de l’évaluation. Il est trèsimportantd’être conscientquele contexte changeà chaqueétape,d’unepartpourcomprendrele résultatd’uneévaluationXPath,d’autrepartpourconstruirecorrectementdesexpressions.

Cecontexte comprendenpremierlieu le nœudquenousavonsappelénœudcontexte jusqu’àprésent,à partir duquelsontconstruitslescheminsdesétapessuivantes.Mais le contexted’évaluationd’uneétapecomprendégalementl’ensemblede nœudsobtenupar l’évaluationde l’étapeprécédente,constituantlecontextecommund’évaluationpourchaquenœudpris individuellement.

Reprenonsl’exempleprécédentpourclarifier cettenotiondecontexte. L’expressionXPathest

/A/B/@att1

avec trois étapes.À l’issue de la secondeétape,correspondantau filtre B, on obtientun ensemblecom-portantdeux nœuds,représentédansla figure 2.19. Cet ensembleva constituerle contexte communàl’évaluationdel’étapesuivante,@att1 .

Lesnœudsdecetensemblesontalorsconsidéréschacunleurtourentantquenœudcontexte. L’évaluationdel’étape@att1 s’effectueautantdefois qu’il y adenœudscontextes,entenantcompteducontextecom-mun. En pratique,on pourraconnaîtrela positiond’un nœuddanssoncontexte (fonction position()) ousavoir si un nœudestle dernierde soncontexte (fonction last()). Ici il y a deuxpositions,1 et 2, carac-térisantlesdeuxoccurrencesdenœudsdetypeB.

Le contexte d’évaluationd’une étapedansuneexpressionXPath comprendégalementdesvariables,desfonctionset desespacesnominaux, aspectscomplémentairessurlesquelsnousreviendronsultérieure-ment.

2.4.3 Lesaxes

Nousprésentonsmaintenantdemanièreexhaustive lesoptionsdestrois composantsd’uneétapedansuncheminXPath(axes,filtres et prédicats),encommençantparlesaxes.Rappelonsquetout axes’interprèteparrapportà un nœudcontexte. Un axeXPathrecouvrealorslesdeuxnotionssuivantes:

1. unsous-ensembledesnœudsdel’arbre relatif aunœudcontexte;

2. l’ordre deparcoursdecesnœudsà partir dunœudcontexte.

Le tableau2.15donnela liste desaxesXPath. Touscesaxesdésignentdesnœudsdel’arbre DOM, àl’exceptiondel’axeattribute qui s’appliqueà l’arbredesattributset namespace qui s’appliqueauxespacesdenom,cedernieraspectétantlaissédecôtéjusqu’auchapitre6.

Il esttoujourspossibledespécifieruneétapeXPathendonnantpouraxe un desnomsde la premièrecolonnedu tableau2.15.Certainesfacilitésd’écrituresontcependantpermises:5 quandl’axen’estpasindiquédansuneétape,c’estchild qui estpris pardéfaut;5 certainsaxespeuventêtrenotésde manièreabrégée,commeparexemple«@» qui remplaceat-

tribute .

Nous décrivons maintenantchaqueaxe, en prenantcommeexemplede référencel’arbre de la fig-ure2.20,aveccommenœudcontexte le secondnœuddetypeB, commeillustré surla figure.

Page 92: Comprendre XSLT

92 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Axe Descriptionchild Lesfils dunœudcontexteattribute Lesattributsdunœudcontexteparent Le pèredunœudcontextedescendant Touslesdescendantsdunœudcontexteancestor Touslesancêtresdunœudcontexteself Le nœudcontexte lui-mêmepreceding-sibling Touslesfrèresgauchesdu nœudcontextefollowing-sibling Touslesfrèresdroitsdu nœudcontextepreceding Lesnœudsprécédantle nœudcontextedansl’ordre deparcoursdudoc-

umentfollowing Lesnœudssuivantle nœudcontextedansl’ordre deparcoursdu docu-

mentdescendant-or-self Lesdescendantsdu nœudcontexte,et le nœudcontexte lui-mêmeancestor-or-self Lesancêtresdu nœudcontexte,et le nœudcontexte lui-mêmenamespace S’appliqueauxespacedenoms: voir chapitre6

Table2.15:LesaxesXPath

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.20:ExemplederéférencepourlesaxesXPath

L’axe child

L’axe child désigneles fils du nœudcontexte. Cet axe ne s’appliquepasaux attributs, maisprendencompteen revanchetousles autrestypesde nœudsDOM. La figure 2.21montrel’unique nœuddésignéparcetaxeà partir denotrenœudcontexte.

L’axepeutêtreutilisé explicitement:

/child::A/child::B/child::D

Mais le plus souvent on omettral’indication child pour se reposersur l’interprétationpar défaut.L’expressionci-dessousestdoncéquivalenteà la précédente:

/A/B/D

Notonsque l’évaluationde l’expressionci-dessus,appliquéeà notre arbre-exemple,donnetous lesnœudsdetypeD.

Page 93: Comprendre XSLT

2.4. LE LANGAGEXPATH 93

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.21:L’axechild

L’axe attribute

Cetaxeconstitueuneexceptioncaril estle seulàs’appliqueràl’arbredesattributs.Cetarbreestlui-mêmetrèsparticulierpuisqu’il a toujourspour racineun nœudde typeElement, et un seulniveauconstituédefeuilles,nonordonnéesmaisidentifiéesparleur nom,lesattributs.

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.22:Résultatdeattribute::att1

En conséquence,l’axe seratoujoursutilisé dansla dernièreétaped’uneexpressionXPath,et l’attributseradésignéparsonnom.L’étapepermettantdesélectionnerl’attribut denomatt1 àpartirdenotrenœudcontexte (figure2.22)estdonc:

attribute::att1

On utilise le plussouventl’abréviation@nompourremplacerattribute::nom (remarquezla dis-paritiondes::). Onnoteradoncl’étapeprécédentedemanièreéquivalente:

@att1

Page 94: Comprendre XSLT

94 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

L’ensembledesattributs de nom att1 associésà un élémentde type B lui-mêmefils d’un élément-racinedetypeA estdoncdésignéparl’expression:

/A/B/@att1

L’axe parent

Cetaxedésignele nœudpèredunœudcontexte(figure2.23).L’étapesuivantepermetdoncde«remonter»d’un niveaudansl’arbreàpartir denotrenœuddetypeB :

parent::A

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.23:Résultatdeparent::A

L’abréviationpour cetaxe est«..», conformémentà uneconventionlargementutiliséedansdessys-tèmesdefichiershiérarchiquesousUnix ouDOS.Enfait cetteabréviationn’estpasstrictementéquivalenteàparent::A qui utiliselefiltre Aalorsque«..» désignelenœudpèrequelquesoitsontype. L’équivalentde«..» ennotationdéveloppéeest:

parent::node()

où node() estun filtre qui sélectionnetousles typesde nœudsde l’arbre DOM (à l’exceptiondesat-tributs).

On peutcomposercet axe pour remonterd’un nombredonnéde niveauxdansl’arbre. Par exemplel’expressionsuivante:

../..

désigne,à partir de notrenœudcontexte de référence,la racinedu document.On pourraità partir de làredescendresur l’un destrois fils de la racine,maison rencontrealorsun problèmedenommagepuisqueseull’un decesfils estdetypeElement avecun nom. Nousverronspage98 commentutiliser desmodesderéférencementalternatifsaunommagedesnœuds.Onpeututilisernode() pouréviterceproblèmedenommage:

../../node()

Cetteexpressiondésignedonc les trois fils de la racinedu document,qui sontde trois typesdifférents.Notezbienquecetteexpressionestuneabréviationde

parent::node()/parent::node()/child ::node ()

où le dernieraxechild indiquebienquelesattributs– s’il y enavait – nesontpasconcernés.

Page 95: Comprendre XSLT

2.4. LE LANGAGEXPATH 95

L’axe descendant

Cet axe permetdedésignertouslesnœudsde l’arbre DOM principal (à l’exceptiondoncdesattributsetdesespacesdenom)qui sontdescendantsdu nœudcontexte. Voici l’expressiondonnantlesdescendantsdenotrenœudcontexte,toustypesconfondus(figure2.24):

descendant::node()

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.24:Résultatdedescendant::node()

Le filtre node() estici importantpourdésigneràla fois unnœuddetypeElementetunnœuddetypeText. Le premier, seul,seraitobtenupar:

descendant::D

et le secondpar

descendant::text()

L’axe ancestor

L’axe ancestor estréciproquededescendant : il désignetouslesancêtresdu nœudcontexte, et cequelquesoit leur type(toujoursà l’exceptiondu typeAttr ). La figure2.25montre,surnotreexemplederéférence,lesnœudsdésignéspar

ancestor::node()

L’axe self

Cetaxedésignele nœudcontexte lui-même.Le résultatdépendensuitedufiltre qui estappliqué.Surnotreexemple,l’expressionsuivante:

self::B

revientbienà sélectionnerle nœuddetypeB qui constituenotrenœudcontexte. En revanche

self::A

Page 96: Comprendre XSLT

96 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.25:Résultatancestor::node()

renverrait, toujourssur notreexemple,un ensemblevide puisquele nœudcontexte n’est pasde type A.Afin depouvoir désignerle nœudcontextesansavoir às’embarasserdedonnersontype,onutilisesouventl’expression

self::node()

qui utilise le filtre node(), validepourtout typedenœud(sauflesattributs!). Il existeunenotationabrégée,«. », pour self::node() , trèsfréquemmentutilisée. L’expressionsuivanteutilise doncdesnotationsabrégéepourdésignerl’attribut att1 dunœudcontexte:

./@att1

Sansutiliser la notationabrégée,cetteexpressions’écrirait:

self::node()/attribute::att1

Lesaxespreceding-sibling et following-sibling

Cesdeuxaxesdésignentrespectivementlesfrèresàgaucheetàdroitedunœudcontexte.La figure2.26montrel’axepreceding-sibling appliquéànotreexemple,avecun filtre node() .

preceding-sibling::node()

Onobtientévidemmentenl’occurrencele mêmerésultatavecl’expressionsuivante,dontle filtre limitela sélectiondesnœudsauxélémentsdetypeB :

preceding-sibling::B

Lesaxespreceding et following

Cesdeuxaxesdésignentrespectivementl’ensembledesnœudsqui précèdentou qui suiventle nœudcon-texte dansl’ordre de parcoursdu document.Rappelonsquecetordrecorrespond,pour la représentationarborescente,àun parcoursgaucheenprofondeurd’abord,etplussimplement,pourla représentationséri-alisée,àun parcoursséquentieldesnœuds.

La figure2.27montresurnotreexemplelesnœudssélectionnésparl’expression:

following::node()

Page 97: Comprendre XSLT

2.4. LE LANGAGEXPATH 97

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.26:Résultatdepreceding-sibling::node()

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

Nœud contexte

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.27:Résultatdefollowing::node()

Page 98: Comprendre XSLT

98 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Lesaxesdescendant-or-self et ancestor-or-self

Commel’indiquent leurs noms, cesaxes désignentrespectivementl’union desaxes descendant etself , et l’union desaxesancestor etself , Parexemplel’expressionsuivante:

descendant-or-self::node()

désignelesmêmesnœudsqueceuxdéjàmontrésdansla figure2.24,avecle nœudcontexteenplus.

2.4.4 Lesfiltr es

Un filtre permetd’éliminer un certainnombrede nœudsparmi ceux sélectionnéspar un axe. Il existeessentiellementdeuxfaçonsdefiltrer lesnœuds:

1. parleur nom;

2. parleur typeDOM.

Filtrage par nom

Le filtrageparnomnes’appliquequ’auxnœudspour lesquelscettenotiondenomestpertinente,à savoirceuxde typeElement, de typeProcessingInstructionet de typeAttr . Il s’effectuesimplementen indi-quantle nom,ou unepartiedu nom.

La plusgrandepartdesexemplesd’expressionXPathquenousavonsvusjusqu’àprésentcomprenaientun filtrageparnom.Parexemplel’expressionsuivante:

/A/B/D

désigne,enpartantde la racinedu document,l’élémentdenomA, puis lesélémentsde nomB fils deA,et enfin les élémentsde nom D fils de B. Les cheminsobtenussur notreexemplesontmontrésdanslafigure2.28.

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.28:Filtre avecnomsd’éléments(/A/B/D )

Page 99: Comprendre XSLT

2.4. LE LANGAGEXPATH 99

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.29:Filtre avecnomsd’attributs(/descendant::node()/@att2 )

Un filtrageavecnomd’attributsnepeutintervenir quedansla dernièreétaped’uneexpressionXPath(puisqu’unattribut esttoujoursun nœudfeuille). Voici par exempleuneexpressionqui désignetouslesattributs nommésatt2 , quelle quesoit par ailleurs leur position dansl’arbre. On combineune étape/descendant::node() qui, à partir de la racine,va sélectionnertous les nœudsà l’exceptiondesattributs,puispourchacundecesnœudson regardes’il existeun attribut att2 .

/descendant::node()/@att2

Le résultatestmontrédansla figure2.29.Il estpossiblededésignertouslesnœudsdetypeAttr (pour l’axe attribute ) ou detypeElement

(pour tous les autresaxes) avec le caractère«* ». L’expressionsuivanteva donc sélectionnertous lesattributsdel’arbre,quelquesoit leur nom:

/descendant::node()/@*

De mêmel’expressionsuivantesélectionnetousles élémentsfils de l’élémentracine F A E , quel quesoit leur nom:

/A/*

Le résultatestdonnédansla figure2.30.NotezqueseulslesélémentsdetypeElementsontconcernés,et pasceuxde typeComment, Text (qui n’ont pasdenom) ou ProcessingInstruction(qui peuventêtrefiltré différemment).

Filtr esur le type de nœud

Les filtres par nommagene concernentque les attributs ou les nœudsde type Element. Des filtresspécifiquesexistentdoncpour les autrestypes,à savoir Text, Comment et ProcessingInstruction. Letableau2.16montrelesfiltressurlestypesdenœuds.

Voici quelquesexemplespourillustrer l’utilisation decesfiltres. L’expression

/processing-instruction()

désignelesnœudsfils dela racinedudocumentdetypeProcessingInstruction. Enprenantnotreexempleon obtient le premierfils de la racinedu document.De même,pour désignerle troisièmefils, de typeComment, on utiliserait:

Page 100: Comprendre XSLT

100 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.30:Résultatde/A/*

Filtr e Descriptiontext() DésignelesnœudsdetypeTextcomment() DésignelesnœudsdetypeCommentprocessing-instruction() DésignelesnœudsdetypeProcessingInstructionnode() Désignetouslestypesdenœud

Table2.16:Lesfiltres surlestypesdenœud

/comment()

L’expressionci-dessusdésignetous les commentairesfils de la racine,sansqu’il soit possibled’êtreplusprécispuisqu’uncommentairen’a pasdecaractèredistinctif. En revancheon peutfaireréférencedemanièrepluspréciseà uneinstructiondetraitementenutilisantsonnom:

/processing-instruction(’java’)

Enfin le filtre text() désigneles nœudsde type Text. Voici l’exempled’une expressiondésignanttouslesnœudsdetextesituéssousun élémentF B E/A/B//text()

Notezl’utilisation dela notationabrégée«// ». Ennotationnonabrégéeon aurait:

/A/B/descendant-or-self::node()/tex t()

Le résultatdel’expressionappliquéeà notreexemplederéférenceestdonnédansla figure2.31.

2.4.5 Prédicats

La troisièmepartied’uneétapeestunprédicat, autrementdit uneexpressionbooléenneconstituéed’un ouplusieurstests,composésaveclesconnecteurslogiqueshabituelsand et or (la négationestfourniesousla formed’unefonctionnot()).

Un testesttouteexpressiondonnantunrésultatbooléen(true oufalse ). Enfait àpeuprèsn’importequelleexpressionpeutêtreconvertieenun booléenavecXPath,cequi donnebeaucoupdeliberté,auprixparfoisd’unecertaineobscurité.

Page 101: Comprendre XSLT

2.4. LE LANGAGEXPATH 101

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.31:Résultatde/A/B//text()

Un ensembledenœudsparexempleestinterprétécommetrue s’il n’estpasvide,et commefalsesinon.L’expression

/A/B[@att1]

adoncla significationsuivante: le prédicatestl’ensembledesattributsdenomatt1 desélémentsdetypeB. S’il n’y a pasd’attribut att1 l’ensembleestvide, doncil a pourvaleurbooléennefalse . Pourdireleschosessimplement,cetteexpressionsélectionnelesélémentsdetypeB qui ontun attribut att1 .

Les testspeuventégalementconsisterà exprimerdesconditionssur les valeursde certainsnœudsouvariables,et àappelerdesfonctionsparmicellesproposéesparXPath.

Prédicatssimples

Les fonctionsles plus utiliséessontprobablementposition() qui donnela position du nœudau sein decontexte, et last() qui donnela position du derniernœuddansle contexte (autrementdit le nombredenœudsdansle contexte puisqueles positionssontnumérotéesà partir de 1). Voici un premierexempled’uneexpressionXPathavecprédicat.

/A/B/descendant::text()[position()= 1]

Le résultatest celui de la figure 2.32: on obtient les premiersnœudsde type Text descendantdechacundesdeuxnœudsdésignéspar/A/B . Il esttrèsimportantdenoterquele prédicatd’uneétapeprendencomptele contexteconstituédel’ensembledenœudsobtenuparévaluationdel’axeetdu filtre decettemêmeétape.Ici l’étapeestévaluéedeuxfois, pourchacundesnœudsdetypeB, etàchaquefois le prédicatestappliquéauxnœudsobtenusparévaluationdedescendant::text() .

Revenonssur les fonctionsposition() et last(). Elle s’appuientsur unenumérotationdesnœudsdansun ensemble,elle-mêmefonctiondedeuxcritères:

1. l’ordre desnœudsdu documentXML ;

2. l’axeutilisé dansl’étapeXPath: la plupartdesaxesrespectentl’ordre du document(forward-axes),maisd’autres,dits reverse-axes, adoptentl’ordre inverse.La règlegénéraleestquetouslesaxesquipeuvent désignerdesnœudssituésavant le nœudcontexte (ancestor , ancestor-or-self ,preceding-sibling , et preceding ) sontdesreverse-axes.

Page 102: Comprendre XSLT

102 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.32:Résultatde/A/B/descendant::text()[position() =1]

Il estpossibledetesterlesvaleursdecertainsnœudsenfaisantréférenceà cesnœudspardesexpres-sionsXPath. Voici un premierexemplesimple: uneexpressionqui sélectionnetouslesélémentsdenomB ayantun attribut att1 dontla valeuresta1 .

/A/B[@att1=’a1’]

Lesprédicatspeuventainsi référencerdesnœudstrèséloignésdu nœudcontexte. Voici par exempleuneexpressionqui sélectionnetouslesnœudsdenomB si etseulementsi il existeunnœudfils del’élémentracinedoncle typeestCavecunattribut att3 ayantla valeur15 .

/A/B[/A/C/@att3=15]

On peuts’attendreà cequecetteexpressionsoit trèscoûteuseà évaluerpuisqu’il faudra,pourchaquenœudB, testerle prédicatensuivantle chemindansl’arbre DOM (à moinsd’utiliser un processeurXPathassezmalinpours’apercevoir quele résultatduprédicatestindépendantducontexteetpeutdoncs’évalueruneseulefois).

On peuteffectuerdescompositionsbooléennesdesconditionsélémentairesaveclesconnecteursandet or (le not estunefonctionnot() dansXPath). Voici uneexpressionqui prendle dernierélémentB filsdel’élémentracineA, et ceseulementsi cedernierélémenta unattribut att1 dontla valeuresta1 .

/A/B[@att1=’a1’ and position()=last()]

Composition de prédicats

L’utilisation d’une successionde prédicatsmarquéspar les crochets[ ] dénoteunecomposition. La dif-férenceessentielled’une telle composition,par rapportà l’utilisation de connecteurslogiquesand etor , estquel’ensembledenœudsissusde l’évaluationdu premierprédicatestpris commecontexte pourl’évaluationdu second,et ainsidesuite.Reprenonsl’exempleprécédentpourclarifier leschoses.

/A/B[@att1=’a1’ and position()=last()]

Onpourraittrèsbiendanscetexempleinverserlesdeuxtermesduand sanschangerla significationdel’expression: le prédicats’évaluedanslesdeuxcasenprenantpourcontextel’ensembledesnœudsobtenuà l’issuedeA/B . Prenonsmaintenantl’expressionsuivante:

/A/B[@att1=’a1’][position()=last()]

Page 103: Comprendre XSLT

2.4. LE LANGAGEXPATH 103

Ici onvapendretouslesélémentsB petit-fils dela racinedu documentqui ont un attribut att1 valanta1 (premierprédicat).Puisonévaluele secondprédicatpournegarderquele dernierparmilesnœudsquiont satisfait le premierprédicat.Si on inverselesdeuxprédicatson a l’expression:

/A/B[position()=last()][@att1=’a1’]

Ici on commenceparprendrele derniernœuddetypeB, et on ne le gardeques’il a un attribut att1detypea1 . Onobtientdoncunrésultatdifférent.

2.4.6 Typeset opérationsXPath

XPathfournit unsupportlimité poureffectuerdesopérationsoudescomparaisonssurdesnombresoudeschaînesdecaractères.Cesopérationsou comparaisonsimpliquentle plussouventun typage decertainespartiesd’un documentXML. On peutlesutiliser pour lesprédicats,afin detesterdesvaleursnumériquesparexemple,maisaussiavecXSLT quandon chercherà produireun résultatcalculéà partir desinforma-tions du documentsource. On peutvouloir par exempleprendredessous-chaînes,effectuerdescalculsarithmétiques,etc.

XPathconnaîtquatretypesdedonnées:

1. lesnumériquesutilisent la notationdécimalehabituelle,avecun point pourlesflottants(10.5)et unsignemoins(-) devantlesnombresnégatifs(-10);

2. leschaînesdecaractèressontconstituéesd’unesuitedecaractèresreconnusparle codagedu docu-ment,etdélimitéespardesguillemets(") oudesapostrophes(’) : attentionlesblancssontsignificatifs(“azerty” estdifférentde“ azerty“) ;

3. lesbooléenscorrespondentauxvaleurshabituellestrue et false ;

4. enfin lesensemblesdenœudssontun sous-ensemble,sansdoublon,desnœudsdu documentsource.

Les comparateursusuels( F , E , !=, =, F+L , E+L ) peuvent être utilisés pour tous les typesscalaires(numériques,chaîneset booléens).Pour les opérationson peutavoir besoind’effectueruneconversiond’un typeà un autre.Cesconversionspeuventêtresoit implicites, quandl’expressionindiqueclairementquel’une desopérandesappartientà un typedonné,soit explicitesaveclesfonctionsnumber(), boolean()et string().

Il fautbiennoterqu’undocumentXML estessentiellementunechaînedecaractèresstructuréepardesbalises,et n’est doncpastypé, commepeut l’être un programmeécrit dansun langagecommeJava ouC++, chaquevariabley étantdéclaréecommeappartenantà un certaintype. Il ne peutdoncy avoir degarantiequele résultatd’uneexpressionXPathpuisseêtreconverti dansle typeattendu,et cemêmesi ledocumentestvalide(conformeàuneDTD). Cependanttouteexpressionpeutêtreconvertie(« interprétée»)soit commeun booléen,soit commeunechaîne,ce qui est particulièrementimportantpour les raisonssuivantes:

1. lestestseffectuésdansXSLT (xsl:if , xsl:when ) peuventprendren’importequelleexpression,l’évaluer, etconsidérerle résultatcommetrue ou false ;

2. la productiondetexteenXSLT (balisexsl:value-of ) doit convertir le résultatd’uneexpressionXPathenchaînedecaractèrespourl’incorporeraudocumentrésultat.

La compréhensiondesprincipalesrèglesdetypage,d’évaluationd’expressionstypéesetdeconversionsd’un typeà un autreci-dessousestdoncessentielle.NousnedonnonspasenrevanchedanscechapitrelalistecomplètedesfonctionsXPathqui figuredansl’annexeB

Page 104: Comprendre XSLT

104 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Opérateurs Syntaxeet description+ Addition: n1 + n2- Soustraction: n1 - n2 . Attention à laisserun blancde chaque

côtédu ’-’, sinonle signeestinterprétécommefaisantpartieden1 ou n2 .M Multiplication: n1 * n2

div Division: n1 div n2 (laisserun blancdechaquecôté)mod Restede la division: n1 mod n2 (laisserun blancde chaque

côté)

Table2.17:Opérateursnumériques

Lesnumériques

Lesopérateurssurlestypesnumériquessontdonnésdansle tableau2.17.La valeurnumériqued’un nœudestobtenueenlui appliquantla fonctionnumber() qui fonctionnedela manièresuivante:5 éliminationdesblancsavantle premiercaractèreetaprèsle derniercaractère;5 recherchedu signe’-’ ;5 interprétationdela chaînerestantecommeun numérique.

Si la conversionest impossible,la fonction renvoie NaN («Not a Number»). Voici par exempleuneexpressionXPathqui recherchetouslesnœudsayantun attribut dontla valeurestimpaire.

//node()[number(@att1) mod 2 = 1]

Surnotreexemplederéférence,on obtiendraitle nœudC (figure2.33).

Document-

InstructionJavains1

ElementA

ElementB

Attratt1

a1

ElementD

Text-

Texte1

ElementD

Text-

Texte2

ElementB

Attratt1

a2

ElementD

Text-

Texte3

ElementC

Attratt2

a3

Attratt3

15

Comment-

CommFin

Figure2.33:Résultatde//node()[number(@att1)mod2 = 1]

Pour tous les nœudsayantun attribut dont la valeur est une chaînede caractèresqui ne peut êtreconvertieversun numérique,le résultatdela fonctionestNaN,

Lescomparaisonsavecun NaNdonnentdesrésultatsassezétranges.Un testd’égalitérenvoie falsesi l’une desopérandesestNaN. En revancheun testd’inégalité(«!= ») renvoie toujourstrue quandunedesopérandesestNaN. Voici quelquesconséquencesquenousvouslaissonsméditer:

Page 105: Comprendre XSLT

2.4. LE LANGAGEXPATH 105

1. NaN = NaNvautfalse ;

2. NaN != NaNvauttrue ;

3. number(X) != number(X) vauttrue si X n’estpasun nombre!

Nousvoici doncdotésd’un bonmoyenderendredesexpressionsincompréhensibles.Cen’estpasledernier.

Lesbooléens

Les booléensprennentdeux valeurs,true et false , que l’on peut explicitementintroduire danslesexpressionsavec les fonctionstrue() et false(). Toutesles chaînesavec au moinsun caractère,ainsi quetousles numériquesnon nuls, sontassimilésà la valeurbooléennetrue ; les chaînesvides,la valeur0ou NaNsontassimilésà false . Cesrèglespermettentd’interpréter(en sedonnantun peude mal) lesconversionseffectuéesdepuisunevaleurdetypenumériqueou chaînedecaractèresversun booléen,soitimplicitement,soitavecla fonctionboolean().

La conversiond’un booléenversun autretypescalaires’effectueselonlesrèglessuivantes:5 Versun numérique(fonctionnumber()) : onobtient1 avectrue , et 0 avecfalse .5 Versunechaîne(fonctionstring()) : on obtientla chaînefalse ou la chaînetrue .

Voici quelquesexemples:

1. boolean(’azerty’) = true

2. boolean(’0’) = true

3. boolean(0) = false

4. number (1 = 0) = 0

5. number (1 = 1) = 1

6. string (1 = 1) = ’true’

Leschosessecompliquentun peuplus quandon doit effectuerunecomparaisonentreun booléenetuneautrevaleur, et notammentquandla conversiondesdeuxopérandesestnécessairepour les ramenertoutesdeuxaumêmetype.Voici lesrèglesdebase:

1. quandl’opérateurest«= » ou«!= » (comparisonoperator) la valeurnonbooléenneestconvertieenbooléen;

2. pourlesautresopérateurs,on tient comptedu typedel’opérandenonbooléenne:

(a) si c’estun numérique,on convertit le booléenennumérique(donc0 ou1) ;

(b) si c’estunechaîne,onconvertit lesdeuxopérandesennumérique.

Voici quelquesexemples:

1. true() = 5 : on convertit 5 enbooléen,cequi donnetrue , et le résultatde la comparaisonesttrue ;

2. true() E 5 : on convertit le booléentrue en numérique,ce qui donne1, et le résultatde lacomparaisonestfalse ;

3. true() != ’azerty’ : on convertit azerty enbooléen,cequi donnetrue , et le résultatdela comparaisonestfalse ;

4. false() E ’azerty’ : onconvertit le booléenfalse ennumérique,cequi donne0, ainsiqueazerty , cequi donne1, et le résultatdela comparaisonestfalse ;

Page 106: Comprendre XSLT

106 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Ensemblesde nœuds

Étudionspourfinir le casdesensemblesdenœuds.Notonstout d’abordqu’il estimpossibledeconvertirun type scalaireversun ensemblede nœuds,ce qui divisepar deuxle problème: les conversionsseronttoujoursappliquéesàun ensemblepourle transformerversun typescalaire.

La conversionla pluscourantes’effectueversunechaînede caractères.Voici tout d’abordles règlesdonnantunevaleurtextuellepourchaquetypedenœudd’un arbreXPath:

5 pourun nœuddetypeText, onobtientdirectementle contenudu nœud;5 pourun nœuddetypeComment, on obtienttoutela chaînecompriseentre’ F !--’ et ’-- E ’ ;5 pourun nœuddetypeProcessingInstruction, on obtienttoutela chaînecompriseentrele nom(ou«cible») del’instruction et ’? E ’ ;5 pourun nœuddetypeAttr , on obtientla valeurdel’attribut ;5 enfinpourun nœuddetypeElement ou detypeDocument, le contenutextuel estla concaténationdetouslescontenusdesdescendantsdu nœudqui sontdetypeText.

Parexemple,enreprenantencoreunefois notreexemplederéférence,le contenudel’élément/A estlaconcaténationdeTexte1 , Texte2 etTexte3 ; le contenudel’élément/A/B[1] 5 estla concaténationdeTexte1 , Texte2 , etc.

Onpeutmaintenantdéfinircommesuitlesconversionsd’unensembledenœudsverslestypesscalaires:

1. vers une chaînede caractères: c’est le contenutextuel du nœudde l’ensemblequi apparaîtenpremièrepositiondansl’ordredu document.

2. versun numérique: on convertit d’abordenchaîne,puison convertit la chaîneavecnumber() ;

3. versunbooléen: la conversionbooléenned’un ensembledenœudsdonnetrue si l’ensemblen’estpasvide, false sinon.

Le tableau2.18résumelesrèglesdeconversionquenousavonsvuesjusqu’ici.

De/Vers Booléen Numérique Chaîne EnsembledenœudsBooléen – false N 0;

true N 1false N ’f alse’;true N ’ true’

Interdit

Numérique O et NaN Nfalse ; sinontrue

– formatdécimal Interdit

Chaîne si vide N false ;sinontrue

conversion versnombre

– Interdit

Ensembledenœuds si vide N false ;sinontrue

conversion chaînepuisnombre

contenudu premiernœud dans l’ordredudocument

Table2.18:ConversionsdetypesXPath

Il estmaintenantpossibled’effectuerdescomparaisonsentreunensembledenœudsetuneinstanceden’importequelautretypeXPath.Voici lesrèglesàappliqueràun ensembledenœudsdénotéO :

1. pourcomparerO et unechaîneP , on convertit touslesnœudsde O versleursvaleurstextuelles; siuneseuledecesvaleursestégaleà P la comparaisonrenvoie true , et false sinon;

2. pour comparerO et un nombre Q , on effectuecommeprécédemmentune conversionde chaquenœudsversunevaleurnumérique,et on compareavec Q ;

5Cetteexpressionestéquivalentà /A/B[position() = 1] .

Page 107: Comprendre XSLT

2.4. LE LANGAGEXPATH 107

3. pourunecomparaisonavecunevaleurbooléenne,on prendsimplementla conversionde O versunbooléen;

4. enfin pour comparerO avecun secondensembleORJ , on prendles valeurstextuellesdesnœudsdeO et de ORJ et on les comparedeuxà deux: si on obtient true pour au moinsunepaire,alors lacomparaisonglobalerenvoie true également.

2.4.7 Exemplesd’expressionsXPath

Nous concluonsce chapitrepar desexemples(commentés!) d’expression,en abandonnantà partir demaintenantl’exemplede référencequenousavons utilisé tout au long de cettesectionafin de pouvoirexplorerdescasplusricheset généraux.

Toutesles expressionsqui suivent sont donnéesd’abord dansleur forme développéepuis, le caséchéant,enutilisantla formeabrégée.

5 child::A/descendant::B : donneles élémentsde type B descendantsd’un élémentde typeA, lui-mêmefils du nœudcontexte;

Formeabrégée: A//B5 child::*/child::B : donnelesélémentsdetypeB petit-fils dunœudcontexte;

Formeabrégée: */B5 descendant-or-self::B : donneles élémentsde type B fils du nœudcontexte, et le nœudcontexte lui-mêmes’il estdetypeB ;5 child::B[position()=last() - 1] : donnel’avant-dernierélémentdetypeBfils dunœudcontexte;

Formeabrégée: B[last()-1]5 following-sibling::B[position()=1 ] : donnele premierfrèrededroitedu nœudcon-textedontle typeestB ;5 /descendant::B[position()=12] : donnele douzièmeélémentdetypeB dudocument;5 child::B[child::C] : donnelesfils detypeB qui ont eux-mêmesaumoinsun fils detypeC:le prédicatestici uneexpressionXPathqui renvoieunensembledenœuds,interprétécommefalses’il estvide,et true sinon;

Formeabrégée: B[C]5 /descendant::B[attribute::att1 and attribute::att2] : donnelesélémentsdetypeB qui ont aumoinsun attribut att1 et un attribut att2 ;

Formeabrégée: //B[@att1 and @att2]5 child::*[self::B or self::C] : donnelesfils detypeB ou detypeC;

Le tableau2.19récapitulelesabréviationsdesexpressionsXPath. Il fautêtreprudentdansl’utilisationdecesabréviations,et toujoursseramenerà la formedéveloppéequandonn’estpassûrdela significationdela formeabrégée.Si vousn’êtespasconvaincus,nousvoussuggéronsparexemplele lecteurderéfléchirà la différenceentre//B[1] et de/descendant::B[1] ...

L’annexe B complètela descriptiondeXPath qui précède,en donnantnotammentuneliste complètedesfonctionsreconnuesparla norme.

Page 108: Comprendre XSLT

108 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION

Abréviation Description. Équivalentàself::node().. Équivalentàparent::node()// Équivalentà /descendant-or-self::node()/.// Équivalentàself::node()/descendant-or-self::node ()/@att Équivalentàattribute::att

Table2.19:LesabréviationsXPath

Page 109: Comprendre XSLT

Chapter 3

XSLT

Sommaire

3.1 ProgrammesXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

3.1.1 Structured’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . . 111

3.1.2 Modularité: xsl:import etxsl:include . . . . . . . . . . . . . . . . . 115

3.1.3 Applicationd’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . 117

3.2 Les règlesXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

3.2.1 Lespatterns . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

3.2.2 Règles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

3.2.3 Déclenchementderèglesavecxsl:apply-templates . . . . . . . . . . . 124

3.2.4 Sélectiondesrègles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126

3.2.5 Appel derègleavecxsl:call-template . . . . . . . . . . . . . . . . . . 131

3.2.6 Paramètres. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132

3.3 Instructions decontrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134

3.3.1 Tests: xsl:if etxsl:choose . . . . . . . . . . . . . . . . . . . . . . . . . 134

3.3.2 Boucles: xsl:for-each . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

3.3.3 Variables: xsl:variable . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

3.3.4 Tri : xsl:sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

3.3.5 Itérationsparrécursion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

3.4 Évaluation d’un programmeXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

DanscechapitrenouscommençonsnotreétudeapprofondiedeXSLT parlesaspectsrelatifsà la pro-grammation. Nousrassemblonssouscetermetouteslesinstructionsqui permettentdespécifierunetrans-formationd’un documentsourceversun documentrésultat. Il n’estsansdoutepasinutile d’expliciter lespartiesdeXSLT qui nerelèventpasdirectementdecettenotiondeprogrammation,et qui serontabordéesplusloin danscelivre:

1. nousnenousintéressonspasaustyledeprogrammationXSLT ;

2. les spécificitésdu langagede sortiesontpour l’instant ignorées: les exemplesserontbaséssur laproductiondedocumentsHTML simples;

3. enfin nousdélaissonspour l’instant les instructionsqui sont orientéesvers la mise en forme dudocumentrésultat.

Si vousavez lu les chapitresqui précèdent– ce qui est recommandé– vousdevriez déjàavoir unecompréhensionintuitived’unepartdesprincipesdebasedeXSLT, et d’autrepartdela structurationd’undocumentXML. Nousnousplaçonsdoncdirectementdansla situationoù un programme,le processeurXSLT, disposeenentréededeuxdocuments(figure3.1):

109

Page 110: Comprendre XSLT

110 CHAPTER3. XSLT

arbreDOM

ProcesseurXSLT

arbrerésultat

Document XSLTDocument XML

AnalyseSérialisation

Document résultat

Figure3.1: Schémadu traitementd’unetransformationsXSLT

S le documentXML source

S le programmeXSLT

Noussupposonsquele documentsourcea étéanalyséet setrouve disponiblepour le processeursousforme d’un arbreDOM. Notezbien qu’il s’agit d’une vue «conceptuelle» et que,en pratique,les pro-cesseursXSLT sont libres de s’appuyersur une représentationinternede leur choix. Sur la basedesinformationstrouvéesdansle documentsourceetdesinstructionsduprogrammeXSLT, le processeurpro-duit un documentrésultat,qui peutégalementêtrevu commeun arbreconstruitau fur et à mesuredel’évaluation(nousdonneronsun exempled’une telle évaluationenfin dechapitre).Une fois la transfor-mationterminée,l’arbre résultatpeutêtresérialisési besoinestpour êtrestocké,transmissur le réseau,etc

Nousprendronscommeexempleprincipaldanscechapitrele documentsuivant,décrivantuncours(oul’ébauched’un cours..)basésurle présentlivre.

Exemple28 CoursXML.xml: DocumentXML pour le coursassociéà celivre

<?xml version=’1.0’ encoding="ISO-8859-1"?>

<COURSCODE="TC234"><SUJET>Publication XSLT</SUJET>

<ENSEIGNANTS><!-- Enseignant responsable --><NOM>Amann</NOM><NOM>Rigaux</NOM>

</ENSEIGNANTS><PROGRAMME>

<SEANCEID="1">Documents XML</SEANCE><SEANCEID="2">Programmation XSLT</SEANCE><ANNEE>2002</ANNEE>

</PROGRAMME></COURS>

Nouscommençonspardécriredemanièreglobalele contenud’un programmeXSLT et desdifférentstypesd’élémentsquel’on peuty trouver. Nouspassonsensuiteà la descriptiondesrègles(template), puisaux instructionsde contrôlequi permettentd’effectuerdesitérationset tests. Enfin nousconcluonscechapitreparl’exempledétailléd’uneévaluationd’un traitementXSLT.

3.1 ProgrammesXSLT

Un programmeXSLT estun documentXML. Cedocumentdoit bienentenduêtrebien formé(fermeturedesbalises,non-imbricationdesbalisesouvranteet fermante,etc). Les instructionsspécifiquesà XSLTdoiventaussirespecterunecertainestructure– relativementsimple– et selimiter à destypesd’élémentsprédéfinis.

Page 111: Comprendre XSLT

3.1. PROGRAMMESXSLT 111

3.1.1 Structure d’un programmeXSLT

Un programmeXSLT doit respecterles règlessyntaxiquesXML. Il faut bien être conscientque celas’appliquenonseulementauxélémentsXSLT eux-mêmes,maiségalementauxélémentsqui sontdestinésàêtreinsérésdansle résultat,quenousappelleronsélémentlittérauxparla suite.Le documentXSLT suivantparexemplen’estpasbienformé.

Exemple29 ExXSLT1.xsl: Un documentXSLT mal formé

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:template match="COURS"><html>

<head><title>Fiche du cours</title></head><body bgcolor="white">

<p><h1>

<i><xsl:value-of select="SUJET"/></i></h1><hr><xsl:apply-templates/>

</body></html>

</xsl:template></xsl:stylesheet>

LesélémentsXSLT neposentpasdeproblème,maisl’uniquerègletentedeproduirele résultatsuivant:

<html><head><title>Fiche du cours</title></head><body bgcolor="white">

<p><h1>

<i>Publication XSLT</i></h1><hr>

</body></html>

Bien qu’il s’agissed’un documentHTML trèscorrect(en tout casconformeà la normeHTML 4.0),lesélémentslittéraux T p U et T hr U nesontpasrefermés.La présencedecefragmentHTML n’estdoncpasacceptéedansle programmeXSLT.

Cela illustre bien le fait que XSLT est avant tout destinéà transformerun documentXML en unautredocumentXML, par productionde fragmentsbien formés. La sortied’un document«texte» quineseraitpasdu XML bienforméestpossiblemaisimpliquedesoptionsspécialesqui serontétudiéesdansle chapitre4.

L’élémentxsl:stylesheet

L’élémentracined’un documentXSLT estde typexsl:stylesheet . La forme habituellede cetélé-mentest:

<xsl:stylesheetversion="1.0"xmlns:xsl="http://www.w3.org/1999/X SL/Tr ansfo rm">

Page 112: Comprendre XSLT

112 CHAPTER3. XSLT

On trouvedoncengénéraldeuxattributs:

1. L’attribut version estobligatoireet correspondau numérode versionde la «recommandation»XSLT publiéepar le W3C.La seulerecommandationà l’heureoù celivre estécrit estla 1.0, la 1.1étantà l’état deWorking Draft.

2. L’attribut xlmns:xsl définit l’espacedenom(namespace) xsl et l’associeà l’URIhttp://www.w3.org/1999/XSL/Transform

CemécanismepermetdequalifiertouslesélémentsXSLT parle préfixexsl: , etdeconsidérertouslesautresélémentscommedesélémentslittérauxà incluredansle documentrésultat.Lesespacesdenomsontétudiésdansle chapitre6.

Il existed’autresattributspossiblespourxsl:stylesheet . Ils serontprésentésaufur et à mesure.Notezqu’il existeégalementuntyped’élémentxsl:transform quiestl’exactsynonymedexsl:stylesheet .

Remarque: Dansce chapitreet les suivantsnousavonschoisi de ne pasdonneruneprésentationex-haustive desattributset desrèglessyntaxiquesrelativesà chaqueélémentXSLT, afin derendrela lectureplus facileet deprivilégier la «miseencontexte» deceséléments.L’annexe B enrevanchecontientuneréférenceXSLT avecla syntaxedechaqueélément: l’élémentxsl:stylesheet parexempleestdécritpage278.

Sousl’élémentracinexsl:stylesheet on trouve le contenudu programmeauseinduquelon dis-tinguecommunémentdeuxtypesd’éléments.Tout d’abordlesélémentsdepremierniveau(top-level ele-ments) sontfils del’élémentracinexsl:stylesheet . Leprincipalélémentdecetypeestxsl:templatequi estutilisé pourdéfinir les règlesXSLT. Les instructionsconstituentle secondtyped’élément: on lestrouveessentiellementdanslescorpsderègles.

Élémentsde premier niveau

Lestypesd’élémentqui peuventêtrefils de l’élémentracine T xsl:stylesheet U sontdit «élémentsdepremierniveau» (top-leveléléments). Ils sonttous(dumoinsceuxdela version1.0)rassemblésdansletableau3.1,avecunecourtedescriptionet la pageoù vouspouveztrouver la référencepourl’élément.

Typed’élément Descriptionxsl:attribute-set Définit un grouped’attributs(page259)xsl:decimal-format Définit un formatd’affichagepourlesnumériques(page266)xsl:import Import d’un programmeXSLT (page268)xsl:include Inclusiond’un programmeXSLT (page269)xsl:key Définit uneclépourun groupedenœuds(page270)xsl:namespace-alias Définit desaliaspourcertainsespacesdenom(page271)xsl:output Indiquele formatdesortie(HTML, XML, texte) (page273)xsl:param Définit un paramètre(page273)xsl:preserve-space Conserve lesnœudstexteconstituésd’espacespourcertainéléments(page274)xsl:strip-space Supprimelesnœudstexteconstituésd’espacespourcertainséléments(page278)xsl:template Définit unerègleXSLT (page279)xsl:variable Définit unevariableXSLT (page281)

Table3.1: ÉlémentsXSLT depremierniveau

Touscestypesd’élémentne sontpasde la mêmeimportance,et tousne couvrentpasle mêmetypede fonctionnalité. Mêmes’il estdifficile d’établir uneclassificationqui ne soit pas,au moinsen partie,arbitraire,on peutgrossièrementdistinguer

S lesélémentsqui affectentla productiondudocumentrésultat;

Page 113: Comprendre XSLT

3.1. PROGRAMMESXSLT 113

S lesélémentsqui s’appliquentà la transformationdu documentsource.

Danscechapitrenousdécrivonslesélémentsqui relèventdela secondecatégorie: xsl:template ,xsl:param et xsl:variable . Lesélémentsrelatifsà la productiondu résultatsontpour l’essentielprésentésdansle prochainechapitre.

L’ordre desélémentsde premierniveaun’a pasd’impact sur le comportementdu programmeXSLT(à l’exceptiondexsl:import : voir ci-dessous),et on peutlesarrangerdansl’ordre qui semblele plusconvenablepour la lecture. Cetteparticularitéconstituel’un desaspectsdu caractère«déclaratif» deXSLT : on indiquelesactionsà effectuerenprésencedecertainsévénements,à chargepour le processeurdedéclenchercesactionsdemanièreappropriée.

Quelssontlesautresfils possiblesdexsl:stylesheet ? Il estinterdit d’avoir desnœudsde typeText, autrementdit du texte placéimmédiatementsousl’élémentracine.En revancheon peuttrouverdescommentaireset desinstructionsde traitement,les premiersétantignorés,et le secondpris en compteseulements’ils contiennentdesinstructionsreconnuesparle processeur.

Dansle mêmeesprit,on peut trouver au premierniveaudesélémentsdont le type estspécifiqueauprocesseurXSLT. En généralcesélémentssedistinguentpar un préfixe commexalan: , msxml3: ousaxon: . L’introductiondecetyped’élémentnonnormalisérisquedeposerdesproblèmesdeportabilitési on souhaitequ’un programmeXSLT puisseêtretraitéparn’importequelprocesseur.

Enfin le concepteurd’un programmepeut lui-mêmedéfinir sespropresélémentsde premierniveau,en les caractérisantpar un préfixe. Celan’a d’intérêt quepour introduiredu contenu(par exemple: descodifications,desmessagesenplusieurslangues,desparamètres..)auseind’un programme,enplusdesinstructionsdeceprogramme.Cesélémentssontignorésparle processeur, et leur utilité estdouteuse.Onpeutentout castoujourss’enpasseretutiliser d’autresmécanismes.

Enrésumélesélémentsdutableau3.1constituentla référencedestypesd’éléments,fils dexsl:stylesheet ,reconnuspar n’importe quel processeurXSLT conformeà la recommandationXSLT 1.0. Un desajoutsimportantsprévusdansla version1.1estun élémentxsl:script qui permettrad’introduiredespartiesprogrammées(en Java ou JavaScript)dansun programmeXSLT. Cetteextensionrisquede soulever desproblèmesdeportabilitéet fait l’objet d’un débatauseindu groupedenormalisation.

Instructions XSLT

L’exécutiond’un programmeXSLT consisteà déclencher(ou instancier) desrèglesdéfiniespar desélé-mentsdepremierniveauxsl:template . L’instanciationd’unerègleconsisteàproduireunfragmentdudocumentrésultatenfonction:

1. d’élémentslittéraux;

2. detexte;

3. d’instructionsXSLT.

Toutecombinaisonde tels constituantsestnomméeun corpsde règle. Alors queles deuxpremièrescatégories(élémentslittérauxet texte) sontinsérésdansle documentrésultat,les instructionsXSLT sontinterprétéesparle processeurXSLT. Voici parexempleuncorpsderèglequenousavonsrencontrédanslechapitreintroductif: il créeunelisteHTML aveclesséancesd’unesalledecinéma:

<h3>Séances</h3><ol><xsl:for-each select="SEANCES/SEANCE">

<li><xsl:value-of select="."/></li></xsl:for-each>

</ol>

On trouvedoncdesélémentslittéraux(balisesT h3 U , T ol U , T li U et leursfermetures),desnœudsdetypeText (parexemplele nœudfils de T h3 U dontle contenuestSéances ), et enfindesinstructions,élémentsdont le nomestpréfixéparxsl: . La notiondecorpsderègleestassezlargeet recouvretoutepartiedu programmedestinéeàproduireun fragmentdu documentrésultat.

Page 114: Comprendre XSLT

114 CHAPTER3. XSLT

Le tableau3.2donnela listedetouteslesinstructionsXSLT 1.0à l’exceptiondexsl:document quiestdéfini dansXSLT 1.1,maisdéjàlargementprésentdansles implantationsactuelles.Commepour lesélémentsdepremierniveau,nousdonnonsunebrèvedescription,ainsiquela pagedel’annexeB où vouspouveztrouver la référencedel’instruction.

Type d’élément Descriptionxsl:apply-imports Permetd’appliquerunerègleimportée,tout en la

complétantparunnouveaucorps(page255)xsl:apply-templates Déclenchel’applicationderègles(page256)xsl:attribute Insèreun attribut dansun élémentdu document

résultat(page258)xsl:call-template Appelleunerègleparsonnom(page259)xsl:choose Structuredetestéquivalenteauswitch d’un lan-

gagecommeJava ou C++ (page261)xsl:comment Insèreun nœudComment dansle documentré-

sultat(page262)xsl:copy Copieunnœuddudocumentsourcedansle docu-

mentrésultat(page264)xsl:copy-of Copie un nœud,ainsi que tous sesdescendants

(page265)xsl:document Permet de créer plusieurs documentsrésultats

(XSLT 1.1) (page266)xsl:element Insèreun nœudElement dansle documentrésul-

tat (page267)xsl:fallback Règledéclenchéesi leprocesseurnereconnaîtune

instruction(page268)xsl:for-each Poureffectuerdesitérations(page268)xsl:if Pour effectuer un branchement conditionnel

(page268)xsl:message Pour produireun messagependantle traitement

XSLT (page270)xsl:number Permetde numéroterles nœudsdu documentré-

sultat(page272)xsl:variable Permetdedéfinir unparamètre(page273)xsl:processing-instruction Insèreun nœudProcessingInstruction dans le

documentrésultat(page275)xsl:text Insèreun nœudText dansle documentrésultat

(page280)xsl:value-of ÉvalueuneexpressionXPath et insèrele résultat

(page280)xsl:variable Permetdedéfinir unevariable(page281)

Table3.2: InstructionsXSLT

On peutnoterquexsl:variable et xsl:param sont les typesd’élémentà apparaîtreà la foiscommeélémentdepremierniveauet commeinstruction.L’emplacementdel’élémentdéfinit la portéedela variableetdu paramètre: voir page138.

Si l’on s’en tient à la classificationdéjà faite précédemment,on constateque les instructionsrela-tivesà la transformationdu documentsourceplutôt qu’à la productiondu résultatsont xsl:apply-templates etxsl:call-template qui toutesdeuxdéclenchentdesrègles,xsl:choose , xsl:for-each , xsl:if , xsl:message et xsl:variable qui correspondentà peuprèsaux tests,itérations,sortiesà l’écranet définitionsdevariablesquel’on trouve dansla programmationla plusclassique.Ces«instructionsdecontrôle» sontprésentéespage134

Page 115: Comprendre XSLT

3.1. PROGRAMMESXSLT 115

3.1.2 Modularité : xsl:import et xsl:include

Jusqu’àprésentnousavonstoujoursconsidéréqu’un programmeXSLT étaitcontenudansun seulfichier.Heureusementil estpossible,commedanstout langagedeprogrammationdignedecenom,d’introduireunecertainemodularitéafin de répartir les instructionsdansplusieursfichiersd’un taille raisonnable,etsurtoutdepouvoir réutiliserunerègledansplusieursprogrammes.

XSLT fournit deuxélémentsde premierniveaupour intégrerdesfichiersafin de constituerdespro-grammes: cesontxsl:import etxsl:include . Signalonstoutdesuitequelesnotionsde« librairie»constituéede«module» qui nepeuventêtreutilisésindépendamment,et de«programmeprincipal» con-stituéparassemblagedelibrairies,n’existentpasenXSLT. Riennedistingue,du point devuesyntaxique,un programmedestinéà êtreinclusd’un programmeincluantou importantd’autresfichiers.TousdoiventêtredesprogrammesXSLT conformes,avecun élémentracinexsl:stylesheet .

L’assemblagede plusieursprogrammespeutcréerdesconflits. Au momentde l’évaluationplusieursrèglespeuvent s’appliqueraux mêmesnœuds.Afin de déterminerla règleà appliquer, XSLT utilise unsystèmedepriorités quenousdécrivonspage127.La distinctionentrexsl:include et xsl:importestjustementrelativeà la méthodeappliquéepourchoisirunerègleencasdeconflit :

1. dansle casdexsl:import le processeuraffecteauxrèglesimportéesunepréséance1 inférieureàcellesdu programmeimportateur;

2. dansle casde xsl:include , le processeurtraite les règlesdu programmeinclus sansles dis-tinguer, entermedepréséance,decellesduprogrammeprincipal: toutsepassecommesixsl:includeétaitsimplementremplacé,avantl’évaluation,parle contenudu programmeréférencé.

Une autre différenceentre ces deux types d’élémentest que xsl:import doit apparaîtreavanttout autre élémentde premierniveaudansun programmeXSLT. On peuttrouver en revancheplusieursxsl:import puisquerien n’empêched’importerplusieursfichiersdansun programme.

À l’exceptiondesdifférencesci-dessus,xsl:include et xsl:import sonttrèsproches.Danslesdeuxcasun fichier inclus/importépeutlui-mêmeinclureou importerd’autresfichiers,tantqu’il n’existepasdecycle qui mèneraitun fichier à s’inclure lui-même.Lesdeuxtypesd’élémentpartagentégalementla mêmesyntaxe: le nomou l’URI dufichier inclusestréférencédansl’attribut href :

<xsl:import href="Programme.xsl"/>

Prenonsun premierexemplepourillustrer l’intérêt du mécanisme(nousutilisonsxsl:import maison pourrait dansl’exempleci-dessousremplacerxsl:import par xsl:include avec un résultatéquivalent– il n’y a pasdeconflit derègles).

Le fichier ExXSLTImport.xslcontientunepremièrerèglequi s’appliqueà un élémentracinede typeCOURS, produit un «squelette» dedocumentHTML avecle sujetdu coursdansla balise T TITRE U , etenfindéclencheun appelderèglesavecxsl:apply-templates .

Exemple30 ExXSLTImport.xsl: Un programmeà importer

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:strip-space elements="*"/>

<xsl:template match="/"><html>

<head><title><xsl:value-of select="COURS/SUJET"/></title></head><body bgcolor="white">

<xsl:apply-templates/>

1Nousutilisonsle terme(un peudésuet)de préséancepour traduirel’anglais precedence, et distinguercettenotion de celle depriorité d’applicationdesrègles.

Page 116: Comprendre XSLT

116 CHAPTER3. XSLT

</body></html>

</xsl:template>

<xsl:template match="SUJET | ENSEIGNANTS| PROGRAMME"/>

</xsl:stylesheet>

La seconderègles’appliqueauxfils de T COURSU etnefait rien. Le programmeestdonctrès«neutre»vis-à-visdu contenudu documentsource. Il secontentede produirele «cadre» de présentationHTMLci-dessous.

Exemple31 ExXSLTImport.html: Le documentHTML produit par ExXSLTImport.xsl

<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Publication XSLT</title></head><body bgcolor="white"></body></html>

OnpeutimaginerquecetterèglepourraitproduireunsqueletteHTML beaucoupplussophistiqué,avecmenus,frames, contrôlesJavaScript,et tout un attirail graphiquerendantla présentationbeaucoupplusattrayante.L’intérêt estqu’unefois cettemiseen pageréaliséeet inséréedansl’unique règle,on peutlaréutiliserenl’important dansd’autresprogrammes.

Voici un programmequi affichela liste desenseignantsdu cours.Il commencepar importerle fichierExXSLTImport.xsl, cequi dispensededéfinir unerègles’appliquantà la racinedu document.Ensuiteonredéfinitles règless’appliquantausous-arbredesenseignantspourproduireuneliste avec lesnoms.Cesrèglesont unepréséancesupérieureà cellesdu fichier importéqui neproduisaientaucunrésultat.

Exemple32 ExXSLTPrincipal.xsl: Un programmeimportateurdeExXSLTImport.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:import href="ExXSLTImport.xsl"/>

<xsl:template match="COURS/ENSEIGNANTS"><ol><xsl:apply-templates select="NOM"/></ol>

</xsl:template>

<xsl:template match="NOM"><li><xsl:value-of select="."/></li>

</xsl:template>

</xsl:stylesheet>

Lapréséancedoit êtredistinguéeduniveaudepriorité d’unerègle,notionquenousexposeronspage127.La préséances’appliqueàl’importationdeprogramme,etelleesttoujoursinférieurepourlesrèglesdupro-grammeimportéparrapportauxrèglesdu programmeimportateur.

Cetterèglesegénéraliseassezsimplementà l’importation deplusieursdocumentsdela manièresuiv-ante:

S siundocumentVXW estimportéavantundocumentVZY , alorstouteslesrèglesde VCY ontunepréséancesupérieureà cellesde VXW ;

Page 117: Comprendre XSLT

3.1. PROGRAMMESXSLT 117

S si unerègle [\W a unepréséancesupérieureà [)Y , elle-mêmesupérieureà [-] , alors [^W a unepréséancesupérieureà [ ] (transitivité).

Prenonsun exemplesimple,illustré dansla figure3.2. le documentprincipalA imported’abordB, quilui-mêmeimporteCetD, puisA importeE qui importeF.

A

EB

C D F

Figure3.2: Exempledeplusieursimports

LesrèglesdeC ont unepréséanceinférieureà cellesdeB, et doncinférieuresà cellesdeA. C’estvraiaussidesrèglesdeD, maisellesont unepréséancesupérieureà cellesdeC puisqueD estimportéaprèsC.Enfin lesrèglesdeF ont unepréséanceinférieureà cellesdeE, maissupérieuresà toutescellesissuesdeB, CouDpuisqueF aétéimportéaprès.En résumél’ordre (descendant)depréséancepourcesdocumentsestA, E, F, B, Det C.

Remarque: On peutvoir danscetarbrequel’ordre descendantdepréséancepourcesdocumentscorre-spondà unparcoursenpost-ordre(enprofondeurdedroit à gauche).

L’ordre de préséanceestpris encompteau momentoù le processeurrechercheles règlesapplicablesà un nœud.Si plusieursrèglessontcandidates,seulescellesayantl’ordre depréséancele plusélevé sontconservéeset prisesencompte.Au seindecesrègles,c’estalorsl’ordre depriorité qui s’applique.

Le mécanismed’importations’apparenteà la surchargede méthodeen programmationorienté-objet.Danslesdeuxcason réutilise lespartiesgénériqueset on redéfinitlespartiesspécifiquesà unesituationdonnée.Un inconvénientpossibleestquela totalitédela règleimportéeestremplacéeparla règledu pro-grammelocal, alorsquel’on peutsouhaiterparfoisexécutercetterègleimportéetout enl’enrichissantdequelquesinstructionscomplémentaires.C’estcequepermetl’instructionXSLT xsl:apply-imports ,présentéepage255.

3.1.3 Application d’un programmeXSLT

Un programmeXSLT s’appliqueà un documentXML poureneffectuerunetransformation.Commentetquanddéclenchercettetransformation? Sionprendcommeapplicationdebaselapublicationd’informationssurle Web,onpeutenvisagerplusieurssituations:

1. serveurstatique: les transformationssonteffectuéesen batch afin de produireles pagesHTML àpartir d’un ou plusieursdocumentsXML ; les pagesHTML statiquessontalors transféréessur leserveur;

2. serveurdynamique: cette fois la transformations’effectuela demandeen fonction desrequêtesHTTP;

3. client dynamique: le documentXML et le programmeXSLT sonttransmisauclient qui effectuelatransformation.

La premièresolutionestsimpleet neposepasdeproblèmedeperformancepuisquelespagesHTMLsontdirectementdisponibles.Elle peutsouffrir d’un certainmanquede réactivité, le contenuétantfigéentredeuxtransformations.

Page 118: Comprendre XSLT

118 CHAPTER3. XSLT

La plupart desprocesseurspermettentdestransformations«statiques» à partir de la ligne de com-mande. Voici par exempleunetransformationavec Xalan, le processeurXSLT de la fondationApachedont l’installation estdécritedansl’annexe A. La commandetransformele documentAlien.xmlavec leprogrammeFilm.xsl, et produitla pageHTML Alien.html.

java org.apache.xalan.xslt.Process -in Alien.xml-xsl Film.xsl -out Alien.html

La secondesolutionpermetuneadaptationauxévolutionsen tempsréel,maisrisquedesoulever desproblèmesde performancessi de trèsnombreusestransformationsdoivent êtreeffectuéessur desdocu-mentsvolumineux.Plusieursenvironnementsdepublicationbaséesurcemécanismeexistent: Cocoonparexemple,égalementproduitpar la fondationApache,sebasesur le processeurXalanpourdéclencherdestransformationsdynamiquementen fonction de la requêteHTTP, du type de navigateurutilisé, etc (voirannexeA).

Enfin la dernièresolutionconsisteà effectuerla transformationsur le client. À l’heureactuelleseullenavigateurInternetExplorer5 (IE5) disposed’un processeurXSLT intégré.Outrelesproblèmesdecom-patibilité avec le navigateur, cettesolutionprésentel’inconvénientde transmettretoutesles informationsdu documentXML auclient,cequi n’estpasforcémentsouhaitable,

L’instruction T ?xml-stylesheet? ULe moyen le plus courantpour associerun documentXML à un programmeXSLT estune instructiondetraitementT ?xml-stylesheet? U qui doit apparaîtredansle prologuedu documentà transformer.Voici parexemplecommentindiquer, dansle documentAlien.xml, quele programmeassociéestFilm.xsl.

<?xml-stylesheet href="Film.xsl" type="text/xsl"?>

C’est une instruction de traitement,dont le nom est xml-stylesheet , et le contenuune listed’attributs2. Cesattributssont:

S href , qui donnel’URI du programmeXSLT (cepeutêtreun fichier local, ou un fichier accessiblesurle Web);S type , qui donnele typeMIME du programmeXSLT : text/xml ou text/xsl sontdeschoixreconnus,le premierétantcelui officiellementpréconiséparle W3C;S title , unechaînedecaractèrequi peutêtreutiliséepourpermettrele choixduprogrammeàappli-quer;S media , qui indiquele formatdudocumentproduitparla transformation;S alternate , qui vaut no si le programmeXSLT référencédoit être utilisé en priorité, ou yessinon.

Les deuxpremiersattributs sontobligatoires,les autresservant essentiellementà effectuerun choixquandplusieursinstructionsT ?xml-stylesheet? U sontprésentes.L’interprétationdecesattributsetlesvaleursqu’ils peuventprendresontenpartiesdépendantesdu processeurou del’environnement.Voiciparexemplecommenton peutindiquerà l’environnementde publicationCocoonunetransformationpardéfaut avec le programmeFilm.xsl, et, seulementdansle casd’un dialogueavec un terminalWML, leprogrammeFilmWML.xsl.

<?xml-stylesheet href="Film.xsl" type="text/xsl"?><?xml-stylesheet href="FilmWML.xsl" type="text/xsl" media="wap"?>

2Uneinstructiondetraitementn’étantpasun élément,on nepeutpasdire qu’elle a des«attributs» ausensstrict du terme.Il nes’agit ici qued’un choix deprésentationafin declarifier le contenudel’instruction,maiscelui-ci pourraitêtreconstituédetexte nonstructuré.

Page 119: Comprendre XSLT

3.2. LESRÈGLESXSLT 119

L’utilisation de cetteinstructionn’estpastoujourssouhaitablecarelle va dansunecertainemesureàl’encontred’uneséparationstrictedu documentXML et desprogrammesdetransformation.Chaquepro-cesseurdéfinit sespropresmodesd’applicationdeprogrammeXSLT. Signalonségalementquela recom-mandationXSLT prévoit la possibilitéd’inclure directementle programmeXSLT dansle documentXMLà transformer(embeddedstylesheets). Dansce casil n’y a plus de documentXSLT indépendant,ce quiempêchederéutiliserun programmepourd’autresdocumentsXML demêmestructure.

3.2 Les règlesXSLT

Nousdécrivonsdanscettesectionles règlesXSLT et leur déclenchement.Il s’agit d’un desaspectses-sentielsdeXLST puisquedansbeaucoupdecason peutécrireun programmesousla formederèglessedéclenchantsur certainsnœudset produisantunepartiedu résultat. La définition d’une règles’effectueavecl’élémentxsl:template , et le déclenchementavecxsl:apply-templates ou xsl:call-template .

Unerèglepeutêtredéclenchée(« instanciée») soitparsonnom,soitendonnantla catégoriedesnœudsdu documentsourceauxquelselle s’applique.Cettecatégorieestspécifiéeparunesous-classedesexpres-sionsXPathdésignéeparle termepatterndansla recommandationXSLT. Nouscommençonsparprésentercespatternsavantderevenirendétailsurlesrègleset leur instanciation.

3.2.1 Lespatterns

Le déclenchementdesrèglesbasésur les patternsn’est pasla partie la plus évidentede XSLT. Nousprenonsunexemplesimplepourcommencer.

Un exemple

Le programmesuivant rechercheet affiche les nomsdesenseignants,les attributs ID et l’intitulé desséancesdecours.

Exemple33 Pattern1.xsl: Exemplepour illustrer lespatterns

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="//NOM"/>

<xsl:apply-templates select="//SEANCE/@ID"/>

<xsl:apply-templates select="//SEANCE"/></xsl:template>

<xsl:template match="NOM"><NOM><xsl:value-of select="."/></NOM>

</xsl:template>

<xsl:template match="@ID"><IDSEANCE><xsl:value-of select="."/></IDSEANCE>

</xsl:template>

<xsl:template match="PROGRAMME/SEANCE"><SEANCE><xsl:value-of select="."/></SEANCE>

Page 120: Comprendre XSLT

120 CHAPTER3. XSLT

</xsl:template>

</xsl:stylesheet>

Appliquéà notredocumentCoursXML.xml(page110),on obtientle documentsuivant:

Exemple34 Pattern1.xml: Lerésultatdu programme

<?xml version="1.0" encoding="ISO-8859-1"?><NOM>Amann</NOM><NOM>Rigaux</NOM><IDSEANCE>1</IDSEANCE><IDSEANCE>2</IDSEANCE><IDSEANCE>3</IDSEANCE><SEANCE>Introduction</SEANCE><SEANCE>Documents XML</SEANCE><SEANCE>Programmation XSLT</SEANCE>

Ontrouvedansle programmePattern1.xslplusieursexpressionsXPath.Certainesapparaissentcommevaleurde l’attribut match de l’élémentxsl:template , d’autrescommevaleurde l’attribut selectdexsl:apply-templates . Ellesjouentun rôle différent:

1. l’expressiondansl’élémentxsl:apply-templates sertà désignerun ensemblede nœuds,etconstituedoncuneutilisationclassiquedeXPath;

2. l’expressiondansl’élémentxsl:template exprimeenrevancheuneconditionsurlesnœudsquivontpermettrededéclencherla règle.

Les deuxélémentsfonctionnentsolidairement: xsl:apply-templates permetde constituerunensemblede nœudsissusdu documentsource.Puis,pour chacunde cesnœuds,le processeurXSLT vachercherla règle(onsupposequ’il n’y enaqu’unepourl’instant) tellequele nœud«satisfait» la conditionexpriméeparl’attribut match .

Il resteàdéfinir la satisfactiond’un conditionexpriméeparl’expressiondel’attribut match – appelonscetteexpressionpatternà partir demaintenant.On peutl’exprimerassezsimplementde la manièresuiv-ante: un nœud_ satisfait un patterns’il existequelquepartdansl’arbre du documentsourceun nœudtel qu’enévaluantle patternavec ` commenœudcontexte,on obtienneun ensemblequi contient_ .

La premièrerègle

Reprenonsnotreexemple33. Le premierensemblede nœudsconsidérépar le processeurXSLT est laracinedudocument.Oncherchedoncla (ou les)règle(s)dontle patternestsatisfait parcenœudracine.Iln’en existequ’une,c’estla premièrerègle.Sonpatternest«/ », et enl’évaluantà partir den’importequelnœuddu documentsource,on obtientla racinela racinedu document.

Ondéclenchealorsla règlequi consisteentrois élémentsxsl:apply-templates .

La règleavecmatch="NOM"

Le premierxsl:apply-templates constitue,par évaluationde l’expressionXPath, l’ensembledetouslesnœudsdetypeNOM. Pourchacundecesnœuds,le processeurXSLT va chercherla (ou les)règlesdontle nœudsatisfait le pattern.

Seulela seconderègle convient. En prenanten effet commenœudcontexte le nœudde type EN-SEIGNANTetenévaluantle patternNOM, j’obtiensbientouslesnœudsdetypeNOM. Remarquezquecetterèglesedéclenchepour touslesélémentsdetypeNOM, quellequesoit leur positiondansl’arbre,puisqu’ilsuffit de prendrele pèrede cesnœuds(quel qu’il soit) et d’évaluerle patternpour quela conditionsoitsatisfaite.

Page 121: Comprendre XSLT

3.2. LESRÈGLESXSLT 121

La règleavecmatch="@ID"

Le secondxsl:apply-templates constitue,par évaluationde l’expressionXPath, l’ensembledetousles attributs ID desnœudsde type SEANCE. Cettefois c’est la troisièmerèglequi estdéclenchée.En prenanteneffet le père T SEANCEU dechaqueattribut et enévaluantle pattern@ID, on obtientbienl’attribut lui-même.

Commeprécédemment,remarquezquecetterèglesedéclenchepourtouslesattributsID , quelquesoitle typedel’élémentauquelils appartiennent.

La règleavecmatch="PROGRAMME/SEANCE"

Le dernierxsl:apply-templates constitue,par évaluationde l’expressionXPath, l’ensembledetousnœudsde typeSEANCE. C’est la dernièrerèglequi va êtredéclenchée.Prenonsen effet le premiernœudT SEANCEU commenœudcourant.Enprenantle pèredecenœud( T PROGRAMMEU ) commenœudcontexte et enévaluantle pattern, on obtientun ensemblevide. On nepeutdoncpasdire,à cestade,quela conditionestsatisfaite.

En prenantmaintenantle grand-père,le nœudT COURSU , et enévaluantPROGRAMME/SEANCE, onobtientbienunensemblequi contientnotrepremiernœudT SEANCEU , et la conditiondéclenchantla règleestsatisfaite.

On peutnotercettefois quela règlene s’appliquequ’auxélémentsde typeSEANCE, eux-mêmefilsd’un élémentdetypePROGRAMME. Cetterègleestdoncmoinsgénérale.

En conclusionun patterndansunerègledéfinit la «situation» desnœudsdel’arbre qui vont pouvoirdéclencherla règle.Cettesituationpeutêtretrèsgénérale: un pattern«NOM» définit unerègleapplicableà touslesélémentsde type NOM, quelquesoit leur position,et quequesoit le typede leursparents.Unpatterncomme«PROGRAMME/SEANCE» estdéjàplus restrictif. À l’extrême,un patternpeutêtreuncheminabsoluXPath,et la règlenes’appliqueplusalorsqu’àdesarbrestrèsparticuliers.

ExpressionsXPath et patterns

Pourquoidistinguerlespatternset lesexpressionsXPath? Pourlesdeuxraisonssuivantes:

1. l’interprétationd’un patternconsisteàl’évalueràpartird’un nœudcontexteetàvérifierquele nœudcourantappartientaurésultat: l’expressiondoit doncdonnerun ensembledenœuds;

2. si on acceptaittouteslesexpressionsXPathdonnantunensembledenœuds,il faudrait,pourvérifiersi unnœudvérifieunpattern, évaluerl’expressionpourtouslesnœudsdudocumentsource,àchaquefois.

La règlesuivantepar exemplen’est pasvalide: l’attribut match estuneexpressionXPath correctemaisdontle résultatn’estpasunensembledenœuds.La conditiondedéclenchementdela règlen’a doncpasdesens.

<!-- Pas bon --><xsl:template match="1">

...</xsl:template>

Deplus,touteslesexpressionsXPathdonnantunensembledenœudsnesontpasacceptées,essentielle-mentpourdesraisonsdeperformanceetdecomplexité d’implantationduprocesseurXSLT. La règlesuiv-anteparexempleestinterdite,et cebienquel’attribut match soit uneexpressionXPathdontl’évaluationdonneunensembledenœuds.

<!-- Pas bon --><xsl:template match="preceding::node()[5]">

...</xsl:template>

Page 122: Comprendre XSLT

122 CHAPTER3. XSLT

Pourdéterminersi cetterègledoit êtredéclenchéequandon rencontreun nœud_ , il faut regardersion trouve un nœudencinquièmepositiondansl’ordre dessuccesseursde _ . Si un tel nœudexiste,alorsl’évaluationdu patterndonnera_ .

Il estclair qu’autorisertouteslesexpressionsXPathengendreraitdesproblèmesdeperformance,ainsique desdifficultés de développementdesprocesseursXSLT. Les seulsaxes autorisésdansles patternsontdoncchild et attributes ainsi queleur syntaxe abbrégé.En plus, il estpossibled’utiliser lasyntaxeabbrégé// dedescendant-or-self::node()/child:: (Attention,il n’estpaspossibled’utiliser l’axedescendant-or-self explicitementdansun pattern).

Cetterestrictionpermetdedécrirel’évaluationd’un pattern a parrapportà un nœudcourant_ selonl’algorithmesuivant:

1. prendre_ commenœudcontexteetévaluer a ; si _ fait partiedu résultat,alors _ satisfait a ;

2. sinonprendrele pèrede _ , etrecommencerl’évaluation; si _ fait partiedurésultat,alors _ satisfaita ;

3. sinonrecommencerenparcourantlesancêtresde _ jusqu’àla racinedu document.

Évidemmentil estpossibledansla plupartdescasd’éviter le parcoursde tousles ancêtresdu nœudcourant.Il fautcependantêtreconscientquel’évaluationd’un patterndoit êtrefaitepour touslesnœudsdésignésparxsl:apply-templates , et qu’ellepeutêtrelonguesi l’expressionestcomplexe.

Quelquesexemples

Voici quelquesexemplesdepatternsavecleur signification.

S /COURS/ENSEIGNANTSserasatisfait partouslesnœudsdetypeENSEIGNANTSfils d’unélémentracinedetypeCOURS;S //SEANCE[@ID=2] ou SEANCE[@ID=2] serontsatisfait par tout nœuddetypeSEANCEayantunattribut ID valant2 (férifiezsi lesdeuxexpressionssontéquivalentes);S NOM[position()=2] serasatisfait par tout nœudqui est le deuxièmefils de type NOMde sonpère;S *[position()=2][name()="NOM" serasatisfait par tout nœudde type NOM, secondfils desonpère;S /COURS/@CODE[.="TC234"] serasatisfait par le nœudde type Attr , de nom CODE, fils del’élémentracine T COURSU , et dontla valeurestTC234.

3.2.2 Règles

Unerègleestdéfinieparun élémentdepremierniveauxsl:template . Cetélémentcomprenddesat-tributsqui décriventlesconditionsdedéclenchementdela règle,etuncontenuoucorpsderègledécrivantle texte à produirequandla règle est déclenchée(ou «instanciée» pour utiliser le vocabulaire XSLT).L’instanciationd’une règles’effectuetoujourspour un nœuddu documentsourcequi estdésignépar letermede nœudcourant. TouteexpressionXPath utiliséedansle corpsde la règle,quece soit pour ef-fectuerdestests,extrairedesinformationsouappelerd’autrerègle,prendrale nœudcourantcommenœudcontexte.

L’élémentxsl:template

Lesattributssontaunombredequatre3 :

1. match estle patterndésignantlesnœudsdel’arbreXML pourlesquelsla règlepeutsedéclencher;3La syntaxecomplètedel’élément(ainsiquedetousceuxquenousprésentonsparla suite)estdonnéedansl’annexe B, page279.

Page 123: Comprendre XSLT

3.2. LESRÈGLESXSLT 123

2. namedéfinitunerèglenomméequi pourraêtreappeléedirectementparsonnomavecxsl:call-template ;

3. mode permetdedéfinir descatégoriesderègles,à appelerdansdescirconstancesparticulières;

4. enfinpriority donneuneprioritéexplicite à la règle.

Touslesattributssontoptionnels,maissoit name, soit match doit êtredéfini. Dansle premiercaslarègleseraappeléeparxsl:call-template , dansle secondcas,c’estauprocesseurdedéterminer, enfonctiondunœudcourantetdupattern(ainsiquedela résolutiondesconflitséventuels),si la règledoit êtreappelée.Cesdeuxtypesderèglescorrespondentàdeuxstylesdeprogrammationdifférents.Le premiercas(appelde règle)s’apparenteplutôt à uneprogrammationparappelde fonction, tandisqu’avecle second,plus«déclaratif», onsecontentede«déclarer» cequ’onveutobtenir, àchargepourle processeurdefairele choixdela règleappropriée.

Règlespar défaut

XSLT définitunensemblederèglespardéfautqui sontappliquéesquandaucunerègleduprogrammen’estsélectionnée.La premièrerèglepardéfauts’appliqueà la racinedu documentet à tousleséléments.Ellesecontentededéclencherun appelderèglepourtouslesfils du nœudcourant.

<xsl:template match="* | /"><xsl:apply-templates/>

</xsl:template>

Rappelonsqu’un appelà xsl:apply-templates sansattribut select estéquivalentà la sélec-tion detouslesfils du nœudcourant.Cetterègleestutiliséepourtouslesxsl:apply-templates quinetrouventpasderègleàdéclencher, y comprisquandun modeestindiqué.

La seconderèglepardéfauts’appliqueauxnœudsdetexteetauxattributs.Elle insèrelecontenutextueldecesnœudsdansle documentrésultat.

<xsl:template match="text() | @*"><xsl:value-of select="."/>

</xsl:template>

Enfin la dernièrerèglepar défaut s’appliqueaux commentaireset aux instructionsde traitement.Lecomportementpardéfautestdelesignorer. La règlenefait doncrien:

<xsl:template match="processing-instruction() | comment()"/>

Voici le programmeXSLT minimal: il ne contientaucunerègle,à part les règlespardéfautqui sontimplicites.

Exemple35 Defaut.xsl: Un programmeXSLT minimal

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

</xsl:stylesheet>

L’applicationdeceprogrammeà notredocumentCoursXML.xmldonnele résultatsuivant:

Exemple36 Defaut.xml: Lerésultatdesrèglespar défaut

Page 124: Comprendre XSLT

124 CHAPTER3. XSLT

<?xml version="1.0" encoding="UTF-8"?>

Publication XSLT

AmannRigaux

IntroductionDocuments XMLProgrammation XSLT

Les règlespar défaut se sont donc appliquées.Elles ont permisde parcourir tous les élémentsdudocument,enproduisantle contenudesnœudsdetypeText. Notezquelesattributsnesontpassélectionnéspar lesexpressionsXPathdanslesxsl:apply-templates desrèglespardéfaut,et queleur contenun’apparaîtdoncpas.

3.2.3 Déclenchementde règlesavecxsl:apply-templates

L’élémentxsl:apply-templates désigneun ensembledenœudsavecuneexpressionXPath,et de-mandel’applicationd’unerèglepourchaquenœud.L’expressionesttoujoursévaluéeenprenantcommenœudcontexte le nœudpourlequella règlecontenantxsl:apply-templates aétéinstanciée.

Cetélémenta deuxattributs,tousdeuxoptionnels:

1. select contientl’expressionXPathdésignantlesnœudsà traiter;

2. mode estla catégoriedesrèglesàconsidérer.

L’expressiondel’attribut select doit toujoursramenerun ensembledenœuds.Savaleurpardéfautestchild::node() , autrementdit touslesfils du nœudcourant,quelquesoit leur type,à l’exceptioncommed’habitudedesattributs(voir chapitre2).

Instanciation desrègles

Pourchaquenœudde l’ensembledésignépar l’expressionXPath, le processeurva rechercherla règleàappliquer. Il n’y a pasderaisonà priori pourquela mêmerèglesoit appliquéeà touslesnœuds.Prenonsl’exempledu programmesuivant,appliquéà notreexempleCoursXML.xml.

Exemple37 ApplyTemplates.xsl: Exempledexsl:apply-template

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="//ENSEIGNANTS"/>

</xsl:template>

<xsl:template match="ENSEIGNANTS"><xsl:comment>

Application de la règle ENSEIGNANTS</xsl:comment><xsl:apply-templates/>

Page 125: Comprendre XSLT

3.2. LESRÈGLESXSLT 125

</xsl:template>

<xsl:template match="NOM"><xsl:value-of select="position()"/> : Noeud NOM

</xsl:template>

<xsl:template match="text()"><xsl:value-of select="position()"/> : Noeud de texte

</xsl:template>

<xsl:template match="comment()"><xsl:value-of select="position()"/> : Noeud de commentaire

</xsl:template></xsl:stylesheet>

Il contientplusieursrègles.La premièredéclencheunxsl:apply-templates pourtouslesnœudsdetypeENSEIGNANTS. Il n’existequ’un nœuddecetype,et unerègleassociéequi estinstanciée.

Cetterègleproduitun commentairedansle documentrésultatavecl’instruction xsl:comment , puisdéclencheà sontour un xsl:apply-templates sansdonnerde cible, ce qui revient à sélectionnertouslesfils du nœudT ENSEIGNANTSU . Onobtientle résultatsuivant:

Exemple38 ApplyTemplates.xml: Résultatdu programmeprécédent

<?xml version="1.0" encoding="ISO-8859-1"?><!--

Application de la règle ENSEIGNANTS-->

1 : Noeud de texte2 : Noeud de commentaire3 : Noeud de texte4 : Noeud NOM5 : Noeud de texte6 : Noeud NOM7 : Noeud de texte

Ques’est-il passé? On peutreconnaîtrel’exécutionde la seconderègleau commentaire.Ensuiteleprocesseura pris tous les nœudsfils de T ENSEIGNANTSU et a cherchéla règleà instancier. On peutconstaterqu’il y a septnœuds,dontquatresontdesnœudsdetexte constituésuniquementd’espace.Nousavonsvu quecesnœudsétaientprésentsdansl’arbre DOM, et ils ne sontpaséliminéspar le processeurXSLT, à moinsdele demanderexplicitementavecun xsl:strip-space : voir page278.

En généralcesnœudssont traités«silencieusement» par le processeur: la règlepar défaut pour lesnœudsdetypeText s’applique,elle consisteà insérerle contenudansle résultat,maiscommececontenuestconstituéd’espaces,celapasseengénéralinaperçu.

Ici il existe une règlespécifiquepour les nœudstextes, qui affiche notammentleur position. C’estcetterèglequele processeurXSLT a instanciée.On peutfaire la mêmeremarquepour le nœudde typeCommentet lesélémentsdetypeNOMpourlesquelsunerèglespécifiqueexistedansnotreprogramme.

Contexted’instanciation d’une règle

Un élémentxsl:apply-templates estassociéà uneexpressionXPathqui sélectionneun ensembledenœuds.Commenousl’avonsvu dansle chapitre2, pourchaquenœuddecetensemble,on connaîtlapositionavecla fonctionposition() et le nombredenœudsavecla fonction last().

Cesinformationsserventdecontexteàl’instanciationdesdifférentesrègles.Pourchaquerègle,il existeunnœudcourant,celuiqui adéterminéla sélectiondela règle.Onpeutdeplusfaireréférenceà la positionou à la taille du contexte: enl’occurrence,celanousapermisdenuméroterlesnœudsavecposition().

Page 126: Comprendre XSLT

126 CHAPTER3. XSLT

3.2.4 Sélectiondesrègles

Regardonsmaintenantcommentune règle est sélectionnéequandplusieurspossibilitésexistent. Pourchaquenœudsélectionnépar un xsl:apply-templates , le processeurva regardertoutesles règlesdu programme,et testerle patterncommeindiquéprécédemment(voir page119) pour déterminersi lenœudsatisfait la règle.

Quandaucunerèglen’est trouvée,c’est la règlepar défaut qui est instanciée.Si uneseulerègleesttrouvée,elle s’applique,cequi signifiebienqu’elle estprioritair e parrapportà la règlepardéfaut. Cettemêmenotiondeprioritésegénéraliseà la situationoùplusieursrèglessontcandidates.Le processeurdoitalorschoisir la règleà instancierenfonctiond’un systèmedepriorités.

Un autrefacteurintervenantdansle choixd’unerègleestle mode. Enfinnousavonsvu (page115)quel’importationdeprogrammedéfinit unepréséance(ànepasconfondreavecla priorité).

Nousdécrivonsci-dessousle rôle desattributs priority et mode de l’élémentxsl:template ,avantderécapitulerlesprincipesdechoix d’unerègle.Le documentXML utilisé pournosexemplesdanscettesectionestunelistedefilms (trois seulement).

Exemple39 ListeFilms.xml: Unelistedefilms

<?xml version="1.0" encoding="ISO-8859-1"?><FILMS><FILM><TITRE>Vertigo</TITRE><ANNEE>1958</ANNEE><GENRE>Drame</GENRE><MES>Alfred Hitchcock</MES><RESUME>Scottie Ferguson, ancien inspecteur de police,

est sujet au vertige depuis qu’il a vu mourir soncollègue. Elster, son ami, le charge de surveillersa femme, Madeleine, ayant des tendancessuicidaires. Amoureux de la jeune femme

Scottie ne remarque pas le piège qui se trame autourde lui et dont il va être la victime...

</RESUME></FILM><FILM><TITRE>Alien</TITRE><ANNEE>1979</ANNEE><GENRE>Science-ficti on</GE NRE><MES>Ridley Scott</MES><RESUME>Près d’un vaisseau spatial échoué sur unelointaine planète, des Terriens en mission découvrent

de bien étranges "oeufs". Ils en ramènent un à bord,ignorant qu’ils viennent d’introduire parmi

eux un huitième passager particulièrementféroce et meurtrier.</RESUME></FILM><FILM><TITRE>Titanic</TITRE><ANNEE>1997</ANNEE><GENRE>Drame</GENRE><MES>James Cameron</MES><RESUME>Conduite par Brock Lovett, une expéditionaméricaine fouillant l’épave du Titanic remonte à la

surface le croquis d’une femme nue. Alertée par lesmédias la dame en question, Rose DeWitt

Bukater, aujourd’hui centenaire, rejoint les lieux dunaufrage, d’où elle entreprend de conter le

récit de son fascinant, étrange et tragique voyage...</RESUME></FILM></FILMS>

Page 127: Comprendre XSLT

3.2. LESRÈGLESXSLT 127

Priorités

La priorité d’une règlepeutêtresoit indiquéeexplicitementavec l’attribut priority , soit calculéeim-plicitementparle processeur.

Prenonstout d’abord le casoù on indique explicitementune priorité. Supposonsque l’on veuillerecopiertout le documentListeFilms.xml, à l’exceptiondu résumédesfilms. On peutenvisagerdedéfinirunerèglepourtouslestypesdenœuds,enrecopiantleur contenu,balisescomprises,saufdansle casdesélémentsdetypesRESUMEpourlesquelson nefait rien.

Une solutionplus simpleet plus généraleconsisteà utiliser l’instruction xsl:copy qui recopieunnœuddudocumentsourceversle documentrésultat.Dansnotrecasxsl:copy doit êtreutilisépourtouslesnœuds,saufpour T RESUMEU . Deuxrèglessuffisent:

S unerèglepourlesélémentsdetypeRESUME, qui nefait rien;S unerèglepour tous les nœudsqui effectuela copiedu nœudpour lequelelle estinstanciée,et quidéclencheun xsl:apply-templates pourlesfils decenœud.

Cesdeuxrèglesserontsélectionnéespourun nœuddetypeRESUME. Afin d’indiquerquela premièreestprioritaire,il suffit dedonneràla secondeuneprioritéfaible,parexemple-1. Voici le programmeXSLTqui copietouslesfilms saufleur résumé.

Exemple40 Priority.xsl: Utilisation del’attrib ut priority

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"

><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates/>

</xsl:template>

<xsl:template match="RESUME"/>

<xsl:template match="@*|node()" priority="-1"><xsl:copy>

<xsl:apply-templates select="@*|node()"/></xsl:copy>

</xsl:template>

</xsl:stylesheet>

La troisièmerègle avec l’attribut match="@*|node()" et avec la priorité -1 s’appliqueà tousles typesde nœuds. Elle commencepar copier le nœudcourant,puis sélectionneavec xsl:apply-templates toussesfils, y comprislesattributs. Pourchacundesesfils la mêmerègles’appliquerécur-sivement,jusqu’àcequela totalitédu documentsoit parcourueet recopiée.

LesélémentsT RESUMEU constituentla seuleexception: la règleappeléeenprioritéalorsestcellequiestspécifiqueà cetyped’élément,etelle neproduitaucunrésultat.Onobtientdoncle documentsuivant:

Exemple41 Priority.xml: Résultatdu programmePriority.xsl

<?xml version="1.0" encoding="ISO-8859-1"?><FILMS><FILM><TITRE>Vertigo</TITRE><ANNEE>1958</ANNEE><GENRE>Drame</GENRE><MES>Alfred Hitchcock</MES>

Page 128: Comprendre XSLT

128 CHAPTER3. XSLT

</FILM><FILM><TITRE>Alien</TITRE><ANNEE>1979</ANNEE><GENRE>Science-ficti on</GE NRE><MES>Ridley Scott</MES>

</FILM><FILM><TITRE>Titanic</TITRE><ANNEE>1997</ANNEE><GENRE>Drame</GENRE><MES>James Cameron</MES>

</FILM></FILMS>

Quanduneprioritéexplicite n’estpasindiquée,le systèmeencalculeuneensebasantsurle patterndel’attribut match :

1. Tousles patternsconstituésd’une seuleétapeXPath,avec un nom d’élémentou d’attribut et sansprédicatont uneprioritéégaleà 0.

Exemple: FILM , @CODE.

2. Le patternprocessing-instruction(’nom’) a lui aussiuneprioritéégaleà 0.

3. Tousles patternsconstituésd’une seuleétapeXPath, avec un nom d’élémentou d’attribut égalà«* » etun espacedenomont uneprioritéégaleà -0,25.

Exemple: xbook:* .

4. Lesfiltres sansespacedenomet autresqu’un nomd’élémentou d’attribut ont unepriorité égaleà-0,5.

Exemple: node() , processing-instruction() , *

Enfin touslespatternsqui n’appartiennentpasà unedescatégoriesci-dessusont unepriorité égaleà0,5.C’estle casparexempledespatternsavecprédicat,ou despatternsconstituésdeplusieursétapes.

Il resteuncasàconsidérer, celuid’un patternconstituéd’uneunionavecl’opérateur«|». Parexemple:

<xsl:template match="SUJET|node()">corps de la règle

</xsl:template>

Danscecasle processeurconstituesimplementdeuxrèglesindépendantes,et calculela priorité pourchacune.On seretrouvedoncavec:

<xsl:template match="SUJET">corps de la règle

</xsl:template><xsl:template match="node()">

corps de la règle</xsl:template>

La premièrerèglea uneprioritéégaleà 0, la secondeunepriorité égaleà -0,5.

Si on reprendl’exempledu programmePriority.xsl, page127, on s’aperçoitmaintenantqu’il étaitinutile dedonneruneprioritépuisquecellesdéterminéespardéfautsontlessuivantes:

S RESUMEa unepriorité de0;

Page 129: Comprendre XSLT

3.2. LESRÈGLESXSLT 129

S la dernièrerèglesediviseendeux:

– @*auneprioritéde-0,5;

– node() auneprioritéde-0,5;

Doncladernièrerègleestmoinsprioritaire,cequi correspondàl’intuition qu’elleestmoins«spécifique»,autrementdit qu’elle s’appliqueà uneplusgrandevariétédenœuds.C’est la mêmeintuition qui mèneàaffecterunepriorité plus grandeà un patterncommeFILM/TITRE (priorité 0,5) qu’au patternTITRE(priorité 0).

Modes

Les modesconstituentla dernièremanièrede guider le processeurdansle choix d’une règle. L’attributmode est optionnel: en son absencela règle seraconcernéepar tout xsl:apply-templates quilui non plus n’utilise passon attribut mode. Sinon le modede la règle et le modede xsl:apply-templates doiventcoïncider.

Lesmodessontprincipalementutilesquandonsouhaiteplacerla mêmeinformationissuedudocumentsourceenplusieursendroitsdu documentrésultat.Nousallonsprendreun exemplequi suffira à illustrerl’idée. Supposonsque l’on veuille créerun documentHTML avec une présentationde tous les filmsprésentsdansListeFilms.xml(voir page126). La pageHTML affichéedansle navigateurauraunetaillerespectable.Si on veutconsulterun film particulier, il faudrafairedéfilerla pagedansla fenêtre.

Pourfaciliter la tâchedel’utilisateur, on peutintroduireuneliste d’ancresHTML audébut dela page.La baliseT A U peutêtreutiliséepourdéfinirunepositioninterneàundocumentenplaçantdes«marques».Parexemple:

<a name=’Alien’/>

définit unepositionde nom Alien . On peutalorsutiliser uneancredonnantdirectementaccèsà cetteposition:

<a href=’#Alien’>Lien vers le film Alien</A>

Le programmeXSLT qui suit effectuedeux passagessur les nœudsde type FILM , avec deux rè-gles utilisant le mêmepattern mais deux modesdifférents. Au coursdu premierpassage(règle avecmode=’Ancres ) on créeun tableauHTML avecuneseuleligne contenantuneancrepourchaquefilm.Le secondpassagecréeunereprésentationHTML complètedechaquefilm. Lesrèglessontappeléesavecdeuxxsl:apply-templates , aveclesmodescorrespondant.

<xsl:apply-templates select="FILM" mode ="Ancres"/><xsl:apply-templates select="FILM"/>

Voici le programmecomplet:

Exemple42 Mode.xsl: Utilisation del’attrib ut mode

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="html" encoding="ISO-8859-1"/>

<xsl:template match="FILMS"><html>

<head><title>Liste des films</title></head><body bgcolor="white">

<center><table>

Page 130: Comprendre XSLT

130 CHAPTER3. XSLT

<xsl:apply-templates select="FILM"mode ="Ancres"/>

</table></center><xsl:apply-templates select="FILM"/>

</body></html>

</xsl:template>

<xsl:template match="FILM" mode="Ancres"><td><a href="#{TITRE}">

<xsl:value-of select="TITRE"/></a></td>

</xsl:template>

<xsl:template match="FILM"><a name="{TITRE}"/><h1><xsl:value-of select="TITRE"/></h1><b><xsl:value-of select="TITRE"/>,</b>

<xsl:value-of select="GENRE"/><br/><b>Réalisateur</b> : <xsl:value-of select="MES"/><p>

<b>Résumé</b> : <xsl:value-of select="RESUME"/></p>

</xsl:template>

</xsl:stylesheet>

Notezlapossibilitéd’introduiredesexpressionsXPathpourcalculerla valeurdel’attribut d’unélémentlittéral, commedans:

<a name="{TITRE}"/>

Ce mécanismeestdécrit dansle chapitrequi suit, page?? (voir égalementdansla référenceXSLT,page258). Le résultatdela transformation(ou plusexactementsaprésentationavecNetscape)estdonnédansla figure3.3. En cliquantsur lesancresplacéesaudébut du document,on sepositionnedirectementsurle film correspondant.

Algorithme desélectiond’une règle

Voici, enrésumé,commentle processeurXSLT choisitunerègleà instancierpourunnœudsélectionnéparxsl:apply-templates . Au départ,la listedesrèglescandidatesestconstituéedetoutescellesqui ontun attribut match .

1. Onrestreintla listeàtouteslesrèglesquiontlemêmemodequel’élémentxsl:apply-templates ,oupasd’attribut mode si xsl:apply-templates lui-mêmen’ena pas.

2. On testele patterndel’attribut match pourdéterminersi le nœudsatisfait la règle.

3. Sionatrouvéplusieursrègles,onnegardequecelle(s)quia(ont)laplusgrandepréséanced’importation(voir page115).

4. S’il resteencoreplusieursrègles,on prendcellequi a la plusgrandepriorité.

Si cet algorithmene permetpasde départagerdeuxrègles,le processeurXSLT peuts’arrêterou enchoisir une(en principela dernièredansl’ordre du programme).Il y a clairementdansce casun prob-lèmede conceptiondu programme.Si, aucontraire,aucunerèglen’est trouvée,alorsla règlepardéfauts’applique(voir page123).

Page 131: Comprendre XSLT

3.2. LESRÈGLESXSLT 131

Figure3.3: Affichagedu résultatavecNetscape

3.2.5 Appel de règle avecxsl:call-template

Quandunerègleutilise l’attribut nameaulieu del’attribut match , onpeutl’instancierexplicitementavecun xsl:call-template . L’utilisation dexsl:call-template s’apparenteauxfonctionsdansunlangagede programmationclassique.Commeles fonctions,la règleappeléedoit permettrede factoriserdesinstructionsutiliséesenplusieursendroitsdu programme.

Reprenonsl’exempleaffichant les nœudsdu documentCoursXML.xmlen les numérotant. Le pro-grammeApplyTemplates.xml(voir page125)contenaitunerèglepourchaquetypedenœudrencontré,ettoutescesrèglesproduisaientà peuprèsle mêmerésultat: la positiondu nœudcourant,et un texte.

Le programmeci-dessousremplacele corpsdecesrèglesparunappelxsl:call-template àunerèglenomméeAfficher qui sechargedeproduirele résultat.

Exemple43 CallTemplate.xsl: Exempledexsl:call-template

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="//ENSEIGNANTS"/>

</xsl:template>

<xsl:template match="ENSEIGNANTS"><xsl:comment>

Application de la règle ENSEIGNANTS</xsl:comment><xsl:apply-templates/>

</xsl:template>

Page 132: Comprendre XSLT

132 CHAPTER3. XSLT

<xsl:template name="Afficher"><xsl:value-of select="position()"/> : <xsl:value-of select="."/>

</xsl:template>

<xsl:template match="NOM"><xsl:call-template name="Afficher"/>

</xsl:template>

<xsl:template match="text()"><xsl:call-template name="Afficher"/>

</xsl:template>

<xsl:template match="comment()"><xsl:call-template name="Afficher"/>

</xsl:template>

</xsl:stylesheet>

L’améliorationn’estpasencorecomplète,et nousverronsqu’il estpossibledefairemieuxenutilisantxsl:for-each ou un passagede paramètre.Le progrèsnotableestqu’il devient maintenantpossibledemodifier l’ensembledela sortiedu programmeennetouchantqu’aucorpsdela règleAfficher . Lerésultatdu programmeestdonnéci-dessous.

Exemple44 CallTemplate.xml: Résultatdu programmeprécédent

<?xml version="1.0" encoding="ISO-8859-1"?><!-- Application de la règle ENSEIGNANTS-->1 :2 : Enseignant responsable3 :4 : Amann5 :6 : Rigaux7 :

Il fautsoulignerqu’unappelavecxsl:call-template nechangepasle contexte: le nœudcourant(et doncsoncontenutextuel), sapositionet la taille du contexte restentconnusdansle corpsde la règleAfficher .

La comparaisonentrexsl:call-template et un appelde fonction restelimitée. En particulier,danscequenousavonsvu jusqu’ici,S uneinstanciationderèglene«renvoie» pasdevaleur;S uneinstanciationderègleneprendpasd’argumentautrequele nœudauquelelles’applique;

Nousverronsdansla sectionconsacréeauxvariables,page138,commentstocker dansunestructuretemporairele texteproduitparunerègleaulieu del’insérerdirectementdansle résultat.

En ce qui concernela deuxièmelimitation, elle est en partie levée par la possibilitéde passerdesparamètresauxrègles.

3.2.6 Paramètres

L’exemplede xsl:call-template quenousavonsdonnéprécédemmentoffrait assezpeud’intérêtpuisqu’il n’était paspossibledevarierle texteproduitparAfficher enfonctiondu typedenœud.Nousallonsaméliorerla règleenlui passantenparamètrele texteàafficheraprèsla positiondu nœudcourant.

Le passagedeparamètress’effectueendeuxétapes.Toutd’abordon indiqueauniveaudela définitiondela règle,avecdesélémentsxsl:param , le nomdu paramètreet savaleurpardéfaut.La syntaxeest

Page 133: Comprendre XSLT

3.2. LESRÈGLESXSLT 133

T xsl:param name=nom select= expression UL’attribut nom est le nom du paramètre,et expression (optionnel)estuneexpressionXPath qui,

convertieenchaînedecaractères,donnela valeurpardéfautdu paramètre.Voici la nouvelleversiondela règleAfficher , avecun paramètrenommétexte ayantpourvaleur

pardéfautstring(inconnu) .

<xsl:template name="Afficher"><xsl:param name="texte" select="string(inconnu)"/><xsl:value-of select="position()"/> :

<xsl:value-of select="$texte"/></xsl:template>

Remarque: AttentionauxchaînesdecaractèresconstantesdansXPath.Si on avait mis:

<xsl:param name="texte" select="inconnu"/>

le processeurXSLT aurait évalué la valeurpar défaut en recherchantun élément T inconnu U fils del’élémentcourant.La fonctionstring() lève l’ambiguïté.Uneautrepossibilitéestd’encadrerla chaînepardesapostrophessimples:

<xsl:param name="texte" select=" ’inconnu’ "/>

Bien entenduon peutinverserlesguillemetset lesapostrophessimples.

Maintenanton peut,avantd’appelerla règle,définir les paramètresavecxsl:with-param . Voiciparexemplel’appel àAfficher endonnantaupréalableauparamètrela valeur« texte vide ».

<xsl:template match="text()"><xsl:call-template name="Afficher">

<xsl:with-param name="texte"select="string(’texte vide’)"/>

</xsl:call-template></xsl:template>

Le positionnementdexsl:with-param suit desrèglesprécises:

1. il peutapparaîtredansle contenude l’élémentxsl:call-template , commeci-dessus; c’estd’ailleursle seulcontenupossiblepourxsl:call-template ;

2. on peutaussipasserdesparamètresà xsl:apply-templates , en les plaçantimmédiatementaprèsla baliseouvrantedecetélément.

Le passagedesparamètresavec XSLT estd’une grandesouplesse.On peutpasserà une règledesparamètresqu’elle n’attendpas,ou au contrairene paslui passerde paramètre.Dansle premiercasleparamètreesttout simplementignoré.Dansle secondcasla règleprendencomptela valeurpardéfautduparamètre,si cettevaleurexiste.

Il estpossibled’utiliser xsl:param commeun élémentde premierniveau. Dansce cas,commeiln’y a paseudedéclenchementderègleavecxsl:with-param pouraffecterunevaleurauparamètre,c’estauprocesseurdedéterminerquelleestla valeurduparamètre.Il existeplusieurspossibilités,dontlesdeuxsuivantes:

1. quandleprocesseurestinvoquédepuisla lignedecommande,uneoptionpermetengénéraldedéfinirle paramètre: c’est par exemplel’option -PARAMavec le processeurXALAN (voir l’annexe A,page246);

2. quandle processeurest intégréà un serveur web (casde Cocoon),les paramètressont ceux duprotocoleHTTP(variablesGETou POST).

Page 134: Comprendre XSLT

134 CHAPTER3. XSLT

3.3 Instructions decontrôle

Jusqu’àprésentnousavons surtoutconsidéréXSLT commeun langagepermettantde «déclarer» desactionsà exécuterenfonctiondecertainsévénements(la rencontred’un nœuddansle documentsource).Cemodedeprogrammationestbienadaptéautraitementd’unestructurearborescente,et ded’autantplusquecetraitementestorientéversla productiond’un autredocument.

Certainesmanipulationscourantesenprogrammation(tests,boucles,utilisationdevariables)seraientcependantimpossibles,ou très laborieusessi on devait se restreindreà l’utilisation desrègles. XSLTproposelesstructuresclassiquesdetest,d’itérationet,dansunecertainemesure,d’utilisationdevariables,avecdesparticularitésimportantes.La plusnotableconcernelesvariables: d’unepartil n’estpaspossibledelesmodifier(il auraitpeut-êtreétéplusjudicieuxdeparlerde«constante»), etd’autrepartunevariableestsoit localeà unerègle,et inconnuealorsdesautresrègles,soit globaleauprogrammeet connuealorsdetouteslesrègles.

En pratiquecelasignifie quebeaucoupde pratiqueshabituellesen programmationsont impossibles.Parexemple:

1. onnepeutpasconstruireunebouclesurunevariabledecontrôleincrémentéeà chaqueétape;

2. on ne peutpasaffecterunevaleurà unevariabledansunerègle,et utiliser cettevariabledansuneautrerèglesansla passercommeparamètre.

La dernièrepropriétéest importante: elle implique queles règlessont indépendantes, et quel’ordredansle programmeaussibienquel’ordre d’exécutionnesontpasimportant.Celalaisseauprogrammeurla possibilitéde concevoir sonprogrammepar blocsindépendants,et celalaissesurtoutau processeurlapossibilitéd’optimiserl’ordre d’exécutiondesrègles,voire delesexécuterenparallèle.

XSLT n’estpasnécessairementun langagequel’on doit utiliserpouruneprogrammation«classique»à basede boucles,testset appelsde fonctionsintensifs. Ce style de programmationestpossible,maisavecunesyntaxequi peutparaîtrelourde,et l’utilisation demécanismeassezéloignésdumodehabituelderaisonnement.

Nousprésentonsmaintenantles élémentsde XSLT correspondantsaux tests,boucleset variablesennouslimitant à descassimples.La sectionseconclutsur un exempleplus élaboréde constructiond’unprogrammeXSLT.

3.3.1 Tests: xsl:if et xsl:choose

L’instruction de test la plus simpleestxsl:if . L’élémenta un attribut, test , dont la valeurdoit êtreuneexpressionXPath. Cetteexpressionestévaluée,puisconvertieen booléen.Le contenude l’élémentxsl:if estinstanciési l’évaluationdonnetrue .

L’exemplesuivant montrel’utilisation de xsl:if pour ne garderdansle documentListeFilms.xml(voir page126)quelesfilms qui sontparusavant1970.

Exemple45 If.xsl: Utilisation dexsl:if

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="FILMS"><xsl:apply-templates select="FILM"/>

</xsl:template>

<xsl:template match="FILM"><xsl:if test="ANNEE &lt; 1970">

<xsl:copy-of select="."/>

Page 135: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 135

</xsl:if></xsl:template>

</xsl:stylesheet>

Ce programmeutilise une instructionxsl:copy-of qui copie le nœudcourantainsi quetoussesdescendants(copie en profondeur)dansle documentrésultat. Noter que l’opérateur« T » ne peutêtreutilisé directementdansle testet doit êtreremplacéparuneréférenceà l’entité prédéfinie&lt; .

Il n’y a pasde else dansXSLT. S’il estnécessaired’utiliser une instructionde branchemententreplusieurschoix, on peut utiliser xsl:choose . La structures’apparenteà celle du switch dansleslangagesdérivésdu C (C++,Java, ...), avecdeuxélémentscomplémentaires:

S xsl:when estsemblableà xsl:if , et permetd’exprimerundeschoix;S xsl:otherwise estle choixpardéfaut,aucundesxsl:when n’a étéinstancié.

La structuredu xsl:choose estdonnéeci-dessous.Il doit y avoir au moinsun xsl:when , maisxsl:otherwise estoptionnel.

<xsl:choose><xsl:when test=’expression1’>

Corps de règle 1</xsl:when><xsl:when test=’expression2’>

Corps de règle 2</xsl:when>...<xsl:otherwise>

Corps de règle par défaut</xsl:otherwise>

</xsl:choose>

Le processeurévalue successivementles expressionsdesxsl:when , et instanciele premierpourlequel cetteévaluationdonnetrue . Tout le resteest alors ignoré. L’ordre desxsl:when est doncimportant,surtoutsi leschoixnesontpasexclusifs.

Le programmesuivant classe(un peuarbitrairement...)les films en deuxcatégories: ceuxqui sontparusavant1960sontconsidéréscommeanciens,lesautrescommerécents.Si on n’estni dansun casnidansl’autre,un messageinterrogatifestproduit.

Exemple46 Choose.xsl: Utilisation dexsl:choose

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="FILMS"><xsl:apply-templates select="FILM"/>

</xsl:template>

<xsl:template match="FILM"><xsl:choose>

<xsl:when test="ANNEE &lt; 1960">"<xsl:value-of select="TITRE"/>" est ancien

</xsl:when><xsl:when test="ANNEE &gt;= 1960">

Page 136: Comprendre XSLT

136 CHAPTER3. XSLT

"<xsl:value-of select="TITRE"/>" est récent</xsl:when><xsl:otherwise>

De quand date "<xsl:value-of select="TITRE"/>" ?</xsl:otherwise>

</xsl:choose></xsl:template>

</xsl:stylesheet>

3.3.2 Boucles: xsl:for-each

L’instruction xsl:for-each est la seulestructureexplicite d’itération dansXSLT (l’autre possibilitéétantd’appelerrécursivementunerèglenommée,commenousle verrionsplus loin). Le while n’existepaspuisqu’il supposela possibilitéde modifier, dansle corpsde la boucle,la condition qui déterminel’arrêt. Or, commenousl’avonssignalé,il n’existepasdansXSLT de«variable» ausenscourantduterme(nom auquelon peutaffecterunevaleur). Danscesconditionsle while n’apporteraitrien de plus quexsl:for-each .

L’itérations’effectuetoujourssurun ensembledenœudsconstituéparl’expressionXPathdel’attributselect . Elle consisteà prendresuccessivementcommenœudcourantchaquenœuddel’ensemble,et àinstancierle contenudel’élémentxsl:for-each enprenantpourcontexte:

1. cenœudcourant;

2. la taille del’ensemble(fonction last()) ;

3. la positiondunœudcourantdansl’ensemble(fonctionposition()).

Il s’agit destrois informationshabituellesdéfinissantun contexte XPath. Il faut bien noter que cecontexte est local à xsl:for-each au seind’une règle,et que le nœudcourantredevient celui pourlequella règlea étéinstanciéedèsquela boucleestterminée.

Prenonsl’exemplesuivant,basésur le documentCoursXML.xml(page110). On veutparcourirtouteslesséancesdecours,afficherpourchacunesonnuméro,le nombretotaldeséancesetl’intitulé dela séance.Le programmeestbasésurxsl:for-each 4 :

Exemple47 ForEach.xsl: Utilisation dexsl:for-each

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><PROGRAMME>

<xsl:apply-templates select="//PROGRAMME"/></PROGRAMME>

</xsl:template>

<xsl:template match="PROGRAMME">Programme <xsl:value-of

select="concat(position(), ’/’, last())"/> :

<SEANCES><xsl:for-each select="SEANCE">

Séance <xsl:value-of

4La fonctionconcat() construitunechaînedecaractèresenconcaténantsesarguments.

Page 137: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 137

select="concat(position(), ’/’, last())"/> :<xsl:value-of select="."/>

</xsl:for-each></SEANCES>

Valable pour l’année <xsl:value-of select="ANNEE"/></xsl:template>

</xsl:stylesheet>

Onpeutnotertoutdesuitequ’il auraitétépossibled’obtenirexactementlamêmechoseavecxsl:apply-templates et unerègledédiéeaux élémentsde typeSEANCE. La différenceentreles deuxapprochesestessentiellementunequestionde style. D’un côtéon peut considérerque le codeestplus clair avecxsl:for-each , et qu’il seraprobablementplus efficacepuisqu’il n’est pasnécessairede recherchelarègleà instancier.

D’un autrecôtéon ne peutpasréutiliserunerègle indépendantepour SEANCE. Un programmequin’utiliseraitquexsl:for-each sepriveraitdequelques-unsdesavantagesdeXSLT : sarelativedéclar-ativité (c’estle processeurqui cherchela règleàappliquer)et la réutilisabilitédesrèglesdansdescontextesdifférents.

Voici le résultatdu programmeForEach.xsl.

Exemple48 ForEach.xml: RésultatdeForEach.xsl

<?xml version="1.0" encoding="ISO-8859-1"?><PROGRAMME>

Programme 1/1 :

<SEANCES>Séance 1/2 : Documents XMLSéance 2/2 : Programmation XSLT

</SEANCES>

Valable pour l’année 2002</PROGRAMME>

L’élémentxsl:for-each est inclus dansle corpsd’une règle qui a été instanciéepour le nœudT PROGRAMMEU du document. Ce nœudest donc le nœudcourantde la règle. De plus il fait partied’un contexte constituépar l’expressionXPath « //PROGRAMME» du xsl:apply-templates . CecontextecomprendtouslesnœudsdetypePROGRAMMEdudocument.Il n’enexistequ’un,cequi expliquequele fragmentsuivant:

Programme <xsl:value-ofselect="concat(position(), ’/’, last())"/> :

donnele résultat

Programme 1/1

Onpasseensuiteauxsl:for-each qui instancie,pourchaqueséance,le contenusuivant:

<xsl:value-of select="concat(position(), ’/’, last())"/> :<xsl:value-of select="."/>

Cecontenuillustre bienle changementdenœudcourantet decontexteeffectuéparxsl:for-each .Le contexteestmaintenantl’ensembledesnœudsT SEANCEU fils de T PROGRAMMEU (il y enadeux),etle nœudcourantest,tour à tour, chacunedecesséances.Onobtientdoncle résultat:

Séance 1/2 : Documents XMLSéance 2/2 : Programmation XSLT

Page 138: Comprendre XSLT

138 CHAPTER3. XSLT

Après xsl:for-each , le contexte redevient celui de la règle, et le nœudcourantest à nouveauT PROGRAMMEU . Le fragment:

Valable pour l’année <xsl:value-of select="ANNEE"/>

insèredonclogiquementl’année2002,contenutextuel du seulfils de T PROGRAMMEU detypeANNEE.

3.3.3 Variables: xsl:variable

Une variableXSLT estun nom(donnépar l’attribut name) associéeà unevaleur. Cettevaleurpeutêtredéfiniededeuxmanières:S paruneexpressionXPathdonnéedansl’attribut select ;S parle contenudel’élément.

Dansle premiercasle type de la variableest l’un desquatretypesXPath (booléens,numériques,chaîneset node-set). Dansle secondcasla variableappartientà un typespécifiqueà XSLT, dit resulttreefragment: dansla version1.0 deXSLT, unevaleurdece typecorrespondà unechaînedecaractèresquireprésentela versionsérialisédu fragmentcalculé.Cecisignifiesurtoutqu’il n’estpaspossibled’extrairedesvaleursd’un fragmentrésultatenutilisantdesaxesXPath.

Voici quelquesexemplesdedéfinitiondevariables:

S T xsl:variable name=’var1’ select=’12’/ U : définitunevariablevar1 avecunevaleur12;S T xsl:variable name=’var2’ select=’/COURS/ENSEIGNANTS’/ U : définitunevari-ablevar2 qui prendpourvaleurlesnœudsdetypeENSEIGNANTS, petits-filsdela racinedu doc-ument;S Enfin la variablesuivanteestdéfinieparsoncontenu:

<xsl:variable name=’var3’>Ceci est un <mot-cle>contenu</mot-cle> de variable

</xsl:variable>

La valeurde la variablevar2 estun ensemblede nœuds(node-set ) rassemblésousforme d’unarbretemporairequi peut être utilisée commeracinedansn’importe quelleexpressionXPath. Par ex-emple,l’instruction <xsl:apply-templates select="$var2/*" transformechacundesnœudsdanscetensemble.

Dansle derniercasla valeurdevar3 doit êtreassimiléeàunechaînedecaractères,etpasàunnode-set . Il n’estpaspermisparexempled’écrireuneexpressioncomme$var3/mot-cle . Cetterestrictionsur le traitementdesfragmentsrésultatsa étésuppriméedansle processeurXalanet la version1.1 (WD)deXSLT.

Portée d’une variable

La portéed’unevariableestla partiedu programmedanslequella variableestdéfinie.On distinguedeuxtypesdevariables:

S Les variablesglobalessontdéfiniespar desélémentsxsl:variable de premierniveau,fils del’élément T xsl:stylesheet U . Cesvariablessontvisiblesdanstout le programme,mêmedansdesrèglesqui précèdentleur définition(rappelonsquel’ordre desélémentsdepremierniveaun’estpassignificatif,saufpourxsl:import ).S Les variables localesapparaissentdansun corpsde règle. Une variable locale est visible danstous les frèresdroits (following-sibling ) du nœudxsl:variable , ainsi quedansleursdescendants.

Page 139: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 139

UnevariableXSLT n’estpasmodifiableetc’estdoncuneerreurquededéfinir deuxxsl:variableavec le mêmenomsi leursportéessechevauchent(la recommandationXSLT utilise le termeshadowingpourcephénomène)sauf– voici un mot qu’onentendsouventenétudiantla recommandationXSLT – siS unedesdeuxvariablesestunevariableglobale;S lesdeuxvariablessontglobalesmaisn’ont pasla mêmepréséance.

LesvariablesXSLT sontutiles,commedanstout langagedeprogrammation,pourstocker desvaleursou desrésultatsde calcul et éviter ainsi de répéterplusieursfois les mêmesinstructions. On peutaussis’enservirpourclarifier le code.Comme,enrevanche,on nepeutpasaffecterdenouvellesvaleursà unevariable,on nepeutpaslesutiliserpourstockerdescompteursdeboucles.

Unevariablevar peutêtreréférencéeaprèssadéfinitionpar$var , danstouteexpressionXPath.Il fautbiensoulignerqu’il estpossibledestockerdansunevariableaussibiendesvaleurssimples(unnumériquepar exemple)que le résultatde l’exécutiond’une ou plusieursrègles,ou d’appelsà desxsl:call-template . Tout cequi estcomprisentrelesbalisesouvranteet fermantedexsl:variable constituela valeurdela variableetpeutêtrearbitrairementcomplexe.

Voici deuxpremiersexemplessimplesd’utilisation dexsl:variable . Le premierreprendle pro-grammequi classaitnosfilms endeuxcatégories.La seulemodificationestl’annéequi estdéfiniecommeunevariableglobale,cequi permetdemodifierla valeurenunseulendroitle jour venu.

Exemple49 VarGlobale.xsl: Unevariableglobale

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:variable name="annee" select="1970"/>

<xsl:template match="FILMS"><xsl:apply-templates select="FILM"/>

</xsl:template>

<xsl:template match="FILM"><xsl:choose>

<xsl:when test="ANNEE &lt; $annee">"<xsl:value-of select="TITRE"/>" est ancien

</xsl:when><xsl:when test="ANNEE &gt;= $annee">

"<xsl:value-of select="TITRE"/>" est récent</xsl:when><xsl:otherwise>

De quand date "<xsl:value-of select="TITRE"/>" ?</xsl:otherwise>

</xsl:choose></xsl:template>

</xsl:stylesheet>

Notezquel’on pourraitobtenirle mêmerésultatenpassantunparamètreà la règle.L’utilisation d’unevariable(globale)estplus généralequ’un paramètrepuisqu’onpeut l’utiliser dansplusieursrègles. Lechoixdel’un ou l’autreestdoncsurtoutunequestiond’opportunitéet delisibilité du programme.

Le secondexemplemontreunevariablelocaleutiliséepourstockerunephrasequi estensuiteréutiliséeplusieursfois. Elle reprendle programmeForEach.xsl (voir page136) affichant la liste desséancesdecours.

Exemple50 VarLocale.xsl: Unevariablelocale

Page 140: Comprendre XSLT

140 CHAPTER3. XSLT

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><PROGRAMME>

<xsl:apply-templates select="//PROGRAMME"/></PROGRAMME>

</xsl:template>

<xsl:template match="PROGRAMME">Programme <xsl:value-of

select="concat(position(), ’/’, last())"/> :

<SEANCES><xsl:variable name="phrase">

(valable pour l’an <xsl:value-of select="ANNEE"/>)</xsl:variable>

<xsl:for-each select="SEANCE">Séance <xsl:value-of

select="concat(position(), ’/’, last())"/> :<xsl:value-of select="concat(., $phrase)"/>

</xsl:for-each></SEANCES>

Valable pour l’année <xsl:value-of select="ANNEE"/></xsl:template>

</xsl:stylesheet>

La variable$phrase stocke,aprèsévaluationdexsl:value-of , la chaînedecaractères:

(valable pour l’an 2002)

qui estensuiteréutiliséedans:

<xsl:value-of select="concat(., $phrase)"/>

Laportéedelavariableestlimitéeaucontenudel’élément T SEANCESU . Elle peutdoncêtreréférencéedansle contenudu xsl:for-each qui estun frèredroit, maispasau-delà.

Il s’agit ici d’un exempletrèssimpled’uneutilisationcourantedesvariables: associerà un le résultatd’un calcul.Lesvariablespeuventaussiêtreutiliséespourrésoudredesproblèmespluscomplexescommedesitérationsparrécursionsurdesensemblesdenœuds(voir page141).

3.3.4 Tri : xsl:sort

XSLT fournit un élémentpour trier les nœudssélectionnéspar un xsl:apply-templates ou unxsl:for-each . Par défaut, les nœudssont triés sur leur position, et suit l’ordre du documentpourlesforward-axes, ou l’ordre inversepourlesreverse-axes(voir page103).

Le principalattribut dexsl:sort estselect qui indiquele critère(la clé) detri. On peutindiquerplusieursxsl:sort successifs: le processeureffectueunpremiertri avecla premièreclé,puisunsecondtri surlesgroupesqui n’ont pasétédépartagésparle premiertri, etainsidesuite.

Voici un exemplede tri sur le documentListeFilms.xsl (page126). On trie d’abord sur l’annéedeparutiondu film, puis,pourlesfilms parusla mêmeannée,surle titre.

Page 141: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 141

Exemple51 Sort.xsl: Exempledetri

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="FILMS"><FILMSTRIES>

<xsl:apply-templates select="FILM"><xsl:sort select="ANNEE"/><xsl:sort select="TITRE"/>

</xsl:apply-templates></FILMSTRIES>

</xsl:template>

<xsl:template match="FILM"><b>Année : </b> <xsl:value-of select="ANNEE"/>,

<xsl:value-of select="TITRE"/> réalisépar <xsl:value-of select="MES"/>

</xsl:template>

</xsl:stylesheet>

Onobtientle résultatsuivant:

Exemple52 Sort.xml: Résultatdu tri

<?xml version="1.0" encoding="ISO-8859-1"?><FILMSTRIES>

<b>Année : </b>1958,Vertigo réalisé par Alfred Hitchcock

<b>Année : </b>1979,Alien réalisé par Ridley Scott

<b>Année : </b>1997,Titanic réalisé par James Cameron

</FILMSTRIES>

L’expressionXPath utilisée dansl’attribut select est évaluéeen prenantsuccessivementchaquenœuddel’ensemblesélectionnéparxsl:apply-templates commenœudcourant.Le tri estensuiteeffectuésur l’ensembledesvaleursobtenues.Dansl’exempleci-dessus,chaquenœudestde typeFILM ,et lescritèresde tri sontlesfils T ANNEEU et T TITRE U dechaquefilm. On pourraitégalementutiliserposition().

Pardéfautle processeurconsidèrequele critèredetri estdetypestring , et lescomparaisonssefontdoncd’aprèsl’ordre alphanumériquesur les chaînesde caractères(attention,dansce cas«10» estpluspetit que«2» puisquela comparaisons’effectuedegaucheà droite). On peutindiquerun attribut data-type aveccommevaleurnumber pourchangerle modedecomparaison.Lesquelquesautresoptionsdexsl:sort sontprésentéesdansl’annexeB, page277.

3.3.5 Itérations par récursion

NousconcluonscetteprésentationdesinstructionsdecontrôlesdeXSLT enprésentantquelquestechniquesavancéesdeprogrammation,et notammentl’exécutiondeboucles.Nousavonsvu quela seuleinstructionpour effectuerdesbouclesest xsl:for-each , et qu’elle est essentiellementdestinéeà parcourirunensembledenœudspourinsérerdu textedansle documentrésultat.

Enprogrammation«classique», onutilisecourammentlesbouclespoureffectuerunetâcheunnombrefixé defois, oupourcalculerunevaleur. Il n’y apasàpriori deconstructionpourcetypedefonctionnalitéenXSLT :

Page 142: Comprendre XSLT

142 CHAPTER3. XSLT

1. bouclede1 à b : xsl:for-each s’effectueautantde fois qu’il y a de nœudsdansl’ensembleàtraiter: on nepeutpasjouersurcenombredenœudspuisquele documentsourcen’estpasmodifi-able,et on nepeutpassebasersurun compteurpuisquelesvariablesnonplusnesontpasmodifi-ables;

2. calcul devaleur: typiquementon utilise unevariabledanslaquelleon stocke au fur et à mesurelerésultatdu calcul; pourlesmêmesraisonsqueprécédemmentçan’estpaspossibleavecXSLT.

Nous présentonsci-dessousdeux techniquesde programmationpour résoudrecesdeux problèmes.Elless’appuienttoutesdeuxsurun appelrécursifàunerèglenommée,et utilisentdesvariablesXSLT.

Le premierexempleconsisteà afficherun nombrefixé d’élémentscontenusdansun node-set . Onvautiliserunparamètrereprésentantle numérodel’élémentcourantàafficher, etpasserceparamètreàunerèglenomméeAfficheElement enmêmetempsquel’ensembledenœuds.Cetterègleprocèdealorsdela manièresuivante:

1. si le nombremaximalà afficherestdépassé,ellenefait rien;

2. sinonelle affiche l’élémentcorrespondantau numérocourant,et s’appellerécursivementen incré-mentantcenuméro.

Voici la règle.Elle fonctionnepourtoutensembledenœuds.

<xsl:template name="AfficheElement"><xsl:param name="numero"/><xsl:param name="liste"/><xsl:param name="max"/>

<xsl:if test="$numero &lt;= $max">Elément <xsl:value-of select="$numero"/> :

<xsl:value-of select="$liste[position()=$numero] "/>

<xsl:call-template name="AfficheElement"><xsl:with-param name="numero" select="$numero + 1"/><xsl:with-param name="liste" select="$liste"/><xsl:with-param name="max" select="$max"/>

</xsl:call-template></xsl:if>

</xsl:template>

Il suffit de définir deux variables,$maxElements , et $liste , puis d’appelercetterègle en luipassantlesdeuxparamètreset un numéroinitialisé à 1. Voici parexemplel’utilisation decetterèglepourafficherdeuxfilms (le programmecomplets’appelleBoucleFilms.xsl).

<xsl:template match="FILMS">

<xsl:variable name="maxFilms" select="2"/><xsl:variable name="listeFilms" select="/FILMS/FILM/TITRE"/>

<xsl:call-template name="AfficheElement"><xsl:with-param name="numero" select="1"/><xsl:with-param name="liste" select="$listeFilms"/><xsl:with-param name="max" select="$maxFilms"/>

</xsl:call-template>

</xsl:template>

Page 143: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 143

Notezquela variable$listeFilms estun node-set avectouslestitres.Cettevariableet $max-Films sontlocalesà la règle,et doiventdoncêtrepasséesenparamètrepuisqu’ellesnesontpasvisiblesdansla règlenomméeAfficheElement .

Voici un deuxièmeexempled’appelrécursifqui consistecettefois à effectuerun calculenparcourantunelistedenœuds.Poursimplifier la présentation,nousallonsprendrel’exempletrèssimpled’unetotali-sation,bienqu’il existeunefonctionprédéfinie(sum()) pourarriveraumêmerésultatbienplusfacilement.Cetexempledoit doncsurtoutêtreconsidérécommereprésentatifd’unetechniquegénérale.

Le documentsur lequelnousallonstravailler estuneliste de films avec,pourchaquefilm, desnotescritiques.

Exemple53 Notes.xml: Desnotessur lesfilms

<?xml version="1.0" encoding="ISO-8859-1"?><FILMS><FILM><TITRE>Vertigo</TITRE><NOTES><NOTE>3</NOTE><NOTE>3</NOTE><NOTE>3</NOTE><NOTE>5</ NOTE></NOTES></FILM><FILM><TITRE>Alien</TITRE><NOTES><NOTE>4</NOTE><NOTE>3</NOTE><NOTE>5</NOTE></NOTES></FILM><FILM><TITRE>Titanic</TITRE><NOTES><NOTE>2</NOTE><NOTE>2</NOTE><NOTE>4</NOTE><NOTE>1</ NOTE></NOTES></FILM><FILM><TITRE>Sleepy Hollow</TITRE><NOTES><NOTE>2</NOTE><NOTE>4</NOTE><NOTE>4</NOTE></NOTES></FILM><FILM><TITRE>American Beauty</TITRE><NOTES><NOTE>5</NOTE><NOTE>4</NOTE><NOTE>4</NOTE></NOTES></FILM><FILM><TITRE>Impitoyable</TITRE><NOTES><NOTE>2</NOTE><NOTE>1</NOTE><NOTE>5</NOTE></NOTES></FILM></FILMS>

L’objectif est de calculer, pour chaquefilm, la moyennedesnoteset de l’afficher dansun tableauHTML. Pourcelaon doit sélectionner, avecuneexpressionXPath,la liste desnotespourchaquefilm. Lafonction count() va nousdonnerle nombrede notes,et on va parcourirla liste pour calculerle total desnotes.La divisiondesdeuxnousdonnerala moyenne.

Le principeà appliquerestcelui d’un parcoursrécursifde la liste enadditionnant,à chaqueétape,lepremierélémentde la liste avec la sommedesélémentsdu restede la liste. Le pseudo-codeci-dessous

Page 144: Comprendre XSLT

144 CHAPTER3. XSLT

montrele fonctionnementd’unetelle fonction. On peutremarquerqu’il n’y a pasbesoindevariable(et àplusforte raisond’affectation).

fonction Somme (Liste l)début

si (l n’est pas vide)retourner l[1] + Somme (l[2..n])

sinon retourner 0fin

Voyonscommentréalisercettefonction avec XSLT. On va, commeprécédemment,utiliser un appelrécursif à une règle nommée. La différenceprincipaleest que cettefois l’appel doit «retourner» unevaleur, alorsquedansnotrepremierexemple(programmeBoucleFilms.xsl) la règleeffectuaitunetâchehabituelled’insertiondansle documentrésultat.

La notionde«retour» devaleurn’existepasenXSLT, maison va utiliser à la placela possibilitédestocker le fragmentproduitparunerèglenonpasdansle documentrésultat,maisdansunevariable.

Voici la règlenommée.Elle suit detrèsprèsla structuredela fonctionSomme() ci-dessus,avecbeau-coupplusdesyntaxe,XSLT étantun langageassezbavard.

<xsl:template name="CalculTotal"><xsl:param name="listeNotes"/>

<xsl:choose><xsl:when test="$listeNotes">

<xsl:variable name="note" select="$listeNotes[1]"/>

<xsl:variable name="autresNotes"><xsl:call-template name="CalculTotal">

<xsl:with-param name="listeNotes"select="$listeNotes[position() != 1]"/>

</xsl:call-template></xsl:variable>

<xsl:value-of select="$note + $autresNotes"/></xsl:when><xsl:otherwise>0</xsl:otherwise>

</xsl:choose></xsl:template>

Dansle xsl:when , qui correspondaucasoù la listen’estpasvide,oncréeunevariable$note avecla premièrenotedela liste. Puisoncréeunesecondevariablequi vacontenirle résultatdel’appel récursifà la règlenomméeCalculTotal , enlui passantle restedela liste.

Cetterèglecontientun seulxsl:value-of qui insèredansle résultatle total desdeuxvariables.Cette insertioncorrespondau «retour» de cetterègle, vue commeune fonction. Voici le programmecomplet,le résultatétantdonnédansla figure3.4.

Exemple54 BoucleNotes.xsl: Unebouclesur uneliste

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="html" encoding="ISO-8859-1"/>

<xsl:template match="FILMS">

Page 145: Comprendre XSLT

3.3. INSTRUCTIONSDE CONTRÔLE 145

<html><head><title>Statistiques</title></head ><body bgcolor="white">

<center><h1>Moyenne des notes pour chaque film</h1>

<table border=’1’><xsl:apply-templates select="FILM"/></table>

</center></body>

</html></xsl:template>

<xsl:template match="FILM"><xsl:variable name="total">

<xsl:call-template name="CalculTotal"><xsl:with-param name="listeNotes"

select="NOTES/NOTE"/></xsl:call-template>

</xsl:variable><tr>

<td><b><xsl:value-of select="TITRE"/></b></td><td align="right">

<xsl:value-of select="$total div count(NOTES/NOTE)"/></td>

</tr></xsl:template>

<xsl:template name="CalculTotal"><xsl:param name="listeNotes"/>

<xsl:choose><xsl:when test="$listeNotes">

<xsl:variable name="note" select="$listeNotes[1]"/>

<xsl:variable name="autresNotes"><xsl:call-template name="CalculTotal">

<xsl:with-param name="listeNotes"select="$listeNotes[position() != 1]"/>

</xsl:call-template></xsl:variable>

<xsl:value-of select="$note + $autresNotes"/></xsl:when><xsl:otherwise>0</xsl:otherwise>

</xsl:choose></xsl:template>

</xsl:stylesheet>

Cet exempleillustre la puissancede XSLT en tant que langagede programmation. Il resteque lafaiblessedu typage,combinéeà uneapproche«fonctionnelle» de la programmationpeuventrapidementrendretrèslaborieuxle développementdeprogrammeXSLT effectuantdesopérationscomplexes. Il fautparexempleenvisagerdestockerdeslistesdansdeschaînesdecaractèresavantdelestraiterpardesappelsrécursifs.Cetypedeprogrammationtrouverapidementseslimitesentermedemaintenanceetd’évolution.Il estsansdoutepréférabledeconsidéreravanttoutXSLT (aumoinspourla version1.0)commeunlangage

Page 146: Comprendre XSLT

146 CHAPTER3. XSLT

Figure3.4: L’affichagedu résultatavecNetscape

orientéversla transformationdedocumentsXML, et capableoccasionnellementd’effectuerdestâchesdeprogrammationclassiques.

3.4 Évaluation d’un programmeXSLT

Nousconcluonsce chapitreen décrivantpasà pasl’évaluationd’un programmeXSLT. L’objectif estderécapitulerunenouvelle fois lesprincipauxconceptsd’unetransformationXSLT : nœudcourantet nœudcontexte, instanciationderègle,productiondurésultat,etc.

Document-

ElementCOURS

AttrCODETC234

ElementENSEIGNANTS

ElementNOM

Texte-

Rigaux

ElementNOM

Texte-

Waller

ElementSUJET

Texte-

PublicationXSLT

ElementPROGRAMME

ElementSEANCES

ElementSEANCE

AttrID2

Texte-

DocumentsXML

ElementSEANCE

AttrID3

Texte-

ProgrammationXSLT

ElementANNEE

Texte-

2002

Figure3.5: ExemplederéférencepourXSLT

Nousprenonsl’exempled’une transformationdu documentCoursXML.xml, page110. La figure3.5illustre la représentationDOM de ce document. La transformationconstruitunepageHTML. Voici le

Page 147: Comprendre XSLT

3.4. ÉVALUATION D’UN PROGRAMME XSLT 147

programme.

Exemple55 Recap.xsl: Récapitulatifdel’évaluationd’un programmeXSLT

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:output method="html" encoding="ISO-8859-1"/>

<xsl:template match="/"><html>

<head><title><xsl:value-of select="COURS/SUJET"/>

</title></head><body bgcolor="white">

<xsl:apply-templates/>

</body></html>

</xsl:template>

<xsl:template match="SUJET"><h1><center><xsl:value-of select="."/></center></h1>

</xsl:template>

<xsl:template match="ENSEIGNANTS"><h1>Enseignants</h1>

<ol><xsl:apply-templates select="NOM"/>

</ol></xsl:template>

<xsl:template match="PROGRAMME"><h1>Programme</h1><ul><xsl:for-each select="SEANCE">

<xsl:call-template name="AfficheSeance"/></xsl:for-each></ul>

</xsl:template>

<xsl:template match="ENSEIGNANTS/NOM"><li><xsl:value-of select="." /></li>

</xsl:template>

<xsl:template name="AfficheSeance"><li> Séance <xsl:value-of select="concat (

position(), ’/’, last(), ’ : ’, .)"/></li>

</xsl:template></xsl:stylesheet>

Aprèsl’analysedesdeuxdocuments,leprocesseurvacommencerparcréerlenœudracinedudocumentrésultat(figure 3.6), et par sepositionnersur la racinedu documentsourcequi devient le nœudcourant.Deplusle processeurassocieàchaquenœudcourantunelistedenœud(le «contexte») contenantle nœudcourantlui-même,avecunepositiondonnée,etéventuellementd’autresnœuds.

Page 148: Comprendre XSLT

148 CHAPTER3. XSLT

Document-

Figure3.6: Début del’évaluation

Prenantmaintenantla listedesrèglesduprogramme,le processeurrecherchecellesqui sontapplicablesaunœudracinedu document,enappliquantl’algorithmeprésentépage1265.

La seulerèglequi convient est la première. Elle estdoncinstanciée: soncontenuestcopiésouslaracinedudocumentrésultat,cequi donnel’arbreprovisoiredela figure3.7.

Document-

html

head

title

xsl:value-ofAttr

selectCOURS/SUJET

body

xsl:apply-templates

Figure3.7: Aprèsinstanciationdela premièrerègle

Cet arbrecontientdeuxélémentsdont l’espacede nom estxsl . Ils doiventdoncêtreévaluéspar leprocesseuret remplacésparle résultatobtenu.On voit biendèscestadequel’évaluationd’un programmeXSLT n’estpasun processuslinéairedanslequellesbalisesouvranteet fermantedesélémentssontpro-duitesséquentiellement.Un arbreestconstruitpar instanciationdenœudscomplets,et à cesnœudssontrattachésdenouveauxfils aufur età mesurequelesinstructionsXSLT restantessontévaluées.Ici encore,il vaut doncmieux raisonner, commenousle faisonsdepuisle début de ce livre, sur unereprésentationarborescentedesdocumentsquesuruneversionsérialiséeavecbalises.

Une particularitéde ce type d’évaluationestquele processeura le choix de la prochaineinstructionà évaluer. On voit bien sur la figure 3.7 que les deux instructionsxsl:value-of et xsl:apply-templates peuventêtreévaluéesséparément,dansun ordrequelconque,voire enparallèle.Il suffit queleprocesseurconservel’informationsurlenœudcourantetlecontexteassociéàchacunedecesinstructionspourpouvoir y reveniret lestraiterà toutmoment.

Sionchoisitd’évaluerd’abordxsl:value-of , onobtientl’arbretemporairedelafigure3.8.À partirdunœudcourantquiestla racinedudocumentsource,onaévaluél’expressionXPath« /COURS/SUJET»,etona remplacél’instructionXSLT parle résultatdecetteévaluation,la chaîne«ProgrammationXSLT ».

Passonsmaintenantà l’instruction xsl:apply-templates . L’attribut select manque,doncle processeurappliquele choix par défaut qui consisteà sélectionnerles fils du nœudcourant,soit enl’occurrenceT COURSU , l’élémentracinedu document.C’estcetélémentqui devient le nœudcourant.

5Il s’agit de l’algorithme de référence,maisbien entenduchaqueprocesseurest libre d’implanterle sienpourvuquele résultatsoit le même.

Page 149: Comprendre XSLT

3.4. ÉVALUATION D’UN PROGRAMME XSLT 149

Document-

html

head

title

XSLT

body

xsl:apply-templates

Figure3.8: Aprèsévaluationdexsl:value-of

La recherchedansle programmed’unerègleapplicableàcenœudéchoue,doncle processeurchoisitlarèglepardéfaut(voir page123).Elle consisteàsélectionnerlesfils dunœudcourant.Onadoncmaintenantun ensembledetrois éléments,T SUJETU , T ENSEIGNANTSU et T PROGRAMMEU .

Le processeurva prendrecestrois élémentstour à tour commenœudcourant,rechercherla règlepourchacun,et l’instancier. Il existe trois règlesdistinctesdansle programme,ce qui donnel’arbre résultattemporairedela figure3.9.

Document-

html

head

title

XSLT

body

h1

center

xsl:value-of

Attrselect

.

h1

ol

xsl:apply-templates

Attrselect

NOM

h1

ul

xsl:for-each

AttrselectSEANCE

xsl:call-template

Attrname

AfficheSeance

Figure3.9: Aprèsévaluationdexsl:apply-templates

Le processeurcontinueà prendredansl’arbre résultaten cours de constitutionles élémentsdontl’espacede nom estxsl . Pourchacunde cesélémentsil existe un nœudcourantdansl’arbre source,lui-mêmefaisantpartied’un ensembledenœuds.Pourl’élémentxsl:value-of dansla figure3.9 par

Page 150: Comprendre XSLT

150 CHAPTER3. XSLT

exemple,le nœudcourantdansl’arbre sourceest T SUJETU , et l’ensemblede nœudsestconstituédestrois fils de T COURSU . À partir de la situationde la figure3.9, le processeurva donc(ensupposantquelesinstructionssonttraitéesdansl’ordre du document):

1. évaluerxsl:value-of , avecl’attribut select valant«. », le nœudcourantétant T SUJETU : lerésultatestXSLT;

2. évaluerl’expressionNOMdel’attributxsl:select duxsl:apply-templates , lenœudcourantétantT ENSEIGNANTSU : onobtientdeuxnœudspourlesquelsla seulerèglequalifiéeestcelledontle patternest«ENSEIGNANTS/NOM»;

3. enfin l’expressionSEANCEde l’attribut xsl:select du xsl:for-each est évaluée,ce quidonne(le nœudcourantétant T PROGRAMMEU ) les deuxélémentsde type SEANCEdu documentsource.

La figure 3.10 montrela situationde l’arbre résultatintermédiaireaprèsévaluationdu xsl:for-each . Il resteauprocesseuràévaluerdeuxappelsxsl:call-template à la règlenomméeAffich-eSeance . En apparencecesdeuxappelssontidentiques,maiscequi lesdistingue(nonreprésentésurlafigure),c’estleur nœudcourant.

Document-

html

head

title

XSLT

body

h1

center

XSLT

h1

ol

li

Amann

li

Rigaux

h1

ul

xsl:call-template

Attrname

AfficheSeance

xsl:call-template

Attrname

AfficheSeance

Figure3.10:Aprèsévaluationdu xsl:for-each

L’instructionxsl:for-each a poureffet dechangerle nœudcourantpourchaqueinstanciationdesoncontenu(voir page136). L’ensemblede nœuds,lui, estconstituépar l’évaluationde l’expressionduxsl:for-each , et setrouvedonccommunauxdeuxappelsderègles.

Unappelàxsl:call-template nechangeni lenœudcourant(unedesdeuxséances),ni l’ensembledesnœudsformantle contexte (lesdeuxséances).L’instanciationdela règlenomméedonneradoncle ré-sultatfinal dela figure3.11.

Il resteàsérialiserle documentobtenu,cequi donnele résultatci-dessous6.6Dansle casd’un documentHTML, certainestransformationspeuvent intervenir, commela transformationd’un c hr/ d enc hr d . Ellessontdécritesdansle chapitresuivant.

Page 151: Comprendre XSLT

3.4. ÉVALUATION D’UN PROGRAMME XSLT 151

Document-

html

head

title

XSLT

body

h1

center

XSLT

h1

ol

li

Amann

li

Rigaux

h1

ul

li

Séance 1/2 :Documents XML

li

Séance 2/2 :Programmation XSLT

Figure3.11:Le résultatfinal

Exemple56 Recap.html: le documentHTML sérialisé

<html><head><META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"><title>Publication XSLT</title></head><body bgcolor="white">

<h1><center>Publication XSLT</center></h1>

<h1>Enseignants</h1><ol><li>Amann</li><li>Rigaux</li></ol>

<h1>Programme</h1><ul><li> S&eacute;ance 1/2 : Documents XML</li><li> S&eacute;ance 2/2 : Programmation XSLT</li></ul>

</body></html>

Cetexempleamontré,suruncassimplemaisreprésentatif,lesprincipalescaractéristiquesdel’évaluationd’un programmeXSLT. Récapitulonslespointslesplusimportants:

1. le processeurconstruitun arbre,et pasuneversionsérialiséedudocument;

2. chaqueinstruction est placéedansle documentrésultat,puis évaluée; elle restetoujours asso-ciée à un nœudcourantdansle documentsource,lui-mêmefaisantpartie d’un ensemblede de

Page 152: Comprendre XSLT

152 CHAPTER3. XSLT

nœuds: cesdeuxinformationsconstituentle contexte d’évaluationdesexpressionsXPath placéesdansl’instruction;

3. on nepeutpaspréjugerde l’ordre d’exécutiondesinstructionsd’un programmeXSLT : le langagelui-mêmeestconçupourquele résultatnedépendepasdecetordre.

Page 153: Comprendre XSLT

Chapter 4

Production dedocumentsXML

Sommaire

4.1 Définition de TypesdeDocuments: DTD . . . . . . . . . . . . . . . . . . . . . . . . 154

4.1.1 Pourquoidéfinir uneDTD ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

4.1.2 Entités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

4.1.3 Éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

4.1.4 Attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

4.1.5 DTD etXML Schéma. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

4.2 SiteWeb: HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

4.2.1 HTML etXHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

4.2.2 DTD XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166

4.2.3 GénérationdepagesHTML: xsl:output . . . . . . . . . . . . . . . . . . . 170

4.2.4 Transformationd’unepageXML . . . . . . . . . . . . . . . . . . . . . . . . . 171

4.2.5 Créationdeliens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

4.2.6 XML/XSLT: unesolutionduproblèmedeslienscassés . . . . . . . . . . . . . 175

4.2.7 IntégrationdepagesXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176

4.3 Présentationsmultimédia: SMIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

4.3.1 SMIL parunexemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177

4.3.2 DTD SMIL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

4.3.3 GénérationdeprésentationsSMIL . . . . . . . . . . . . . . . . . . . . . . . . 187

4.4 Traitement de textedansXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

4.4.1 xsl:preserve-space et xsl:strip-space . . . . . . . . . . . . . . . 195

4.4.2 Générationdetexte: xsl:text . . . . . . . . . . . . . . . . . . . . . . . . . 197

4.4.3 Sérialisationdu résultat: xsl:output . . . . . . . . . . . . . . . . . . . . . 197

4.5 RSSet RDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

Nousallonsmaintenantétudierl’utilisation deXSLT pour la traductiondedocumentsXML dansdif-férentsformatsstandardsdepublication.Nousprenonscommemotivationprincipalel’évolutiond’un sitewebà partir d’un ou plusieursdocumentsXML et detransformationsXSLT, maislestechniquesétudiéess’appliquentbienentenduàun contexteplusgénéral.

Notresitea pourambitiondediffuserle pluslargementpossiblesoncontenusurle Web. Il nesecon-tentedoncpasdepagesHTML, maisproposeégalementdenombreuxautresformatsadaptésà différentsmédias,et souhaitesefraire connaîtrele plus précisémentpossibleauprèsdesmoteursde recherchesetannuairesweb.

Nousavonsdéjàdonnédansl’introductionun aperçudu langageWML qui estun dialecteXML (nousallons égalementprécisercettenotion de dialecte)pour la créationde documents(cartes)très simplesadaptésà l’affichagesur lespetitsécransdestéléphonesmobiles.Nousnerevenonspasici surWML, laprésentationdu chapitre1 suffisantà comprendrecelangagetrèssimple. En revanchenousprésentonsla

153

Page 154: Comprendre XSLT

154 CHAPTER4. PRODUCTION DE DOCUMENTSXML

créationde documentsplus sophistiquésavec desimageset desanimationsavecun autredialecteXMLconnusousle nomdeSMIL (SynchronisedMultimediaIntegrationLanguage). SMIL permetdecréerdesprésentationsaniméesqui intègrentdu texte,desimagesdu sonet dela vidéo. Un aspectimportantdecelangageestqu’il permetdesynchroniserl’affichagedesdifférentsobjetsmultimédia.

Pouraugmentersavisibilité surle Web,le sitepeutproduireun«sommaire» qui contientpourchaqueressourcewebsontitre, sonURL et unedescriptioncourtedesoncontenu.Cesommaireestun documentRSS(RDF SiteSummary) qui peutfacilementêtreéchangé(généralementcedocumentet beaucouppluscompactquela ressourceelle-même)avecd’autresapplicationssurle Web.

Lacaractéristiquecommunedetouscesformats(HTML, SMIL, WML, RSS)estqu’ils sonttousdéfinissousforme d’une DTD (DocumentType Definition) qui, d’une manièresimilaire à la langueFrançaiseou Allemande,définit un vocabulaire de nomsd’élémentset d’attributs qui peuvent être combinésenaccordavec une grammaire. XML, de ce point de vue, est un « langagepour créerdeslangages» ou«metalangage». Nouscommençonspar expliquercettenotion de grammaireavant de prendrequelquesexemplespratiquespourillustrer sonimportancedansl’écrituredeprogrammesdetransformation.

4.1 Définition deTypesdeDocuments: DTD

4.1.1 Pourquoi définir uneDTD ?

La définitiondeDTD pourla descriptiondedocumentsXML offre plusieursavantages,liésà la possibilitéd’un contrôleplusélevédansla productiondudocumentsetdesprogrammesquiexploitentcesdocuments:

S Productionde documents: un éditeurXML peutseservir de la DTD pour faciliter l’édition d’undocument.Par exemple,connaissantla structuredu documentà produire,il peutproposerà chaquemomentles élémentset attributsqui peuventêtreinsérésà un endroitprécisdu document(éditionstructurée).Il estégalementpossibleavant la sauvegardedu fichier XML devérifier saconformitéparrapportàsaDTD.

S ProgrammationXSLT : un auteurde programmeXSLT sebasesur la DTD du/desdocument(s)àtransformeretdu/desdocumentsà produirepourl’écritureet la vérificationdesrèglesXSLT.

S Échange de documentsXML : dansun contexte où un «consommateur» d’information sedéclareprêt à recevoir cesinformationsau format XML, la DTD sertà décrireprécisémentles règlesdestructurationdesdocumentsreçus;

S FragmentationdedocumentXML : lesentitésqui constituentundocumentXML sontdéclaréesdanssaDTD. Lesdéfinitionsd’entitéscorrespondentà unedescriptionphysiquedela structuredu docu-ment,qui estestindépendantedela notionde«dialecte» XML.

LesprocesseursXSLT permettentgénéralementdechoisirentreuneanalysesyntaxique(parrapportàla syntaxeXML) ouuneanalysevalidante(parrapportàuneDTD) desdocumentsà transformer.

4.1.2 Entités

Dansleschapitresprécédentsnousavonsutilisé plusieursfois desentitéspour fragmenterphysiquementle contenusérialiséd’un documentXML en plusieursfichiersou incluredescaractèresspéciauxcomme<, >, &, ’ et " . D’unemanièreplusgénérale,la notiond’entitépermetdedéconnecterla définitionlogiqued’un documentXML sousformed’arbreDOM desareprésentationphysiquesousformedefichiersXML :un documentXML peutainsiêtrereprésentéparun ensembled’entitéstrèsdiverscomme:S plusieursfichiersXML, ditesentitésXML (parsedentities) ;

S unfichier DTD optionnel;

S plusieursfichiersimage,sonetvidéo,appelésentitésnon-XML(unparsedentities).

Page 155: Comprendre XSLT

4.1. DÉFINITION DE TYPESDE DOCUMENTS: DTD 155

Parmi lesentitésXML, un fichier, appeléentitédocument, correspondà la racinedu documentXMLet contient,directementou indirectement,les référencesverstouslesautresentités.ChacunedesentitésXML peutcontenirà sontour desréférencesversd’autresentitésfaisantpartiedu document(lesentitésnon-XML nepeuventpascontenirdetellesréférences).

Onobtientainsiungraphederéférencementavectouteslesentitésparticipantà la constitutiondudoc-umentXML (arbreDOM) final parun parseur. Cetteconstitutionconsisteessentiellementà remplacerlesréférencesvers les entitéspar leur contenu. Pouréviter desarbresDOM de taille infinie, ce graphederéférencementdoit êtreacyclique: aucuneentiténedoit seréférencerelle-mêmedirectementou indirecte-ment.

Pourpouvoir «utiliser» ou référenceruneentitéelle doit êtredéfinieau préalabledansla DTD dudocument.La seuleexceptionà cetterègleestla définition de la DTD elle-même,qui peutêtrestockéedansuneentitéDTD séparéeetqui estdéfinieetutiliséedansl’entité documentaveclaclause<!DOCTYPE...> .

La définition d’une entitéconsisteà associerun contenu(XML ou autre)à un nom d’entité. XMLdistingueentreles entitésinternesdont le contenuestdéfini dansla DTD et les entitésexternesdont lecontenuestunfichier séparé.

Unedéfinitiond’entitéinterneassociedirectementunnomàunevaleursanspasserparuneindirectionà traversun fichier externe. Par exemple,l’entité suivantedéfinit uneentitéUcirc avec commevaleurl’Unicodedu symbole’Û’.

<!ENTITY Ucirc "&#219;">

Dansla définitiond’un entitéexterne,le nomdel’entité estassociéà l’adressed’un fichier (URL) quidéfinit soncontenu.Voici lesformesdedéfinitiond’entitésexternes:

<!ENTITY "nom_entité" SYSTEM"url_entity"><!ENTITY "nom_entité" PUBLIC "id_publique" "url_entity">

La deuxièmedéfinitionutilise un identificateurpublic enplusdel’URL del’entité et permetuneiden-tification plusformelleet surtoutindépendanted’uneadressephysique.Il estsurtoutappliquéà desdocu-ments«publics» qui sontcataloguéset largementréférencéspard’autresdocuments.

Parexemple,laDTD XHTML définituneentitéexternequi contientlesdéfinitionsd’entitésspécifiquesà l’utilisation decaractèreslatin dansundocumentXML (le symbole%aprèsla balise<!ENTITY indiquequ’il s’agit d’uneentitéparamètrequi pourraêtreréférencédansla DTD même: voir plusbas).

<!ENTITY % HTMLlat1 PUBLIC"-//W3C//ENTITIES Latin 1 for XHTML//EN""xhtml-lat1.ent">

Dansle casoù l’URL xhtml-lat1.ent estinaccessible,un parseur«intelligent» peutseservirdel’identificateurpublic pourtrouverdansuneliste d’URL (catalogue)uneURL accessible(rien n’empêched’ailleursle parseurd’avoir unecopielocaledecetteDTD pouraméliorerlesperformances).

Entités paramètres Commepourun documentXML, il estpossiblededécouperuneDTD enplusieursentités(fichiers).Cesentitéssontappeléesdesentitésparamètrespourlesdistinguerdesentitésgénéralesqui sontutiliséesdansle contenud’un documentXML. La définitiond’uneentitéparamètreestcaractériséepar l’ajout du symbole%. Uneréférenceversuneentitéparamètresecomposedu symbole%suivi par lenomdel’entité etterminéparle symbole; . Voici ladéfinitionetl’utilisation d’uneentitéparamètreexternedansla DTD XHTML :

<!ENTITY % HTMLlat1 PUBLIC"-//W3C//ENTITIES Latin 1 for XHTML//EN""xhtml-lat1.ent">

%HTMLlat1;

Les trois premièreslignesdéfinissentl’entité qui estréférencéedansla quatrièmeligne parsonnom. Lerésultatestl’inclusion dela DTD "xhtml-lat1.ent"- qui définitdesentitéspourlescaractèreslatin - danslaDTD XHTML.

Page 156: Comprendre XSLT

156 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Entités non-XML et notations: Lesentitésnon-XML commelesimageset lesfichierssonontunstatuttrèsparticulierdansle mondeXML. En réalité,ce type d’entité estuneboîtenoire qui ne peutpasêtreanalyséeou utiliséed’un manière«directe». Pourpouvoir donnerun minimum d’interprétation,XMLpermetla spécificationdeformatsd’entitésnon-XML sousformededéclarationsdenotations(nousavonsmentionnédansla sectionconsacréeà DOM page64 l’existenced’uneinterfaceNotation) : unenotationassocieunnomdeformatàunidentificateursystèmeoupublicqui pourraêtreexploitépourl’interprétationdu contenude l’entité. Généralement,cet identificateurdéfinit une applicationqui peut se charger del’affichageoudu traitementdesentitésnon-XML deceformat.

Parexemple,la définitiondeformatsuivanteassociele formatgif àuneapplicationxv :

<!NOTATION gif SYSTEM’/usr/local/bin/xv’ >

Attention,le nomgif estchoisilibrementet indépendantdu formatdel’entité.Pourdéfinir uneentiténon-XML du formatgif , on peutensuiteutiliser unesyntaxe identiqueà celle

dela définitiond’entitéexterne,étendueparle mot réservéNDATA, suivi du nomduformat:

<!ENTITY logo SYSTEM"image.gif" NDATA gif >

Une entiténon-XML ne peutpasêtreréférencéedansle contenud’un documentXML, qui estobli-gatoirementconformeà la syntaxe XML – cequi neseraittrèsprobablementplus le casaprèsl’inclusiond’une imageGIF dansle contenumême. La seulpossibilitéde référencerdesentitésestde définir desattributsdetypeENTITY ou ENTITIES qui peuventensuiteprendrecommevaleurun nomou unelistedenomsd’entitésnon-XML.

4.1.3 Éléments

UneDTD définit le vocabulaireet la grammaired’un «dialecte» XML. Le vocabulaireestessentiellementconstituéde nomsd’élémentset d’attributs. La grammairedéfinit, pour chaqueélément,sesfils et sesattributspossibles.

La définitiongénéraled’un élémentdansuneDTD estla suivante:

<!ELEMENT nom structure>

Contrainte : Il nepeutavoir qu’uneseuledéfinitionpourchaquenomd’élémentdansuneDTD.

Prenonscommeexemplela DTD XHTML qui décrit la dernièreversionde HTML (la version4.0)commeun dialecteXML (voir page165 pour une descriptioncomplète). La DTD complètepeut êtretéléchargéeà l’URL http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd.

Voici la définitiondel’élémentracined’un documentHTML dansla DTD XHTML :

<!ELEMENT html (head, body)>

Le mot réservé<!ELEMENTestsuivi dunomdel’élémentàdéfinir (html ). La structuredel’élémenthtml estdéfiniepar(head, body) .

UneDTD distinguecinq typesdestructurespourleséléments:

1. Si unélémentestvide,on utilise le mot réservéEMPTYpourdéfinir sastructure.

2. Si un élémentne peutcontenirquedu texte (desfils de type Text au sensDOM) on utilise le motréservé#PCDATA. Parexemple,l’élément T title U deXHTML nepeutcontenirquedu texte:

<!ELEMENT title (#PCDATA)>

3. Si élémentne peutcontenirquedesfils qui sontà leur tour deséléments,on spécifieles typesdesélémentsfils possiblespourcetélément,le nombred’occurencespourchaquefils et,éventuellement,l’ordre danslequelscesfils doiventapparaîtredansle document(rappelonsqu’un documentXMLcorrespondà un arbreordonné). Cettespécificationestappeléele modèledecontenudel’élément.

Page 157: Comprendre XSLT

4.1. DÉFINITION DE TYPESDE DOCUMENTS: DTD 157

4. Si un type d’élémentpeutavoir un contenu«mélangé», c’est-à-direcontenirdesfils qui sontdesélémentsmaiségalementdu texte, on spécifieles typesdesélémentsqui peuvent êtrefils de cetélément.Danscecas,on nepeutplusspécifierle nombred’occurencespourchaquefils ou l’ordredanslequelcesfils doiventapparaîtredansle document.

5. Il estégalementpossibledenedéfinir aucunecontraintesur le contenud’un élémentenutilisant lemot réservéANY. Danscecas,le contenude l’élémentdoit seulementêtrebien-formé, c’est-à-direessentiellementrespecterl’imbrication desbalises.

Modèlesde Contenu

Le modèledecontenud’un élémentindiquelestypesdesesfils, maiségalementle nombred’occurrencespourchaquetypedefils. Si nécessaire,on peutégalementétablirun ordresur lesoccurrencesdesfils dechaquetype.

La définitiondela balise T html U indiquequel’élémentracinedetypehtml nepeutavoir quedeuxtypesd’élémentscommefils : head et body . En plus,chaquetypedefils nedoit apparaîtrequ’uneseulefois et dansl’ordre indiqué. En d’autrestermes,l’élémentracined’un documentXHTML esttoujoursdela formesuivante:

<html><head>...</head><body>....</body>

</html>

Pour indiquer qu’un type d’élémentpeut apparaîtrezéro ou une fois on utilise le symbole?. Parexemple,la DTD suivanteacceptelesdeuxdocuments<A><C/></A> et <A><B/><C/></A> (B et Csontdéfiniscommeélémentsvides):

<!ELEMENT A (B?,C) ><!ELEMENT B EMPTY ><!ELEMENT C EMPTY >

Il existeégalementdessymbolespourindiquerqu’un typed’élémentpeutapparaîtreplusieursfois. Onutilise le symbole* si un typedefils peutapparaîtrezéro,uneou plusieursfois, et le symbole+ s’il doitapparaîtreau moinsunefois. Par exemple,si on remplacela définition précédentede l’élémentA par ladéfinition:

<!ELEMENT A (B*,C+)>

la DTD accepte,entreautre,touslesélémentsdetypeA suivants:

<A><C/></A><A><C/><C/></A><A><B/><C/></A><A><B/><B/><C/></A>

Enrevanche,cettedernièredéfinitionn’acceptepasleséléments<A></A> et<A><C/><B/><C/></A> .Dansle premiercas,pardéfinition, un élémentvide T C/ U doit apparaîtreau moinsunefois, et dansledeuxièmecas,touslesélémentsT B/ U doiventapparaîtreavanttouslesélémentsT C/ U .

Onpeutdonnerle choixentredeuxtypesd’élémentsenremplaàantla virguleentrelesélémentsparlesymbole| :

<!ELEMENT A (B|C)>

Danscecas,A peutcontenirun seulfils qui estsoit detypeB ou detypeC.Finalement,onpeutenlever la restrictionsurl’ordre desfils : onvoudraitparexempleacceptercomme

fils pourl’élément T A U zéroouplusieursélémentsdetype T B U et T CU dansn’importequelordre.Pourcela,on peututiliser desparenthèsespour regrouperdeséléments.La définitionsuivanteindiquequelesélémentsdetypeA acceptentunélémentdetypeB ou detypeCzéroou plusieursfois :

Page 158: Comprendre XSLT

158 CHAPTER4. PRODUCTION DE DOCUMENTSXML

<!ELEMENT A (B|C)*>

TouslesélémentsdetypeA qui précèdentsontvalidesparrapportà cettedéfinition,ainsiquelesdeuxélémentssuivants:

<A><C/><C/><B/><C/><B/></A><A><B/><B/></A>

Ceparenthésagepermetdedéfinirdesstructurespluscomplexes.Parexemple,la structured’un tableauHTML estdéfinieparl’expressionsuivante(nousnedonnonspasla structuredesélémentsqu’il contient):

<!ELEMENT table(caption?, (col*|colgroup*), thead?, tfoot?, (tbody+|tr+))>

S lesélémentscaption , thead et tfoot sontoptionnels;S l’élémentcaption estsuivi parzéroouplusieursélémentsdetypecol ou colgroup (il nepeutpasavoir simultanémentlesdeuxtypesd’éléments);S lesélémentsthead et tfoot , sontsuivis parunouplusieursélémentsdetypetbody ou tr (il nepeutpasavoir lesdeuxtypesd’éléments)

Seloncettedéfinition,un tableauHTML minimal a la formesuivante:

<table><tr>...</tr>

</table>

ou

<table><tbody>...</tbody>

</table>

LesélémentsT tr U définissentdeslignesdutableau.Pourcréeruntableaucompletavecdescolonnes,il fautégalementconnaîtrela définitiondel’élémentdetypetr :

<!ELEMENT tr (th|td)+>

Onvoit quece T tr U a commefils un ou plusieursélémentsdetype th et/outd dansn’importequelordre.Chaqueélémentd’un decesdeuxtypesdéfinit unecolonnedansle tableau.La différenceentrethet td estque,dansle premiercas(th ), le contenuestengénéralaffichéengras(header).

Contenumixte

Les élémentsde type td et th peuvent avoir un contenumixte, c’est-à-direcontenirdessous-élémentsmaiségalementdu texte. Voici un tableaucompletexpriméenXHTML (lesélémentsT td U contiennentdu texte):

Exemple57 TableauSimple.html: TableauXHTML

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1 -trans itiona l.dtd" >

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>Page XHTML avec un tableau simple</title></head><body>

Page 159: Comprendre XSLT

4.1. DÉFINITION DE TYPESDE DOCUMENTS: DTD 159

<table border=’1’><tr><td>ligne <b>1</b>, colonne <b>1</b></td>

<td>ligne <b>1</b>, colonne <b>2</b></td></tr><tr><td>ligne <em>2</em>, colonne <em>1</em></td>

<td>ligne <em>2</em>, colonne <em>2</em></td></tr>

</table></body>

</html>

Le tableaua deux lignes, indiquéespar les balises T tr U dont chacunea deux colonnes(balisesT td U ). La figure4.1montrel’affichagepardecettepageparNetscape.

Figure4.1: AffichagedeTableauSimple.html.

Les élémentsde type td et th peuvent contenirdessous-élémentsde plusieursdizainesde typesdifférentset unedescriptiondétailléedépassele cadredece livre. Voici unedéfinition trèssimplifiéedutype td :

<!ELEMENT td "(#PCDATA | table | p | b | em )*">

Cettedernièredéfinition indiquequeles élémentsde type td contiennentdessous-élémentsde dif-férentstypesmélangésavecdu texte dansn’importequelordre. En fait, il n’estpaspossibledespécifierdescontraintesplus fortessur la structured’un élémentqui contientdu texte mélangéavecdeséléments.Par exemple,il n’est paspossiblede spécifierqu’un élémentde type td contientd’aborddu texte suivid’autresélémentscommedansl’exemplesuivant:

<!-- Attention: La déclaration suivante n’est pas possible: --><!ELEMENT td "(#PCDATA, (table | p | b | em )*)">

Définition récursives

La définitiond’un typed’élémente donnépeutcontenirdestypesd’élémentsf qui utilisentdéjà e dansleur propredéfinition. Si on regardela définition (partielle)de la structuredesélémentsde type td , onvoit qu’unecolonned’un tableaupeutà nouveaucontenirun tableau,autrementdit qu’on peutcréerdestableauximbriqués.Voici un exemple(voir l’affichage4.2),:

Exemple58 TableauComplexe.html: Exempled’un tableauimbriqué

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1 -trans itiona l.dtd" >

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>Page XHTML avec un tableau imbriqué</title>

Page 160: Comprendre XSLT

160 CHAPTER4. PRODUCTION DE DOCUMENTSXML

</head><body>

<table border="1"><tr> <!-- première ligne du tableau "extérieur" -->

<td> <!-- première colonne "extérieure" --><table border="1"> <!-- tableau "intérieur" -->

<tr><td>1</td><td>2</td></tr><tr><td>3</td><td>4</td></tr>

</table></td><td>a</td> <!-- deuxième colonne "extérieure" -->

</tr><tr> <!-- deuxième ligne du tableau "extérieur" -->

<td>b</td><td>c</td></tr>

</table></body>

</html>

Figure4.2: Copied’écrandel’affichaged’un tableauimbriqué

4.1.4 Attrib uts

UneDTD sertégalementà spécifierlesattributspermispourchacundesestypesd’élément.Parexemple,dansle fichierTableauComplexe.htmllesélémentsdetypetable contiennentchacununattribut border ,dont la valeurestégaleà 1 (leschampsdu tableaudoiventêtreentourésd’un cadredont la largeurestunpixel). Cetattribut estdéfinidansla DTD XHTML dela manièresuivante:

<!ATTLIST table border CDATA #IMPLIED>

Le mot réservé<!ATTLIST est suivi du nom de l’élément défini dansla DTD (table ), du nom del’attributàdéfinir(border ), desinformationssurle typedel’attribut (CDATA) etsonutilisation(#IMPLIED ).Le typeCDATAindiquequelesvaleursdecetattribut peuventêtredeschaînesdecaractèrescomposéesdetouslescaractèressauf&, < et>. Le mot #IMPLIED signifiequecetattribut estoptionnel.

Contrainte : Il nepeutavoir deuxdéfinitionsd’attributsavecle mêmenompourunélément.Enrevanche,il estpossiblededéfinirplusieursattributsavecle mêmenom(etdumêmetypeoudetypesdifférents)dansdesélémentsdifférents.

Dansla DTD XHTML, lesélémentsdetype td et th (champsdansuneligne d’un tableau)partagentexactementlesmêmesattributs.Voici uneversionsimplifiée:

<!ATTLIST td bgcolor CDATA #IMPLIED

Page 161: Comprendre XSLT

4.1. DÉFINITION DE TYPESDE DOCUMENTS: DTD 161

rowspan CDATA "1"colspan CDATA "1">

L’attribut optionnelbgcolor permetdedéfinir la couleurdefonddela cellule.Lesdeuxattributs(op-tionnels)suivantsspécifientrespectivementla hauteur(enlignes)et la largeur(encolonnes)dela cellule.Par défautcesattributsprennentla valeur1: dansle casd’un attribut optionnelavecvaleurpardéfaut,lemot réservé#IMPLIED estremplacéparla valeurpardéfaut.

Voici l’exempled’un tableaupluscomplexeoù lesdifférentsélémentsontdesattributs(voir l’affichagedansla figure4.3).

Exemple59 TableauAttrs.html: Tableauavecattributs

<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1 -trans itiona l.dtd" >

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>page xhtml avec un tableau complexe</title></head><body>

<table border="1"><tr><th rowspan="2"/><th bgcolor="gray" colspan="2">R</th></tr><tr bgcolor="#aaaaaa"><th>A</th><th>B</th></t r><tr><th bgcolor="#aaaaaa">x</th><td>1</td><td >2</td ></tr>

</table></body>

</html>

Figure4.3: AffichagedeTableauAttrs.html

La présencede certainsattributsestparfoisobligatoiredansla baliseouvranted’un élément.Par ex-emple,la balise T img U qui permetd’incluredesimagesdansundocumentHTML/XHTML doit toujourscontenirun attribut src avec l’URL d’uneimageà inclureet un attribut alt avecun texte d’explicationsi l’image ne peutpasêtreaffichée(l’attribut alt estoptionneldansHTML 4.0). Voici un extrait de ladéfinitiondesattributsspécifiéspourlesélémentsdetype img dansla DTD XHTML :

<!ATTLIST img src CDATA #REQUIREDalt CDATA #REQUIREDheight CDATA #IMPLIEDwidth CDATA #IMPLIED>

Les src et alt sontdesattributs obligatoires. Les attributs height et width sontoptionnelsetpermettentdedéfinir la hauteuret la largeurdel’image(enpixelsouenpourcentaged’espacedisponible).

Les élémentsde type img peuvent égalementcontenirun attribut ismap dont la présenceindiquesi l’image contientdeszonesqui servent commeboutonspour desliens vers d’autrespagesXHTML.

Page 162: Comprendre XSLT

162 CHAPTER4. PRODUCTION DE DOCUMENTSXML

DansHTML 4.0 il suffit d’inclure cet attribut dansla baliseouvrantesansdéfinir unevaleur. Ceci n’estpaspermisdansXHTML qui imposela définitiond’unevaleurpourchaqueattribut. Pourcela,XHTMLdéfinit ismap commeun attribut optionnelqui peutprendrecommeseulevaleurle mot ismap :

<!ATTLIST img ismap (ismap) #IMPLIED>

DesexemplesdebalisesT img U ouvrantesvalideset non-validessontdonnésdansle tableau4.1.

Balise Valide ?<img src="lo.gif"alt="logo">

valide

<img src="lo.gif" alt="logo"width="100">

valide

<img src="lo.gif" alt="logo"ismap="ismap">

valide

<img> invalide: les attributs src et alt man-quent

<img src="lo.gif" alt="logo"ismap="toto"

invalide: "toto" n’est pas permiscommevaleurde ismap

Table4.1: Balisesouvrantesdetype img

L’attribut ismap estun exempletrivial d’un attribut de type énumération: au lieu de spécifieruneseulevaleur, il estégalementpossibledespécifierunensembledevaleurspossiblesséparéesparle symbole« | ». Un exempleest l’attribut type associéaux élémentsde type button ( boutonsd’un formulaireXHTML) :

<!ATTLIST button type (button|submit|reset) "submit">

Après#IMPLIED et #REQUIRED, un troisièmetype d’utilisation d’un attribut estdéfini par le motréservé#FIXED . IL estassezrareet permetdedéfinir desattributsavecunevaleurconstante: la décla-rationde l’attribut doit contenirunevaleurpar défautet toutesles occurrencesde cetattribut, optionnel,doiventavoir la mêmevaleur. L’attribut xmlns défini pour l’élémentracined’un documentXHTML estun exempled’un attribut fixe:

<!ATTLIST html xmlns CDATA #FIXED ’http://www.w3.org/1999/xhtml’>

Cetattribut définit l’espacedenommagedesélémentsXHTML Et nepeutpasêtrechangé.Desexem-plesdebalise T html U ouvrantesvalidesetnon-validessontdonnésdansle tableau4.2.

Balise Valide ?<html> valide<html xmlns="http://www.w3.org/1999/xhtml" > valide<html xmlns="http://foo.bar/xhtml"> invalide: espacede noms

différentdela valeurfixée

Table4.2: Balisesouvrantesd’élémentsdetypehtml

Typesd’attrib uts

À partCDATAil existeneufautrestypesd’attributsqui sontrésumésdansle tableau4.3.

Page 163: Comprendre XSLT

4.1. DÉFINITION DE TYPESDE DOCUMENTS: DTD 163

Type d’Attrib ut Valeurs possiblesCDATA chaînesde caractèrescomposéede tous les caractères

sauf&, < et >(nom1|nom2|...) un nom symbolique(chaînede caractèressansblancs)

dansl’ensemble{nom1, nom2, ...}NMTOKEN nomsymboliqueNMTOKENS listedenomssymboliquesID nom symbolique: identificateur de l’élément dont la

balisecontientl’attribut decetype(voir page163)IDREF nomsymbolique:référenceversun élémentidentifiépar

un attribut detype ID (voir section4.1.4IDREFS liste de noms symboliques(séparéspar des blancs):

référenceversdesélémentsidentifiéspardesattributsdetype ID (voir page163)

ENTITY nomsymbolique: adressed’uneentitéexternenon-XML(voir page154)

ENTITIES liste de nomssymboliques: adressesd’entitésexternesnon-XML (voir page154)

Table4.3: Typesd’attributset valeurspossibles

Identification d’éléments

Lesattributsdetype ID permettentd’identifier lesélémentsdansun documentXML. XHTML définit unattribut identificateurpourun grandnombrede typesd’éléments.Par exemple,la définitionde l’élémenttable contientun attribut id :

<!ATTLIST table id ID>

Attention, il ne fautpasconfondrele nomde l’attribut (id ) avecsontype (ID ) : c’estuniquementletypequi décidesi un attribut permetd’identifier un élémentdansun documentXML. En d’autrestermes,pourconnaîtrelesattributsidentificateursd’un documentXML, l’inspectiondesaDTD estobligatoire.

Lescontraintesimposéespourl’utilisation desattributsidentificateurssontlessuivants:

1. Onpeutdéfinir aumaximumunattribut identificateurpartyped’élément.

2. Il nedoit pasy avoir plusieursélémentsavecla mêmevaleurpourunattribut déclarécommeID dansun mêmedocumentXML. Il estimportantà noterquecettecontrainteportesur tous les élémentsd’un documentXML indépendammentde leur type. Ainsi, mêmesi deuxélémentssontde typesdifférents,il ne doiventpasavoir le mêmeidentificateur(on dit queles identificateursne sontpastypés).

Remarque: L’introductiond’attributsidentificateursestnouveaudansla«version»XHTML deHTML 4.0qui avait unenotionbeaucoupplusfaibled’identification,définieuniquementpourlesélémentsdetypea(ancres)identifiéesparl’attribut name.

On n’est pasobligéde définir un identificateurpour chaqueélémentdansun documentXML. D’unemanièregénérale,on ne définit desidentificateursquepour les élémentsqui sontréférencéspar d’autreséléments.CeréférencementestpossiblegrâceàdesattributsdetypeIDREF et IDREFS. Un exempled’untel attribut estfor définipourlesélémentsdetype label :

<!ATTLIST label for IDREF #IMPLIED>

Page 164: Comprendre XSLT

164 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Ce type d’élémentpermetde définir une légendepour d’autresélémentsdansun formulairecommebutton , input ou select . Voici un exempleextrait dela recommandationXHTML :

<form action="..." method="post"><table>

<tr><td><label for="fname">first name</label><td><input type="text" name="firstname" id="fname">

<tr><td><label for="lname">last name</label><td><input type="text" name="lastname" id="lname">

</table></form>

Ce formulaire(élémentde type form ) contientdeuxélémentsde type input qui sontidentifiéspar unattribut id detype ID . Lesvaleursdecesdeuxattributsapparaissentcommeréférencesdanslesattributsfor desélémentsdetype label .

L’utilisation d’attributsdetypeIDREF et IDREFS dansundocumentXML doit respecterla contraintesuivante: pourchaquevaleur(identificateur)d’un attribut detypeIDREF etchaquevaleurdansla listedesvaleursd’un attribut detype IDREFS il doit existerunélémentaveccetidentificateur, c’est-à-direavecunattribut de type ID devaleuridentique.Dansle domainedesbasesdedonnéesrelationnelle,on parlede«contraintesd’integrité référentielle».

4.1.5 DTD et XML Schéma

ConcluonscetteprésentationdesDTD parquelquesremarquessurleurslimites:

S Une DTD n’est pasun documentXML : ceci créeuneséparationinutile entrela descriptionde lastructureet le contenud’un documentqui ne peuvent pasêtre traitésde manièreuniforme. Parexemple,il n’estpaspossibled’inspecteruneDTD dansun programmeXSLT !S L’ensembledestypesproposéspar uneDTD est restreint: on ne peututiliser qu’un seul type devaleuratomique#PCDATA pourle contenuetunedizainedetypespourlesattributs(CDATA, NM-TOKEN, ID, IDREF, ....). Destypestrèscourantsdansleslangagesdeprogrammationet la gestiondedonnéesengénéral(entiers,flottants,dates)sontcomplètementabsents.S Il n’estpaspossiblededireexplicitementquedeuxtypesd’élémentsont la mêmestructure: souventdifférentstypesde balisepartagentunepartiede leur structure(modèlede contenu).Un exempledansXHTML sontlesbalisesT td U et T th U qui ontexactementle mêmemodèledecontenu.Uneséparationentrelesbaliseset leursmodèlesdecontenudonneraitplusdeflexibilité etdemodularitédansla définitiondu langage(la DTD XHTML «simule» cetteséparationavecl’utilisation d’entitésparamètres).S Il n’estpaspossibledespécifierdesstructurescomplexessurdescontenusmixtes: la structured’unélémentqui peutavoir desfils de type Text ne peutpasêtredétailléeà un niveausuffisant(il estseulementpossibledespécifierlestypesdesfils possibles,sansimposeruneautrecontrainte).

Onaessayéderépondreàceslimitesparla définitiond’un langagededéfinitionde«schémasXML »,qui est une récente(mai 2001) recommandationW3C pour la définition de la structurede documentsXML. Un schémaXML estundocumentXML, il séparela notiondebalisedela structured’un élémentetintroduitunemultitudedetypeatomiques(unecinquantaine)nouveauxpourla représentationdedonnées.De plus, la recommandationXML Schémaintroduit desnotionsdemodélisationobjetcommel’héritage,l’extensionet la redéfinitiondetypes.

XML Schémaestun pasversunemeilleureutilisationdeXML pour l’échanged’informations,car ilpermetunedescriptionplus détailléeet plus précisede la structuredesdonnéeséchangées.Néanmoins,pour le momentet à causede leur jeunesse,la richessedesschémasXML n’est pasencoreexploitable

Page 165: Comprendre XSLT

4.2. SITEWEB: HTML 165

pour la programmationXSLT. XML schémaestau niveaude la spécificationformelle, et il n’existepasencored’interfaceoudemodèledeprogrammationstandard- analogueàDOM pourle coupleXML/DTD- permettantdedévelopperdesapllications.

4.2 SiteWeb: HTML

Nouspassonsmaintenantà l’étude de quelquesDTD importantesdéfinissantdeslangagescourammentutiliséssurle web.

4.2.1 HTML et XHTML

HTML estun langagede balisagequi, contrairementà XML, fournit un ensemblefixe de balisesavecdessignificationsprécisesqui permettentaux différentsnavigateursHTML de présenterle contenududocumentd’unemanièreadaptée.

Commetoutesles langagesinformatiquesqui doivent s’adapterà desnouveauxbesoins,HTML aévoluédepuissapremièreversionpubliéeen1991. En tout, entre1991et 1999il y a euquatreversionssuccesivesdeHTML, numérotéesde1.0 à 4.0. Bien quelesdocumentsHTML actuelsressemblentdansleurstructureàdesdocumentsXML, il nesontpasconformesà la recommandationXML. Cecis’expliqueenpartieparle fait queHTML estapparuavantXML ets’estfondésurle standardSGML. Cedernier, quipeutêtreconsidérécommeun précurseurdeXML, permetplusdesouplessedansl’utilisation desbaliseset desattributs. En contrepartiecettesouplesserendla tâched’analysesyntaxiqued’un documentHTMLpluscomplexe.

Exemple60 ExHTML4.html: PageHTML Version4.0

<html><head>

<title>Exemple de Page HTML 4.0</title></head><BODY>

<P>Paragraphe 1<br><img SRC="image.gif" width=30pt ismap><p>Paragraphe 2

</body></html>

Le fichier ExHTML4.htmln’estpasconformeà XML pourplusieursraisons:S DansSGML, lesbalisesd’élémentsvidesnedoiventpasêtrefermées.Parexemple,la balise T br Udéfinit un élémentvide qui correspondà un sautde ligne dansl’affichage.La représentationXMLd’un tel élément( T br/ U ou T br U%T /br U ) n’estpasvalidedansHTML 4.0.S Quelquestypesd’élémentsnon-videspermettentaux auteursd’omettreles balisesfermantes.Parexemple,lesbalisesT P U et T p U nesontpasobligatoirementfermées.Lesrèglespourla fermetureimplicite d’unebalisenon-ferméesontdéfiniesparle standardSGML.S DansHTML, lesnomsdesbaliseset desattributsnesontpassensiblesà la casse(case-sensitive).LesbalisesT P U et T p U , qui correspondentà desdébutsdeparagraphe,sontconsidéréescommeéquivalentes.S Danscertainscas,il estpossiblededéfinir la valeurd’un attribut sansl’entourerpardesapostrophessimplesoudesguillemets.C’estle casparexemplepourla valeurdel’attribut width dansla baliseT img U .S Enfin lesattributsbooléenspeuventêtreutiliséssansvaleur. Par exemple,l’attribut ismap danslabalise T img U n’a pasdevaleur.

Page 166: Comprendre XSLT

166 CHAPTER4. PRODUCTION DE DOCUMENTSXML

XHTML

Cesdifférencesentreles «versionsSGML» de HTML et XML on été identifiéeset éliminéesen 2000dansla dernièreversionde HTML 4.0, conformeà la syntaxe XML, et appeléeXHTML. Un avantageimportantdecetteévolutionestla possibilitéd’exploiter lesdocumentsXHTML (HTML-4.0) partouslesoutils XML actuels.En particulier, il devient possibledeproduireet mêmedetransformerdesdocumentsXHTML avecXSLT. Voici la versionXHTML dela pageHTML ExHTML4.html:

Exemple61 ExXHTML.xml: PageXHTML

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1 -trans itiona l.dtd" >

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>Exemple de Page XHTML</title></head><body>

<p>Paragraphe 1</p><p><img src="image.gif" alt="une image" width="3Opt"

ismap="ismap"/></p>

</body></html>

Sioncomparelecontenudesélémentsdetypehtml danslesfichiersExHTML4.htmletExXHTML.xml,on constatequele deuxièmefichier respectelescontraintesimposéesparla syntaxeXML :S touteslesbalisesd’éléments(videset non-vides)sontfermées;S lesnomsdesbaliseset desattributssonttousécritsenminuscules;S touslesattributsont unevaleurentouréepardesguillemetsou desapostrophessimples.

4.2.2 DTD XHTML

Cettesectionest consacréeà la structuregénéraled’un documentXHTML. Une descriptioncomplètede toutesles balisesHTML/XHTML dépasseraitlargementle cadrede ce livre: nousvousrenvoyonsàl’ouvrageHTML etXHTML,la Référence, deChuckMusciano& Bill Kennedy, paruauxÉditionso’Reilly.Notrebut estessentiellementdedonneruneclassificationdesdifférentesbalisesdansla DTD XHTML parrapportà leur utilisation. NousnedécrivonspasparexemplelespartiesdeHTML 4.0 qui sontcouvertesparla recommandationXML, commeparexemplele problèmedel’encodageet l’affichagedescaractères.

Typesde Base

Enplusdesdifférentstypesd’attributsdéfinisdansla recommandationXML (CDATA, ID, IDREF, NMTO-KEN, . . . ), XHTML spécifiequelquesdizainesdetypesd’attributssupplémentairesavecdessignificationsspécifiques.Touscestypesd’attributssontdéfiniscommeentitésparamètresréférencéesdansla définitiond’un attribut detypecorrespondant.Par exemple,pourdistinguerleschaînesdecaractèresqui correspon-dentàdesURI (UniformResourceIdentifier), la DTD définit uneentitéURI :

<!ENTITY % URI "CDATA"><!-- a Uniform Resource Identifier, see [RFC2396] -->

Une DTD ne permetpasd’imposer les contraintessyntaxiquesspécifiquesaux URI et la DTD donneuniquementuneréférenceversle documentdespécificationcorrespondant(RFC2396) dansun commen-taire. Cetentitéestensuiteréférencéedansla définitiond’un attribut qui accepteuneURI commevaleur.Par exemple,l’attribut href desélémentsdetypea prendcommevaleurl’URI dela ressourcequi corre-spondà la destinationd’un lien HTML :

Page 167: Comprendre XSLT

4.2. SITEWEB: HTML 167

<!ATTLIST a href %URI; #IMPLIED

Voici la définitiondequelquesautrestypesdebasedansla DTD XHTML :

<!ENTITY % Number "CDATA"><!-- one or more digits -->

<!ENTITY % Text "CDATA"><!-- used for titles etc. -->

<!ENTITY % Length "CDATA"><!-- nn for pixels or nn% for percentage length -->

<!ENTITY % Color "CDATA"><!-- There are also 16 widely known color names with their sRGB values:

Black = #000000 Green = #008000Silver = #C0C0C0 Lime = #00FF00Gray = #808080 Olive = #808000White = #FFFFFF Yellow = #FFFF00Maroon = #800000 Navy = #000080Red = #FF0000 Blue = #0000FFPurple = #800080 Teal = #008080Fuchsia= #FF00FF Aqua = #00FFFF

-->

Nousverronsplusloin quelquesattributsqui utilisentcesdifférentstypes.

Structur egénéraled’un documentXHTML

Le fichierExXHTML.xml, page166donnela structuregénéraled’un documentXHTML. Il commenceparunedéclarationXML, optionnelle,maisutile pour le processeur. Les trois lignessuivantesdéfinissentlaDTD du document:

<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xh tml1- trans itiona l.dtd ">

La premièreligne indiquequel’élémentracinedu documentestdetypehtml . Lesdeuxlignessuiv-antesdéfinissentl’identificateurpublicet l’adressephysiquedela DTD XHTML qui doit êtrerespectéeparle document.CetteDTD eststockéedansle fichier xhtml1-transitional.dtd . L’élémentracineT html U y estdéfinidela manièresuivante:

<!ELEMENT html (head, body)><!ATTLIST html

%i18n;xmlns %URI; #FIXED ’http://www.w3.org/1999/xhtml’>

Lesattributsdéfinisdansl’entité paramètrei18n permettentd’indiquerle codedela langueutiliséedansle contenudu document.L’attribut xmlns défini l’espacedenomsdeHTML qui nepeutpasêtrechangé(c’estun attribut fixé).

Lesélémentsde typehead et body contiennentrespectivementl’en-têteet le contenudu documentXHTML. Ils sontdéfiniscommesuit (nousnedonnonspaslesattributsdeceséléments):

<!ELEMENT head (%head.misc;,((title, %head.misc;, (base, %head.misc;)?) |

(base, %head.misc;, (title, %head.misc;))))><!ELEMENT body %Flow;>

Élémententêtehead : Onvoit quelesélémentsdetypehead doiventavoir exactementunsous-élémentde type title , un sous-élémentoptionnelde type base et dessous-élémentsdéfinispar l’entitéparamètrehead.misc :

Page 168: Comprendre XSLT

168 CHAPTER4. PRODUCTION DE DOCUMENTSXML

<!ENTITY % head.misc "(script|style|meta|link|object|i sindex )*">

À part title , le typemeta estle plusutilisé dansl’entêted’un documentHTML. Cesélémentssontvideset permettentde donnerdesinformationssupplémentairessur le contenudu documentsousformedevaleursd’attributs:

<!ELEMENT META EMPTY><!ATTLIST META

%i18n;http-equiv NAME #IMPLIEDname NAME #IMPLIEDcontent CDATA #REQUIREDscheme CDATA #IMPLIED>

Lesdeuxattributsname et content peuventêtreutiliséslibrementpourdonnerdesinformations«meta» sur le contenudu document.Par exemple,la balise T nameU permetd’indiquer l’auteurd’un documentet quelquesmots-clésqui peuventêtreexploitéspour l’indexationparun moteurderecherche:

<META name="author"content="L’épée de Bois"/>

<META name="keywords" lang="en-us"content="movie theatre, cinema, paris"/>

<META name="keywords" lang="fr"content="cinéma, film, paris"/>

Élémentcontenubody : Lesélémentsdetypebody ontuncontenumixte(dutextemélangéavecd’autreséléments)définiparl’entité Flow :

<!ENTITY % Flow "(#PCDATA | %block; | form | %inline; | %misc;)*">

On peutdistinguerentreleséléments«container» (spécifiéspar l’entité block ) qui acceptentdessous-éléments,leséléments«feuilles» (spécifiésparl’entité inline ) qui n’acceptentquedu texteetceuxqui peuventêtre«container» et« feuilles».

LefichierExXHTMLCompl.htmlcontientlesbaliseslespluscourantesdansunepageXHTML (HTML),à l’exceptiondestableaux(voir page154),etdesformulaires.Nouslaissonségalementdecôtéla construc-tion depagesaveccadres(frames).

Exemple62 ExXHTMLCompl.html: PageHTML typique.

<?xml version="1.0" encoding="iso-8859-1"?><!DOCTYPE html

PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""../DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"><head>

<title>Exemple de Page XHTML</title></head><body>

<center><h1>Header 1 (centré)</h1>

</center><h2>Header 2</h2><p>Paragraphe 1</p>

Page 169: Comprendre XSLT

4.2. SITEWEB: HTML 169

<p>Paragraphe 2:Ligne1<br/>Ligne2<hr/>Ligne3

</p><p>Paragraphe 3:

<pre>Texte

formatté</pre>Texte <b>gras</b>, <i>italique</i> et <b><i>italique et gras</i></b>,<font size="-2" color="blue">bleu et petit</font>

</p><p>Paragraphe 4:

Une liste<ul>

<li>Une image:<img src="Vertigo.gif" alt="une image" width="30" align="bottom"/>

</li><li>Une autre liste:<ol><li>item 1</li><li>item 2</li></ol>

</ul><a href="Vertigo.xml">Lien</a> vers la page Vertigo.xml

</p></body>

</html>

La figure4.4montrel’affichagedecefichier avecunnavigateurXHTML. Enoccurrenceil s’agit delaversion0.9.2du navigateurMozilla, lui-mêmebasésurNetscape.Touslesnavigateursactuelsnesontpascapablesd’afficherdu XHTML.

Formattagede texte HTML

Le textedecettepageestmis enformedela façonsuivante:g le textedansla balise h center i estcentré;

g séparationdeparagrapheset delignes:

– la balise h p i estutiliséepourdéfinirquatreparagraphes– lesauteursdepagesHTML remar-queronsquecesbalisesontfermées.

– lesbalisesh br i et h hr i séparentdeuxlignes(la deuxièmebaliseajouteunséparateursousformed’un trait entrelesdeuxlignes): lesfinsdelignesdansle texten’ont pasd’influencesursaprésentation.g pendantl’affichage,les espacessont généralementtransformésen un seul caractère blanc. Les

seulesexceptionssontlesespacesdansle contenudela balise h pre i qui nesontpasmodifiés.Sion regardela définitiondesattributsdecetélément:

<!ATTLIST pre%attrs;xml:space (preserve) #FIXED ’preserve’>

on peutobserver qu’il définit un attribut xml:space dont l’unique valeurdoit êtreégaleà pre-serve .

g taille depolice: le texte entreles h h1 i et h h2 i a unetaille supérieureau texte normal: HTMLdéfinit six niveauxd’agrandissementavec six types de balises( h h1 i , h h2 ijh h3 i , h h4 i ,h h5 i , h h6 i ) où la balise h h1 i correspondà l’agrandissementle plusimportant.

Page 170: Comprendre XSLT

170 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Figure4.4: Copied’écrandeExXHTMLCompl.html

g styledepolice: lesbalisesh emi et h b i transformentle texte qu’ils contiennenten italique et engras. Il estévidemmentpossibledecombinerlesdeux.g couleurdepolice: La balise h font i permet,entreautre,le changementdela couleuretdela tailledu textequ’elle contient.

Il contientégalementdeuxlistes,uneimageet un lien:g HTML permetdeconstruiredeslistesnon-numérotéesdéfiniespar lesélémentsh ul i et les listesnumérotésreprésentéespar lesbalisesh ol i . Lesélémentsdansuneliste sontreprésentéspar lesbalisesh li i qui sontdeséléments«container».g Lesimagessontinclusesenutilisantla balise h img i ;g Les liens entrepagesHTML et entreunepageHTML et un autretype de ressourcesont définisen utilisant la h a i : les liens sontuni-directionnel– il peuventêtretraversésseulementdansunedirection– etmono-cible– il n’estpaspossibledespécifierplusieursressourcesciblespourun lien.

Nousmontreronsd’autresexemplesdansla suite.

4.2.3 Générationde pagesHTML: xsl:output

Tous les navigateursHTML actuelsn’ont pasencoreadoptéle standardXHTML et il faudracontinuerencorependantun certaintempsde produiredesdocumentsHTML conformesaux versionsantérieures

Page 171: Comprendre XSLT

4.2. SITEWEB: HTML 171

(l’expériencemontrequeles logicielsqui sontdistribuésà un trèsgrandpublic, cequi estle caspour lesnavigateursWebqui sontutiliséspartouslesInternautes,serenouvellentlentement).Toutefois,la créationd’un documentHTML version4.0 ou antérieureà partir d’un documentXML n’est passi évidenteavecunefeuille de styleXSLT. Rappelonsqu’un programmeXSLT estlui-mêmeun documentXML qui doitrespecterlescontraintessyntaxiquesdulangage.Ainsi, la règlesuivante,qui remplacelesélémentsdetypeLOGOparun élémentHTML vide n’estpascorrecte:

<xsl:template match=’LOGO’><br><img SRC="image.gif" width=30pt ismap>

</xsl:template>

Inversement,la règlesuivanteestcorrectemaisneproduit pasunebaliseconformeà HTML 4.0 (lesbalise h br i et h img i définissentdesélémentsvideset nedoiventpasêtrefermés):

<xsl:template match=’LOGO’><br /><img src="image.gif" alt="Affiche du Film" width="3Opt"

ismap="ismap"/></xsl:template>

Pourrésoudrece dilemme,XSLT définit l’instruction xsl:output qui permetde spécifierun for-mattageàposterioridurésultatdela transformation.La méthodequi nousintéresseici esthtml , qui traduitle résultatXHTML endocumentHTML. Ainsi, enajoutantl’instructionxsl:output method="html"/>audébut dela feuille destylecontenantla deuxièmerègle,lesélémentsdetypeLOGOsontremplacésparla balise h IMG src=’logo-small.gif’ i .

4.2.4 Transformation d’une pageXML

Voyons maintenantcommenton peut utiliser XSLT pour publier des informationscontenuesdansdesdocumentsXML sousformed’un siteHTML. Entreautresavantagesd’unemanipulationdesdocumentsXML à la placede documentsHTML, nousallonsmontrerqueXSLT permetd’éviter desredondancesdanslescontenusdedocuments,et detraiterle problèmedeslienscassés.

Reprenonsl’exempledesfilms etdescinémasdel’introductionpourdécrireplusendétailla générationd’un siteWeb/HTML. Le premierfichier XML estVertigo.xml, donnépage24. Le programmeFilm.xsl,page25 transformece documenten pageHTML. Voici unerègle trèssimplede transformationpour lefilm :

<xsl:template match="FILM"><h1><xsl:value-of select="TITRE"/></h1>

<xsl:value-of select="GENRE"/>,<xsl:value-of select="PAYS"/>,<xsl:value-of select="ANNEE"/>, de<xsl:value-of select="AUTEUR"/>

</hr><xsl:value-of select="RESUME"/>

</xsl:template>

On peutobserver quecetterègleaffiche la valeurde touslesfils de l’élémentFILM . Uneapplicationà d’autresélémentsdu mêmetype, sous-entendqu’on connaîtpour tous les films leur titre, leur auteur,l’année,le genre,le payset un résumé.En d’autresterme,l’auteurdecetrèglesupposequ’elle s’appliqueuniquementàdesfilms qui sontvalidesparrapportà la DTD Film.dtdsuivante:

Exemple63 Film.dtd: DTD pour lesfilms

<!ELEMENT FILM (TITRE, AUTEUR, ANNEE, GENRE, PAYS, RESUME) ><!ATTLIST FILM FILMID ID #REQUIRED><!ELEMENT TITRE (#PCDATA) >

Page 172: Comprendre XSLT

172 CHAPTER4. PRODUCTION DE DOCUMENTSXML

<!ELEMENT AUTEUR(#PCDATA) ><!ELEMENT ANNEE (#PCDATA) ><!ELEMENT GENRE(#PCDATA) ><!ELEMENT PAYS (#PCDATA) ><!ELEMENT RESUME(#PCDATA) >

Onvoit, parcepremierexemple,quemêmesi lesDTD nepeuventpasêtreexploitéesdirectementpardesprogrammesXSLT, elles facilitent la programmationen fournissantunedescriptionprécisedesdonnéesà transformer. En d’autrestermes,uneDTD peutservir commesystèmede typagecomplémentairepourle langageXSLT : en utilisant un parseurvalidant, on vérifie alors la validité d’un documentavant satransformation.

Remarque: Le langageXSLT esttrèscomplexe et il n’est paspossiblede vérifier pourun programmeXSLT quelconquequ’il transformetouslesdocumentvalidespar rapportà uneDTD versdesdocumentsd’uneautreDTD.

Voici un autredocumentqui décritunesalledecinéma:

Exemple64 Salle1.xml: Salledecinéma

<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet href="SalleRefOut.xsl" type="text/xsl"?><?cocoon-process type="xslt"?><SALLE NO=’1’ PLACES=’320’ FILMREF=’2’>

<SEANCES><SEANCE>15:00</SEANCE><SEANCE>18:00</SEANCE><SEANCE>21:00</SEANCE>

</SEANCES><REMARQUE>Réservation conseillée</REMARQUE>

</SALLE>

L’élément h SALLEi contienttroisattributs:

1. NO: numérodela salle;

2. PLACES: capacitédela salleennombredeplaces;

3. FILMREF: référenceversle film projeté.

CestroisattributssontégalementdéfinisdansuneDTD :

Exemple65 Salle.dtd: DTD pour lessallesdecinémas

<!ELEMENT SALLE (SEANCES, REMARQUE?)><!ATTLIST SALLE NO ID #REQUIRED

PLACES CDATA #IMPLIEDFILMREF NMTOKEN#REQUIRED >

<!ELEMENT SEANCES(SEANCE)*><!ELEMENT SEANCE(#PCDATA)><!ELEMENT REMARQUE(#PCDATA)>

Onpeutvoir quel’attribut NOestl’identificateurdela salle.

Remarque: Bien que la référencevers le film contiennel’identificateurd’un élémentde type FILM ,elle n’est pasdéfinie commeattribut de type IDREF. Une telle définition aurait commeconséquencel’obligation dela présencedesfilms dansle mêmedocument(cequi n’estpasle cas).Nousallonsrevenirsurcettequestionplusloin.

DanscetteDTD, onpeutégalementvoir la présenced’élémentsoptionnels(REMARQUE) etd’élémentsrépétés(SEANCE). PrenonsunepremièrerègledetransformationdéfiniepourlesélémentsdetypeSALLEet SEANCE:

Page 173: Comprendre XSLT

4.2. SITEWEB: HTML 173

<xsl:template match="SALLE"><h2>Salle No <xsl:value-of select="@NO"/></h2><h3>Séances</h3><ol>

<xsl:apply-template select="SEANCES/SEANCE" /></ol><xsl:for-each select="REMARQUE">

Remarque: <xsl:value-of select="."/></xsl:for-each>

</xsl:template>

<xsl:template match="SEANCE"><li><xsl:value-of select="."/></li>

</xsl:template>

Cetterèglecréeuneliste detypeol qui contientle résultatdela transformationdesélémentsdetypeSEANCE: la règlecorrespondanten’affichequel’heurede la séance.Pourfaire cettetransformation,onauraitégalementpuconstruireunebouclexsl:for-each surtouteslesséances,commepourl’affichagedela remarque(si elleestprésente).

Si on compareà nouveauceprogrammeavecla DTD dessalles(Salle.dtd), on constatequecesdeux«boucles» (rappelonsquel’application d’une règlepar xsl:template peuttoujoursêtretraduiteparunebouclexsl:for-each ) correspondentexactementauxélémentsrépétés(lesséances)et à l’élémentoptionnel(la remarque).

4.2.5 Création de liens

Nous avons vu commentcréerdespagesHTML pour les séanceset pour les films. Maintenantnousvoudrionsrelier cespagespardeslienspourcréerun réseauhypertexteliant cespages.

Voici un premierexemplesimpledecréationde liens. Un fichier MesFilms.xmlprésentepourchaquefilm sonidentificateur, sontitre maiségalementl’URL dela ressourcequi contientplusd’information:

Exemple66 MesFilms.xml: La listedesfilms

CettepagepeutêtretransforméetrèsfacilementenunepageHTML qui contientdesliensverslesressourcesdetouslesfilms etcecigrâceà l’attribut HREF. Nousmontronsuniquementla règledetransformationdesélémentsdetypeFILM :

<xsl:template match="FILM"><tr><td>

<a href=’{@HREF}’><xsl:value-of select="TITRE"/></a></td></tr>

</xsl:template>

Chaqueélément h FILM i est traduit en une ligne dansun tableau. Par exemple, la traductiondupremierélémentdonnele fragmentHTML suivantcommerésultat:

<tr><td><a href="Vertigo.xml">Vertigo</a></td>

</tr>

Le résultatdela transformationcomplètedufichier MesFilms.xmlestmontrédansla figure4.5.Maintenantnousvoudrionscréerce type de lien entrela pageHTML qui correspondà unesalleet

les pagesHTML qui correspondentaux films projetésdanscettesalle. C’est un peu plus compliqué,car les pagesXML concernantles sallesne contiennentque desréférencesvers desfilms, mais n’ontpasl’information concernantles ressources: il n’est paspossiblede déduirele nom de la ressource,parexempleVertigo.xmlàpartir dela référencedu film dansSalle1.xml.

Page 174: Comprendre XSLT

174 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Figure4.5: Affichagedela listedesfilms

Pourpouvoir créercesliens,on estobligéd’accéderenmêmetempsaufichier Salle1.xmlet aufichierMesFilms.xmldansle programmedetransformation.C’estpossibleenutilisantla fonctiondocument() dulangageXPath,qui permetde choisir uneressourcecommenouvelle racinepour l’évaluationdesétapesdansuneexpressionXPath.Voici unexempled’utilisationdecettefonctiondansla règledetransformationd’élémentsdetypeSALLEqui setrouventdansle documentSalle1.xml(oun’importequelautredocumentsatisfaisantla DTD Salle.dtd) :

<xsl:template match="SALLE"><h2>Salle No <xsl:value-of select="@NO"/></h2>Film:

<xsl:variable name="filmref" select=’@FILMREF’ /><xsl:variable name="film"

select="document(’MesFilms.xml’)/LI STEFIL M/FIL M[@FILMREF=$film ref]" /><xsl:element name=’a’>

<xsl:attribute name=’href’><xsl:value-of select=’$film/@HREF’/>

</xsl:attribute><xsl:value-of select="$film/TITRE"/>

</xsl:element></xsl:template>

Cetterègledéfinitdeuxvariables.La première,filmref , contientla référencedufilm dontonchercheletitre et la ressource.La deuxièmetrouvecefilm dansle documentMesFilms.xmlparuneexpressionXPathqui :

g utilise le documentMesFilms.xmlcommeracine;

g trouvetouslesélémentsdetypeFILM danscedocument;

g filtre parmicesélémentsceuxqui ont un attribut FILMREF dont la valeurestidentiqueà la valeurdela variablefilmref .

Cetélément– il n’y ena qu’un si on définit l’attribut FILMREF commeun identificateurd’élémentsdansle documentMesFilms.xml– estensuiteutilisé pourconstruireunélémentdetypea qui contient:

g unattribut href dontla valeurestla ressourcedu film : $film/@HREF ;

g le titre du film : $film/TITRE .

Page 175: Comprendre XSLT

4.2. SITEWEB: HTML 175

4.2.6 XML/XSL T: unesolution du problèmedesliens cassés

Un problèmeconnudansla créationet la maintenanced’un hypertextedepagesHTML estle problèmedeslienscassés(danglinglinks) : touslesinternautesont déjàfait l’expériencedu message404 PAGE NOTFOUND(ou un messageéquivalent)quandils ont voulu suivre un lien dansunepageHTML. Cemessageindiquequela ressourcecibledu lien nepeutpasêtretrouvéesurle serveurwebinterrogé.Généralement,le serveurproposesoitd’aller à la paged’accueilduserveur, soitd’utiliser le boutonBack (ouRetour) pourrevenirà la paged’origine.

Ceproblèmeapparaîtà causede l’absenced’un contrôlependantla créationde liens qui référencentdirectementdesressourcesphysiques.Dansl’exempleprécédent,nousavonsvu uneautrefaçondegérercetypedelien. Au lieu deréférencerlesressourcesdirectementparleurURL, nousavonsutiliséunfichierintermédiairequi implanteunesortede dictionnairetraduisantdesadresseslogiques(généralementdesidentificateursd’éléments)enadressesphysiques.Le fichierMesFilms.xslcorrespondàuntel dictionnaire:il indiquepourchaqueélémentdetypeFILM dansquelfichier XML on peutle trouver.

Afin deprofiterdecedictionnaire,onpeutensuitecréerunprogrammeXSLT qui traduitlesréférenceslogiquesenadressesderessourcesphysiques.Voici unerègleXSLT qui permetdefairecetterésolution:

<xsl:template name="createLinkFilm"><xsl:param name="filmref" select="inconnu"/>

<xsl:variable name="film"select="document(’MesFilms.xml’)/LI STEFIL M/FIL M[@FILMREF=$film ref]" />

<xsl:element name=’a’><xsl:attribute name=’href’>

<xsl:value-of select=’$film/@HREF’/></xsl:attribute><xsl:value-of select="$film/TITRE"/>

</xsl:element></xsl:template>

Cetterègleprendunidentificateurdefilm commeparamètreetcréeunlien versla ressourcecorrespon-dante.

Il est possibleque cette ressourcen’existe pas pour tous les films, c’est-à-direqu’il n’existe pasd’élémentde type FILM dansle dictionnairepour la référencedonnée.Dansce cas,on peutdéfinir larèglesuivante,qui retournela valeur1 si la ressourceexiste,et la valeur0 si ellen’existepas:

<xsl:template name="testFilm"><xsl:param name="filmref" select="inconnu"/><xsl:choose>

<xsl:whentest="document(’MesFilms.xml’)/LIST EFILM/ FILM[ @FILMREF=$f ilmre f]">

<xsl:text>1</xsl:text></xsl:when><xsl:otherwise>

<xsl:text>0</xsl:text></xsl:otherwise>

</xsl:choose></xsl:template>

Enutilisantcesdeuxrègles,onpeutredéfinirla règlepourlessallesdecinémadela façonsuivante:

<xsl:template match="SALLE"><h2>Salle No <xsl:value-of select="@NO"/></h2><xsl:variable name="exists">

<xsl:call-template name="testFilm"><xsl:with-param name="filmref" select="@FILMREF"/>

Page 176: Comprendre XSLT

176 CHAPTER4. PRODUCTION DE DOCUMENTSXML

</xsl:call-template></xsl:variable><xsl:if test="$exists=1">

<h3>Film:<xsl:call-template name="createLinkFilm">

<xsl:with-param name="filmref" select="@FILMREF"/></xsl:call-template>

</h3></xsl:if>

</xsl:template>

4.2.7 Intégration de pagesXML

Avant de terminercettesection,nousvoudrionsdonnerun exempled’un autreaspectimportantdansl’utilisation de XML pour sur la publicationweb. Cet aspectseratraité plus en détail dansle chapitre6consacréauxéchangesdedonnées.

Nousavonsvu commenton peutcréerdeslienshypertextesentredespagesXML/HTML enutilisantdesréférenceslogiquesentreéléments,ainsiquela fonctiondocument() deXPath. Cettecréationdeliensimplanteun certaintype d’intégrationde données.Si nousregardonsde plus prêt, nousavonsutilisé lafonctiondocument() pour «mélanger» desdonnéesprovenantde différentsdocuments: dansl’affichaged’un lien versun film, nousavonsextrait le titre du film d’un autredocument.Nousaurionségalementpuimporterle résumédesfilms ou n’importequelleautreinformationenutilisant le mêmemécanismesousla seulecontraintequ’il existe un «lien logique» entreles ressourcesqui puisseêtre traduit en adressephysique.

Uneautrefaçond’intégrerdesressourcesestl’utilisation desentitésXML. Ainsi la résolutiondesliensrevient au parseurXML qui doit remplacerdesréférencesd’entitéspar leur contenu.Voici un exempled’un documentqui décrit le cinémaÉpéedeBois,et relie cetteinformationauxséancesdanscecinéma:

Exemple67 EpeeCompl.xml: CinémaÉpéedeBois

<?xml version="1.0" encoding="ISO-8859-1"?><?xml-stylesheet href="Cinema.xsl" type="text/xsl"?><?cocoon-process type="xslt"?><!DOCTYPE CINEMA SYSTEM"Cinema.dtd" [

<!ENTITY salle1 SYSTEM"Salle1.xml"><!ENTITY salle2 SYSTEM"Salle2.xml">

]><CINEMA>

<NOM>Epée de bois</NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censier-Daubenton</METRO>&salle1;&salle2;

</CINEMA>

La déclarationdeDTD contientuneréférenceversunfichier externe(Cinema.dtd) et la déclarationdedeuxentitésexternessalle1 et salle2 qui correspondentaux élémentsde typeSALLE décrivant lesdeuxsallesdecinémas,leursséanceset lesfilms projetés.La DTD contientelle-mêmeuneréférenceversla DTD dessalles:

Exemple68 Cinema.dtd: DTD pour lescinémas

<!ELEMENT CINEMA (NOM, ADRESSE, METRO, (SALLE)*) ><!ELEMENT NOM(#PCDATA) ><!ELEMENT ADRESSE(#PCDATA) ><!ELEMENT METRO(#PCDATA) ><!ENTITY % salle-dtd SYSTEM’Salle.dtd’>%salle-dtd;

Page 177: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 177

On voit, par cet exemple,commenton peut composeren mêmetempsdesdocumentsXML et ladescriptionde leurs structureen utilisant les entités. Cettecompositionpeut mêmeêtre propagéeauniveaudu traitementdesdonnées– les programmesXSLT – en utilisant les instructionsxsl:importou xsl:include décritesdansle chapitre3 page115. Voici un programmedetransformationdeciné-masqui réutiliselesrèglesdéfiniesdansle fichier Salle.xsl:

Exemple69 Cinema.xsl: DTD pour lescinémas

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:import href="Salle.xsl"/><xsl:output method="html" encoding="iso-8859-1"/>

<xsl:template match="/"><html>

<head><title>Programme de <xsl:value-of select="CINEMA/NOM"/></title></head><body>

<xsl:apply-templates select="CINEMA"/></body>

</html></xsl:template>

<xsl:template match="CINEMA"><h1><i><xsl:value-of select="NOM"/> </i> </h1><hr/>

<xsl:value-of select="ADRESSE"/>,<i>Métro: </i> <xsl:value-of select="METRO"/><hr/>

<xsl:apply-templates select="SALLE"/>

</xsl:template></xsl:stylesheet>

4.3 Présentationsmultimédia: SMIL

SMIL estunerecommandationW3CetunacronymepourSynchronisedMultimediaIntegrationLanguage.Sonnom estprononcécommele mot anglaissmile, qui peutêtre traduit en Françaispar «sourire» ou«souriez! ».

Commesonnomindique,SMIL estun langaged’intégrationet desynchronisationd’objetsmultimé-dia. Il permetde créerà partir d’objetsnumériques(texte, sons,image,vidéo) de nouveauxdocumentsmultimédiaqui intègrentcesobjetsdansl’espaceet le temps. On peutainsi spécifierpour chaqueobjetnon seulementsapositionexactedansle document,maiségalementsoncomportementpar rapportauxautresobjetset auxparamètresdu médiad’affichage(tauxdetransfertdesdonnées,languedepréférence,préférencesutilisateur, etc).

Pourle moment,lesnavigateurswebstandardcommeNetscapeou InternetExploreron besoind’uneapplicationexternecapabled’interpréterlesbalisesSMIL correctement.Parmi cesapplicationsnouspou-vonsciter RealPlayer(versiongratuitedisponible)de RealNetworks (TM), ainsi que le produit GRiNSqui fournit un environnementdecréationdedocumentsSMIL, et l’applet gratuiteSOJA 1.0Cherbourg deHelio.

4.3.1 SMIL par un exemple

CommeXHTML et WML, un documentSMIL est un documentXML. Nous décrivons la version1.0de SMIL (au momentde la rédactionde ce document,la version2.0 de SMIL estencoreau stadede la

Page 178: Comprendre XSLT

178 CHAPTER4. PRODUCTION DE DOCUMENTSXML

proposition).Le fichier ExSimple.smilestun documentmultimédiaintégranttroiscomposants:

1. unfichier audioSound.wav qui dure2.1secondes;

2. l’affichefrançaisedu film Vertigostockéedansle fichierVertigo.png de170x240pixels;

3. etun fichier texteTexteVertigo.txt.

Exemple70 ExSimple.smil: Un fichier SMIL simple

<smil><head>

<meta name="title" content="Exemple simple d’un fichier SMIL" /><meta name="author" content=" c

k2001 Sallesenligne.com" />

<layout><root-layout width="450" height="600" /><region id="reg_img_grand" width="400" height="300" left="25" top="25" fit="meet" /><region id="reg_img_petit" width="200" height="125" left="125" top="75" fit="meet" /><region id="reg_texte" width="350" height="325" left="50" top="250" />

</layout></head><body>

<seq><par endsync="first" id="page1" >

<audio src="Sound.wav" /><a href="#page2" >

<img src="Vertigo.png" region="reg_img_grand" /></a>

</par><par id="page2" dur="30s" >

<text src="Vertigo-Resume.txt" region="reg_texte" /><img src="Vertigo.png" region="reg_img_petit" />

</par></seq>

</body></smil>

Structur egénéraled’un documentSMIL

La structuregénéraled’un documentSMIL ressembleà la structured’un documentXHTML avecun en-têteet un corpsreprésentésrespectivementparlesbalisesh head i et h body i . CommedansXHTML,l’en-tête h head i permetde spécifierdesinformationssur le documentsousforme d’élémentsde typemeta , maisil sertsurtoutà spécifierles paramètres«visuels» du documentmultimédiapar un élémentde type root-layout et à découperl’espaced’affichageen plusieursrégionsrectangulairespar desélémentsdetyperegion ) :g La fenêtreaunetaille de450x600pixelsspécifiéeparlesattributswidth etheight dansl’élément

detyperoot-layout .g Les dimensionsde la régionreg_img_grand sontde 400x300pixels et cetterégionestdécaléde 25 pointsvers la droite (left ) et de 25 pointsversle bas(top ). La valeurde l’attribut fitindiquequela taille du composantaffichédanscetterégiondoit êtreadaptéeà la taille dela régionsansdéformation,c’est-à-direenconservantle rapportlargeur/longueurducomposant.g La régionreg_img_petit a unetaille de 200x125pixels et estdéplacéede 125 pixels vers ladroiteet de75 pixelsversle bas.g La régionreg_texte a unetaille de350x325pixelset estdéplacéede50 pixelsversla droiteetde250pixelsversle bas.

Page 179: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 179

reg_img_grand

reg_img_petit

reg_texte

60

0 p

ixe

ls

450 pixels

Figure4.6: Placementdesrégionsdansle documentExSimple.smil

La figure4.6 illustre le placementdecesdifférentesrégionsdansle document.L’élémentde type body spécifieensuitele contenuproprementdit, c’est-à-direles différentscom-

posants,leurplacementdanslesrégionsd’affichageet leursynchronisationdansle temps.Lescomposantssontreprésentéspardesélémentsde«placement» de typeaudio , img et text . Cestypesd’élémentscorrespondentauxdifférentstypesdemédiasutilisésdansun documentmultimédia.SMIL définit entoutsepttypesdemédias(tableau4.4).

Média Utilisationtext composanttextuelimage imagestatiqueaudio composantsonorevideo séquencevidéotextstream texteà déroulementautomatiqueanimation composantanimationref composantd’un autretype

Table4.4: LesdifférentstypesdemédiaSMIL

Positionnementdescomposants

De mêmequ’uneimagedansun documentXHTML n’est pasinclusedansle documentmaisréférencéepar un élémentde type img , chaqueélémentde placementne contientpas le contenudu composant,maisdesréférencessousforme d’attributs src . Néanmoins,la comparaisons’arrêtelà: contrairementà un élémentde type img dansHTML, qui indiquepar sapositionmêmele placementde l’image dansle document,un élémentde placementdansSMIL spécifieexplicitementle placementpar uneréférenceversunerégiondéfiniedansl’en-têtedu document.Par exemple,l’image Vertigo.png estplacéeunepremièrefois dansla régionreg_img_grand et unedeuxièmefois dansla régionreg_img_petit .

Page 180: Comprendre XSLT

180 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Le texteTexteVertigo.txt estplacédansla régionreg_texte et le fichieraudioSound.wav n’apasdeplacementspatial(la version2.0proposela possibilitédecontrôlerle volumependantl’écouted’unfichier audiomaisnousn’avonspastrouvéd’indication sur la possibilitéde contrôlerle volumesur lesdifférentshaut-parleursdansunenvironnementmulti-phonique).

L’arbreDOM du contenu(élémentracine)du documentestdonnédansla figure4.7.

Elementseq

Elementpar

Attrid

page1

Attrendsync

first

Elementaudio

Attrhref

Sound.wav

Elementa

Attrhref#page2

Elementimg

Attrhref

Vertigo.png

Elementpar

Attrid

page2

Attrdur30s

Elementtext

Attrhref

Vertigo-Resume.txt

Elementimg

Attrhref

Vertigo.png

Figure4.7: ArbreDOM avecélémentsSMIL

Le positionnementtemporeldescomposantsdu documentestdécrit en utilisant unecombinaisondequatremodèlesdesynchronisationproposésparSMIL :

1. Synchronisationpar composition: deuxtypesd’élémentsde «synchronisation» permettentde re-grouperdifférentscomposantsenséquences(seq ) eten«groupesparallèles» (par ) qui setraduisentrespectivementparun affichageséquentielouparallèledescomposants.

Par exemple,le fichier ExSimple.smil définit deuxgroupesparallèles(élémentsde type par avecles identificateurspage1 et page2 ). Le premier groupe(page1 ) joue le son dansle fichierSound.wav et affiche en mêmetempsl’image Vertigo.png . Le groupepage2 affiche enmêmetempsl’image et le textedansle fichierTexteVertigo.txt .

La combinaisonrépétéed’élémentsdesynchronisationpermetdeconstituerdescomposantsmulti-médiadeplusenpluscomplexes: le sous-élémentseq définit uneséquencequi affiched’abordlegroupepage1 suivi du groupepage2 .

2. Synchronisationparévénementinterne: le déroulementtemporelde l’affichagededifférentscom-posantsestcontrôlépardesévénementsinternescommeparexemplele début ou la fin del’affichaged’un autrecomposant.Cetypedesynchronisationestimplantésousformedeplusieursattributsquipeuventêtreutilisésdanslesélémentsdeplacementet lesélémentsdesynchronisation.

Par exemple,l’attribut endsync dansle groupeparallèlepage1 du documentExSimple.smilsyn-chronisela fin de l’affichagedecegroupepar la fin desonpremiersous-élément(l’affichagede lapage1 dureaussilongtempsquele sondansle fichier Sound.wav ).

Page 181: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 181

3. Synchronisationparhorloge: unehorlogepermetdespécifierledébut, la fin etladuréedel’affichaged’un objet.Parexemple,la duréedela deuxièmepageestfixéeà 10 secondesparl’attribut dur .

4. Synchronisationpar l’utilisateur: l’utilisateur peutégalementintervenir dansle déroulementd’undocumentSMIL. Cetteinterventioncorrespondàl’activationd’un lien hypertexteversuncomposantdu mêmedocumentou d’une autreressourceWeb. CetteressourcepeutévidemmentêtreaussiundocumentSMIL.

Dansle documentExSimple.smil, l’élémentdetypea créeun lien entrel’imageaffichéeet le groupepage2 . En «cliquant» sur l’image, l’utilisateur peutpasserà la deuxièmepageavantla fin du sonstockédansle fichier Sound.wav .

La combinaisondecesquatremodèlesdesynchronisationpermetdespécifierdesdocumentsmultimé-dia trèscomplexes. Avantdecréerun documentSMIL, il estdoncconseillédespécifierun ou plusieursscénariosd’affichage.SSMIL n’estpeut-êtrepasle meilleurlangagepourfaireunetellespécification,nosquelquesexpériencesavecce langagenousont montréqueles élémentsde synchronisationseq et parfournissentunefaçonrelativementsimpleet déclarativedecréationdedocumentmultimédia.

Dansla suite,nousdonnonsun petit résumédela DTD SMIL et montronscommenton peutexploiterun ou plusieursdocumentsXML pourla créationdedocumentsSMIL.

4.3.2 DTD SMIL

L’élémentracined’un documentSMIL estdetypesmil etcontientuneen-têtedetypehead optionneletun corpsdetypebody égalementoptionnel:

<!ELEMENT smil (head?,body?)>

Voici le pluspetit documentmultimédiaSMIL :

<smil/>

Entête: Mise-en-page

L’entêtecontientzéroouplusieursélémentsh meta i etaumoinsunélémentdetypelayout oudetypeswitch :

<!ELEMENT head (meta*,((layout|switch), meta*))?>

Lesélémentsmeta sontdéfiniset utilisésde la mêmemanièrequeles élémentsdu mêmetype dansHTML.

Balise h layout i : Cettebalisepermetde faire la mise en pagede la présentationSMIL. La DTDSMIL n’estpastrèsexplicite surle contenuun élémentdecetype:

<!ELEMENT layout ANY>

On peutdire sanstrop s’aventurerqu’un élémentde type layout contientgénéralementun élémentdetype root-layout , qui permetdespécifierla miseenpageglobalede la fenêtredeprésentation,etun ou plusieursélémentsde type region . Touscesélémentssontvideset utilisent desattributs pourspécifierlespropriétésdela fenêtreet desdifférentesrégionqu’elle contient.

Parmicesattributs,ontrouvelesattributsheight , width etbackground-color qui sontrassem-blésparuneentitégénéralenomméviewport-attrs :

<!ENTITY % viewport-attrs "height CDATA #IMPLIEDwidth CDATA #IMPLIEDbackground-color CDATA #IMPLIED

">

Page 182: Comprendre XSLT

182 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Ainsi la balise h root-layout i estdéfiniede la manièresuivante(poursimplifier la présentationnousneprésentonsqu’unepartiedesattributsdéfinisdansla DTD SMIL) :

<!ELEMENT root-layout EMPTY><!ATTLIST root-layout %viewport-attrs; >

Par exemplel’élémentsuivantdéfinit d’unemanièreconformeà la DTD SMIL unefenêtredeprésen-tationde300x400pixels:

<root-layout width="300" height="400"/>

Lesélémentsh region i , qui sontégalementvides,permettentdedéfinir la dimensionet la positiondedifférentesrégionsdansla fenêtredeprésentation:

<!ELEMENT region EMPTY><!ATTLIST region

id ID #IMPLIED%viewport-attrs;left CDATA "0"top CDATA "0"z-index CDATA "0"fit (hidden|fill|meet|scroll|slice) "hidden"

>

On voit quechaquerégionpeutêtreidentifiéeparun attribut id , cequi serautile pourrelier plustardun ou plusieurscomposantsà unerégion.La dimensiond’unerégionestspécifiéeparlesmêmesattributsquela dimensiondela fenêtredeprésentation.La positiond’unerégionestcaractériséepartrois attributsqui correspondentauxtroisdimensionsd’affichage:

1. l’attribut left permetdespécifierle nombredepixelsentrela régionet le bordgauchedela fenêtre.Il peutégalementspécifierun décalageenpourcentagedela largeurdela fenêtre.

2. l’attribut top permetde spécifierle nombrede pixels entre la région et le bord supérieurde lafenêtre.Il estpossibleégalementdespécifierun décalageenpourcentagedela largeurdela fenêtre.

3. l’attribut z-index définit la «troisième» dimension. Quanddeuxobjetssontaffiché dansdeuxrégionsqui serecouvrent,il fautdéciderlequeldesdeuxobjetsseracomplètementvisible et lequelserapartiellementcouvertparl’autre. Ceconflit estrésoludela manièresuivante:g si les deux régionsont une valeur identiquepour l’attribut z-index , ce seral’objet dont

l’affichageaétédéclenchéle dernierqui aurala priorité. Quandlesdeuxobjetssontaffichésenmêmetemps,c’estle dernierdansl’ordre du documentSMIL qui seraaffichécomplètement.g sinonc’est la régionavecla valeursupérieurepour l’attribut z-index qui recouvreral’autrerégion.

Exemples:g La dimensiondela régionreg_texte1 estde300x50pixels,elleestdéplacéede50pixelsversladroiteet 120pixelsversle bas.

<region id="reg_texte1"width="200" height="50"left="50" top="120"z-index="1"/>g La régionreg_img_grand fait 300x400pixelset le contenuaffichéseraredimensionnésansdé-

formation.Cetterégionsetrouve«endessous» dela régionprécédente(z-index estégalà 0 pardéfaut).

<region id="reg_img_grand"width="300" height="400"fit="meet"/>

Page 183: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 183

Élément h body i : contenu

Le contenud’unepageSMIL estspécifiéparle contenudel’élément h body i .

<!ELEMENT body (audio|video|text|img|animation|text stream |ref|par|seq|a|switch)*>

La DTD définit le contenud’un documentparuneséquencedeonzetypesdefils différentsqui peuventêtreregroupésenquatregroupes:

1. les élémentsde positionnement: h audio i , h video i , h text i , h img i , h animation i ,h textstream i , h ref i ;

2. lesélémentsdesynchronisationh seq i et h par i ;

3. leslienshypertextes: h a i ;

4. lesélémentsdechoixdequalitédeserviceparrapportauxparamètressystèmeduréseauetduclient:h switch iVoici la définitionplusdétailléedecesdifférentséléments.

Élémentsde positionnement

Le rôle principal desélémentsde positionnementestde placerle contenudesdifférentscomposantsdudocumentdanslesdifférentesrégionsspécifiéesdansl’en-têteet dedécrireleur comportementpendantle«déroulement» du document.

Lesattributsdesélémentsdepositionnementssontdéfinisdansl’entité suivante:

<!ENTITY % mo-attributes "id ID #IMPLIEDregion IDREF #IMPLIEDsrc CDATA #IMPLIEDdur CDATA #IMPLIEDrepeat CDATA ’1’fill (remove|freeze) ’remove’begin CDATA #IMPLIEDend CDATA #IMPLIED

">

g src : spécifiela ressource(le contenu)à afficherdanscetélémentdeplacement(un ressourcepeutêtreaffichéeà différentesendroitenmêmetemps);g id : permetd’identifier l’élémentdepositionnement;g region : spécifiela régionoù le contenuseraaffiché;g repeat : le nombrederépétitionsde l’affichage(parexemplepourun fichier audio,qui peutêtrejouéenboucle);g fill : le modederemplissagedela régionquandl’affichagedela ressourceestterminée. La valeurpardéfautestremove , cequi signifiequela régioneffacele contenuet reprendsacouleurdefond.La valeur freeze indiqueque le contenuresteaffiché (par exemplela dernièreimagedansunevidéoou uneséquenced’imagesstatiques).g dur : la duréed’affichage;g begin : le début d’affichage;

Page 184: Comprendre XSLT

184 CHAPTER4. PRODUCTION DE DOCUMENTSXML

g end : la fin d’affichage.

Exemple71 g Le fichier texteAlien-Info.txt estaffichédansla régionreg_texte2 pendant5 secondes:

<text src="Alien-Info.txt" region="reg\_texte2" dur="5s"/>

g L’extrait videodu film estaffichédansla régionreg_video1 parun élémentdeplacementclipdetypevideo . La dernièreimageresterafigéesurl’écranaprèsla fin del’extrait :

<video id="clip" src="Alien-Clip.mov" region="reg\_video1" fill="freeze"/>

g Le résumédu film seraaffiché dansla region reg_texte3 au début de la vidéo présentéeparl’élémentdeplacementavecl’identificateurclip :

<text src="Alien-Resume.txt" region="reg\_texte3" begin="id(clip)(begin)"/>

L’affichagedescomposantsqui correspondentàunmédiacontinu(audio,animation,textstream,vidéo)peutêtrecontrôlépardeuxattributssupplémentairesqui permettentdechoisirunintervalledansle contenudu composantà afficher:

<!ENTITY % clip-attrs "clip-begin CDATA #IMPLIEDclip-end CDATA #IMPLIED

">

Exemple72 L’extrait affichédu clip Alien-Clip.mov commence5 secondesaprèsle début :

<video src="Alien-Clip.mov" region="reg\_video1" clip-begin="5s"fill="freeze"/>

On peutégalementobserverquel’attribut fill estégalà freeze , cequi signifiequela dernièreimagedu clip resteraaffichéeaprèsla fin.

Élémentsde synchronisation

Lesbalisesh par i et h seq i ont le mêmemodèledecontenuquel’élément h body i , maispermettentl’utilisation d’attributssupplémentairespourla synchronisation:

<!ATTLIST par id ID #IMPLIEDendsync CDATA "last"dur CDATA #IMPLIEDrepeat CDATA "1"region IDREF #IMPLIEDbegin CDATA #IMPLIEDend CDATA #IMPLIED

>

La significationdecesattributsestla suivante:g endsync : cetattribut peutprendrecommevaleurleschaînesfirst et last ou un identificateurd’unélémentfils dugroupecequi indiquerespectivementquelegroupesetermineàla fin dupremierfils, dudernierou decelui référencé.Celacorrespondà unesynchronisationparévénement.g dur : spécifiela duréedugroupeentempsréel(enheures,minuteset/ousecondes).Celacorrespondàunesynchronisationparhorloge;g repeat : indiquecombiendefois le groupedoit êtreaffiché(boucle);

Page 185: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 185

g region : indiquela régiond’affichage;

g begin et ends : indiquele début et la fin de l’affichage. Cesvaleurspeuvent être indiquéesenduréeréelle par rapportau début du parent(synchronisationpar horloge)ou par une expressionid(ref)(begin) ou id(ref)(end) où ref correspondà un autreélémentdu contenu(syn-chronisationparévénement).

Exemple73 Le groupeparallèlededeuxélémentsh audio i et h img i setermineà la fin del’affichagedu premierélément(l’imageseraaffichéepourla duréedel’extrait sonoredansSound.wav ) :

<par endsync="first"><audio src="Sound.wav"/><img src="Alien.png" region="reg_img_grand"/>

</par>

Elementpar

Attrendsync

first

Elementaudio

Attrsrc

Sound.wav

Elementimg

Attrsrc

Alien.png

Attrregion

reg_img_grand

Figure4.8: ArbreDOM avecélémentsSMIL

Exemple74 Voici un exempleun peupluscompliqué:

<seq><par endsync="first">

<audio src="Sound.wav"/><a href="#page2">

<img src="Vertigo.png" region="reg_img_grand"/></a>

</par><par id="page2">

<text src="Vertigo-Title.txt" region="reg_texte1" fill="freeze"/><text src="Vertigo-Info.txt" region="reg_texte2"/><text src="Vertigo-Resume.txt" region="reg_texte3" begin="2s"/><seq>

<img src="IMG/Vertigo1.png" region="reg_img_petit" dur="5s"/><img src="IMG/Vertigo2.png" region="reg_img_petit" dur="5s"/>

</seq></par>

</seq>

Page 186: Comprendre XSLT

186 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Elementseq

Elementpar

Attrendsync

first

Elementaudio

Elementa

Attrhref#page2

Elementimg

Elementpar

Attrid

page2

Elementtext

Elementtext

Elementtext

Elementseq

Elementimg

Elementimg

Figure4.9: ArbreDOM avecélémentsSMIL

Cetextrait définit uneséquencededeuxgroupesparallèles.Le premiergroupeaffiche– pourla duréedusonsdansle fichier Sound.wav l’imageVertigo.png , tandisquele deuxièmeaffichetroisfichiersdetexteenmêmetempsqu’uneséquenced’images.

Lafigure4.10montretroiscopiesd’écrandansl’ordrechronologiquedudéroulementdecetteséquence.Onpeutremarquerquele titre Vertigo-Title.txt estrestéaffichéà la fin àcausedel’attribut fillqui estégalà freeze danssonélémentdeplacement.

Figure4.10:Déroulementd’uneséquenceSMIL

Paramètresd’envir onnement: h switch iLa balise h switch i permetdeprendreencomptelesparamètresduréseauet du clientd’affichage.

Exemple75 Parexemple,l’élément h switch i suivantprendencomptela taille del’écranpourchoisirentretroisversionsà différentesrésolutionsd’unemêmeimage;

Page 187: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 187

<switch><par system-screen-size="640x480">

<img src="img_faible.gif" region="reg_img" /></par><par system-screen-size="800x600">

<img src="img_moyen.gif" region="reg_img" /></par><par system-screen-size="1024x768">

<img src="img_haut.gif" region="reg_img" /></par><text src="sorry.txt" region="reg_text_msg" />

</switch>

Si aucunparamètrepeutêtresatisfait, le textesorry.txt seraaffiché.

SMIL fournit unemultituded’autresmécanismespour la créationde documentsmultimédia. Il estpossibledecréeretdesélectionnerdessous-régionset intervallestemporelssur/pendantlesquelsdesliensversd’autresressourcessontactifs.Onpeutégalementdéfinirdifférentslienssurdifférentesrégionsd’uneimage,ou desliensqui sontaccessiblesseulementpendantun certaintemps.

4.3.3 Générationde présentationsSMIL

Commenousl’avonsdéjàsouligné,l’intérêt du coupleXML/XSLT estla possibilitédepublier le contenudansun documentXML sousdifférentesformes.PourquoipascréeralorsuneprésentationSMIL à partirdu contenud’un documentXML.

À priori cettetâchesemblesimilaireà la générationdepagesHTML décritedansla section4.2. Si ony regardedeplusprès,on remarquequelquesdifférencesimportantesentreSMIL et HTML :g Un SMIL estnecontientpaslesdonnéesaffichéesà l’écran,maissertcommecadredeprésentation

pourdesdonnéesqui setrouventdansd’autresressources.Danscesens,il estpréférabled’utiliserle termeprésentationSMIL à la placededocument. Un documentXML n’estalorspassimplementtransforméen un autredocumentconformeà la DTD SMIL, maisdoit fournir les composantsquiserontaffichésparla présentationSMIL.g UneprésentationSMIL inclut généralementdescomposantsqui nesontpasdansun formatXML etle documentXML necorrespondgénéralementqu’à unepartiedescomposantsdela présentation.

Pour illustrer cesdifférentsaspects,nousallonsmontrercommenton peutgénéreruneprésentationSMIL à partir desdocumentsXML sur lesfilms projetésparle cinémaL’ÉpéedeBois. Un documentsurle film Sleepy Hollow estle fichier76;

Exemple76 SleepyHollow.xml: Fichier XML pour le film SleepyHollow

<?xml version="1.0" encoding="ISO-8859-1"?><FILM FILMID=’3’>

<TITRE>Sleepy Hollow</TITRE><AUTEUR>Tim Burton</AUTEUR><ANNEE>1999</ANNEE><GENRE>Fantastique</GENRE><PAYS>Etats Unis</PAYS><RESUME>

Nouvelle Angleterre, 1799. A Sleepy Hollow, plusieurs cadavressont retrouvés décapités. La rumeur attribue ces meurtres à uncavalier lui-même sans tête. Mais le fin limier new-yorkaisIchabod Crane ne croit pas en ses aberrations. Tombé sous lecharme de la vénéneuse Katrina, il mène son enquête au coeur

Page 188: Comprendre XSLT

188 CHAPTER4. PRODUCTION DE DOCUMENTSXML

des sortilèges de Sleepy Hollow..</RESUME>

</FILM>

Voici la présentationSMIL quenousvoudrionscréer:

Exemple77 SleepyHollow.smil: Fichier SMIL pour la présentationdu film SleepyHollow

<?xml version="1.0" encoding="utf-8"?><smil>

<head><meta name="title" content="Presentation SMIL du film Sleepy HÃc

kllow"/>

<meta name="author" content="(c) 2001 Sallesenligne.com"/><layout>

<root-layout width="300" height="400"/><region id="reg_img_grand" width="300" height="400" fit="meet"/><region id="reg_img_petit" width="150" left="80" height="100" top="10"/><region id="reg_texte1" width="200" left="50" height="50" top="120" fit="meet"/><region id="reg_texte2" width="200" left="50" height="50" top="180"/><region id="reg_texte3" width="250" left="25" height="150" top="240"/>

</layout></head><body>

<par><text src="Sleepy-Title.txt" region="reg_texte1" fill="freeze"/><text src="Sleepy-Info.txt" region="reg_texte2"/><text src="Sleepy-Resume.txt" region="reg_texte3" begin="2s"/><seq>

<img src="IMG/mmedia_photo.png" region="reg_img_petit" dur="5s"/><img src="IMG/2_1tn.png" region="reg_img_petit" dur="5s"/><img src="IMG/2_2tn.png" region="reg_img_petit" dur="5s"/><img src="IMG/2_3tn.png" region="reg_img_petit" dur="5s"/>

</seq></par>

</body></smil>

Cetteprésentationcontienttrois composantsdetypeText :

g Sleepy-Title.txt contientle tire du film ;

g Sleepy-Info.txtcontientl’auteur, l’année,le genreet le pays;

g Sleepy-Resume.txt contientle résumédu film.

Cestroiscontenustextuelssontaffichésdanstroisrégionsdifférentesenmêmetempsqu’uneséquencedequatreimages.Avantdevoir commentcedocumentet touscescomposantsont étégénérés,regardonsdeplusprèsle contenudechaquefichier texte.

Voici le fichier qui contientle titre du film :

Exemple78 Sleepy-Title.txt : Fichier avecle titre du film

<window type="marquee" height="50" width="200" bgcolor="black"><font size="50" face="Garamond" color="red">Sleepy Hollow</font>

</window>

Ce fichier ne contientpasuniquementle titre, maisest lui-mêmeun fichier XML. Le format utilisédanscefichier s’appelleRealText etestproposéparla sociétéRealNetworks.

Page 189: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 189

Remarque: SMIL nespécifiepasle formatdu contenutextuel desfichierset le formatRealText estunformatspécifiquementdéfinipourunegammedeproduitsd’unesociété.

CommHTML, les fichiersRealText permettentde spécifierla présentationdu texte en utilisant desbalises.Parmi lesbaliseslesplusimportantes,nouspouvonsciter:g h window i : cettebalisepermet,entreautre,despécifierle typed’affichageutilisé(attribut type ),

les dimensionsde la fenêtrede texte (la taille de cettefenêtredoit être inférieureou égaleà auxdimensionsdela régionSMIL danslaquelleelle estaffiché),la couleurdu fondetdesliens,etc...g h font i : permetdespécifierdescaractéristiquesdela policeutiliséepourle textequ’ellecontient(couleur, taille, etc.).g h a i : permetdecréerdesliensversd’autresressources,commel’élémentdumêmetypeenHTML.

D’autresbalises,reprisesde la DTD XHTML, comme h center i , h br i et h p i permettentdemettreenpagele texte.

Lesbalisesdansle fichier78spécifientquele titre dufilm estaffichédansunefenêtrede200x50pixels,le texteestaffichécentré,enrougeavecunepoliceGaramond et unetaille de50 pixels.

Le titre estaffichédansunefenêtredetypemarquee , cequi signifiequele texte sedéroulehorizon-talementdedroiteà gauche.RealText distingueentrecinq typed’affichaged’un texte:

g generic: affichagegénériquesansparamètresprédéfinis;g marquee: le texte sedéroulehorizontalement(de droite à gauchepar défaut) et estpositionnéaumilieu dela fenêtre;g tickertape: le textesedérouleverticalement(dedroiteàgauchepardéfaut)etestpositionnéenhautouenbasdela fenêtre;g scrollingnews: le textesedérouleverticalement(du basversle hautpardéfaut);g teleprompter: le texteestaffichécommedansl’affichagegénériquemaisle nouveautexte«pousse»l’ancienversle haut.

Voici le fichier RealText pourl’affichagedesinformationssurle film :

Exemple79 Sleepy-Info.txt: Informationsur le film Vertigo

<window type="marquee" height="50" width="200" bgcolor="black" link="blue"><font color="white">

de Tim Burton, Fantastique, Etats Unis, 1999, <a href="http://www.sallesenligne.com/fil ms/Sle epyHol low.xm l">Sle epy Hol-low</a>

</font></window>

Lesinformationssedéroulentégalementdedroiteàgauche.Il contientégalementunlienverslefichierSleepy-Hollow.xml (onauraitpu évidementchoisirn’importequelURL commecibledecelien).

Le résumésedérouleverticalement(scrollingnews) dansunefenêtrede250x100pixelsenjaunesurunfondnoir :

Exemple80 Vertigo-Resume.txt: Résumédufilm Vertigo

<window type="scrollingnews" height="100" width="250" bgcolor="black"><font color="yellow">

Page 190: Comprendre XSLT

190 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Scottie Ferguson, ancien inspecteur de police, est sujet auvertige depuis qu’il a vu mourir son collègue. Elster, son ami,le charge de surveiller sa femme, Madeleine, ayant destendances suicidaires. Amoureux de la jeune femme Scottie neremarque pas le piège qui se trame autour de lui et dont il vaêtre la victime...

</font></window>

Figure4.11:Copied’écrandela présentationSleepyHollow.smil

Générationde composantsRealText

La générationde cesdifférentscomposantsRealText n’a plus de secretpour les programmeursXSLTexpérimentésquenoussommesmaintenant.

Voici la premièrerèglepourla générationdu fichier Sleepy-Title.txt ;

<xsl:template match="FILM"><window type="marquee" height="50" width="200" bgcolor="black">

<font size="50" face="Garamond" color="red"><xsl:value-of select="TITRE"/>

</font>

Page 191: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 191

</window></xsl:template>

Cetrègle,qui s’appliqueauxélémentsdetypeFILM , créelesbalisesRealTime pourle formattagedutexte et insèrele titre du film. Il suffit decréerunefeuille destylecomplèteaveccetterègleet le résultatdela transformationXSLT pourraêtremisdansle fichier Sleepy-Title.txt.

La règlesuivanteaffichelesinformationssurle film :

<xsl:template match="FILM"><window type="marquee" height="50" width="200" bgcolor="black" link="blue">

<font color="white">de <xsl:value-of select="AUTEUR"/>,<xsl:value-of select="GENRE"/>,<xsl:value-of select="PAYS"/>,<xsl:value-of select="ANNEE"/>

</font></window>

</xsl:template>

Cetterègleestcorrectemaisnegénèrepasexactementle contenudu fichier Sleepy-Info.xmlplushaut.Voici le textequ’ellegénère:

<window type="marquee" height="50" width="200" bgcolor="black" link="blue"><font color="white">

de Tim Burton,Fantastique,Etats Unis,1999

</font></window>

Au lieu d’écriretouteslesinformationsdansuneseuleligne,chaque«champ» commenceparunenouvelleligne. Nousavonsvu quececin’estpasgénantdansl’affichaged’unepageHTML parun navigateurquiremplacetouslesespacesparunseulcaractère.RealPlayernefait pasla mêmechose: pendantl’affichagedecetexte lesdifférentschampsserontséparéspardesespacespluslongsqu’unseulcaractère,cequi n’estpasun résultatsouhaitable.Il existedeuxsolutionsà ceproblème:

1. La premièreestd’écrirela règledela manièresuivante:

<xsl:template match="FILM"><window type="marquee" height="50" width="200" bgcolor="black" link="blue">

<font color="white">de <xsl:value-of select="AUTEUR"/>, <xsl:value-of select="GENRE"/>,<xsl:value-of select="PAYS"/>, <xsl:value-of select="ANNEE"/>

</font></window>

</xsl:template>

Onaréduit lesespacesblancsenfaveurdela lisibilité du programmeXSLT.

2. La deuxièmeestd’exploiter le fait queXSLT supprimetouslesnoeudsdetypeText qui necontien-nentqu’un espaceblanc.Ainsi, enséparantlesvirgulesaprèschaquechampsdel’espaceblancquisuit,cesespacesserontsupprimés.Pourcela,on utilise l’instructionxsl:text :

<xsl:template match="FILM"><window type="marquee" height="50" width="200" bgcolor="black" link="blue">

Page 192: Comprendre XSLT

192 CHAPTER4. PRODUCTION DE DOCUMENTSXML

<font color="white">de <xsl:value-of select="AUTEUR"/><xsl:text>, </xsl:text><xsl:value-of select="GENRE"/><xsl:text>, </xsl:text><xsl:value-of select="PAYS"/><xsl:text>, </xsl:text><xsl:value-of select="ANNEE"/><xsl:text>, </xsl:text>

</font></window>

</xsl:template>

Maintenantlesespacesqui setrouvententrelesélémentsh xsl:text i et h xsl:value i serontsuppriméspendantlasérialisationdel’arbrerésultat.Nousallonsdétaillerl’instruction h xsl:text idansla section4.4.2.

Finalement,la dernièrerègleestla suivante:

<xsl:template match="FILM"><window type="scrollingnews" height="100" width="250" bgcolor="black">

<font color="yellow"><xsl:value-of select="RESUME"/>

</font></window>

</xsl:template>

En prenantencomptetouteslesremarquesprécédentes,on peutsupposerquecetterègleestcorrecte.Le seulproblèmeestquele résumécontientdescaractèreslatinsutilisantle codageISO-8859-1 et quele textegénérécontientégalementcecodage.Pourpasavoir descaractèresillisibles noussommesobligésdedéfinir le codageenutilisantl’instructionxsl:output :

<xsl:output method="xml" encoding="ISO-8859-1" />

Éclatementd’un documentXML

BienquenousayonssupposéquechaquefichierRealText estgénéréparunprogrammeXSLT différent,onpeutdéfinir égalementunseulprogrammeavecdesparamètresqui permettentdechoisir la transformationsouhaitée.Néanmoins,on estobligé de faire pour chaquefichier unedemandede transformation,car laversion1.0deXSLT nepermetdeproduirequ’unseuldocumentpartransformation.

Cecin’estpasunproblèmedansunenvironnementoùonpeutcréerdesscriptsouprogrammessimplespour automatiserce processus,maisça le devient rapidement.La version1.1 de XSLT et la plupartdesprocesseursXSLT actuels(qui sontconformesàla version1.0)proposentdesextensionspourpouvoir créerplusieursdocumentsparuneseuledemandedetransformation.Cetteextensions’appellexsl:document(page266),saxon:output dansle processeurSaxonet xalan:rewrite dansle processeurXalan.

Ainsi il estpossiblededéfinirdesrèglesdontrésultatn’estpasinclusdansl’arbre(et le document)pro-duit parla feuille destylemaisstockédansdesfichiersdifférents.Voici unexemplebasésurle processeurXSLT Saxon.La règlecréedeuxfichiersRealText {$prefix}Titre.txt et {$prefix}Info.txtoù $prefix estun paramètrederègle:

<xsl:template name="genTitreInfo"><xsl:param name="prefix" value="unknown.txt"/>

<saxon:output file="{$prefix}Titre.txt" omit-xml-declaration="yes" ><window type="marquee" height="50" width="200" bgcolor="black">

<font size="50" face="Garamond" color="red"><xsl:value-of select="TITRE"/>

</font></window>

</saxon:output><saxon:output file="{$prefix}Info.txt" omit-xml-declaration="yes" >

Page 193: Comprendre XSLT

4.3. PRÉSENTATIONSMULTIMÉDIA: SMIL 193

<window type="marquee" height="50" width="200"bgcolor="black" link="blue" indent="no">

<font color="white">de <xsl:value-of select="AUTEUR"/><xsl:text>, </xsl:text><xsl:value-of select="GENRE"/><xsl:text>, </xsl:text><xsl:value-of select="PAYS"/><xsl:text>, </xsl:text><xsl:value-of select="ANNEE"/><xsl:text>, </xsl:text>

</font></window>

</saxon:output></xsl:template>

Lesattributsdel’instructionsaxon:output sontessentiellementlesmêmesquelesattributsdel’élémentdu premierniveauxsl:output .

Générationdu fichier SMIL

Aprèsavoir générélesdifférentscomposantsRealText à partir du contenudu documentXML Sleepy-Hollow.xml , nousvoulonsmaintenantcréer le fichier SMIL final qui est composéde quatreautrescomposantsimagesqui n’ont pasde relation directeavec le documentXML déjà transformé. Afin depouvoir utiliser le mêmeprogrammepour la transformationd’autresfichiersXML sur les films, il n’estpaspossibledespécifiercesressourcesimagesexplicitementdansle programmessousformed’élémentslittéraux.

Unemeilleuresolutionestde définir un documentXML qui contientles paramètresmanquantspourla générationdela présentationfinale. Voici un exempled’un tel documentde«paramètres» qui indiquepourchaquefilm lesressourcesdisponibles:

Exemple81 ParamsSMIL.xml: Paramètrespour la générationdela présentation

<?xml version="1.0" encoding="ISO-8859-1"?><SMILPARAMS>

<PARAMFILMREF="1" PREFIX="Vertigo-" RESOURCE="Vertigo.xml"><PHOTOS>

<PHOTOHREF="IMG/Vertigo1.png"/><PHOTOHREF="IMG/Vertigo2.png"/>

</PHOTOS></PARAM><PARAMFILMREF="2" PREFIX="Alien-" RESOURCE="Alien.xml" /><PARAMFILMREF="3" PREFIX="Sleepy-"

RESOURCE="http://www.sallesenligne.com/fil ms/Sle epyHol low.xm l"><PHOTOS>

<PHOTOHREF="IMG/mmedia_photo.png"/><PHOTOHREF="IMG/2_1tn.png"/><PHOTOHREF="IMG/2_2tn.png"/><PHOTOHREF="IMG/2_3tn.png"/>

</PHOTOS></PARAM>

</SMILPARAMS>

Le film Sleepy Hollow correspondau troisièmefilm (FILMREF=3) et donnepour ce film un préfixepourlesnomsdefichiersRealText qui serontgénérésparlesrèglesprécédent,uneURL pouruneressourceWeb à référencerdansla présentation(lien dansle fichier Sleepy-Info.txt) et quatreURL pour récupérerdesphotossurle film. Voici le programmeXSL pourla générationdu documentSMIL :

Exemple82 GenSMIL.xsl: Feuilledestylepour la générationdu documentSMIL

Page 194: Comprendre XSLT

194 CHAPTER4. PRODUCTION DE DOCUMENTSXML

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL /Trans form">

<xsl:strip-space elements="*"/>

<xsl:output method="xml" indent="yes" media-type="text/smil"/>

<xsl:template match="/"><smil>

<head><meta name="title" content="Presentation SMIL du film {FILM/TITRE}"/><meta name="author" content="(c) 2001 Sallesenligne.com" /><layout>

<root-layout width="300" height="400" /><region id="reg_img_grand"width="300" height="400" fit="meet" /><region id="reg_img_petit"

width="150" left="80" height="100" top="10" /><region id="reg_texte1"

width="200" left="50" height="50" top="120" fit="meet"/><region id="reg_texte2"

width="200" left="50" height="50" top="180" /><region id="reg_texte3"

width="250" left="25" height="150" top="240" /></layout>

</head><body>

<xsl:apply-templates select="FILM"/></body>

</smil></xsl:template>

<xsl:template match="FILM"><xsl:variable name="filmid" select="@FILMID" /><xsl:variable name="filmparams">

<xsl:copy-of select="document(’ParamsSMIL.xml’)/SMILP ARAMS/PARAM[@FILMREF=$fi lmid]" /></xsl:variable><par>

<text src="{$filmparams/PARAM/@PREFIX}Title.tx t" region="reg_texte1" fill="freeze"/><text src="{$filmparams/PARAM/@PREFIX}Info.txt " region="reg_texte2" /><text src="{$filmparams/PARAM/@PREFIX}Resume.t xt" region="reg_texte3" begin="2s"/><seq>

<xsl:apply-templates select="$filmparams/PARAM/PHOTOS/PHOTO"/></seq>

</par></xsl:template>

<xsl:template match="PHOTO"><img src="{@HREF}" region="reg_img_petit" dur="5s" />

</xsl:template></xsl:stylesheet>g La règle <xsl:template match="/"> génèrel’entête du documentet appliqueensuitela

transformationpourl’élément h FILM i .g Larègle<xsl:template match="FILM"> définitunevariable$filmid quicontientl’identificateurdufilm etquiestutiliséedansuneexpressionXPathcommevaleurdesélectionpourtrouverl’élémentdetypePARAMdansle documentParamsSMI.xmlcorrespondantaufilm. Unecopiedecetélément

Page 195: Comprendre XSLT

4.4. TRAITEMENT DE TEXTE DANS XSLT 195

estensuitepasséecommevaleuràunedeuxièmevariable$filmparams . CettevariableestensuiteutiliséecommeracinedansplusieursexpressionsXPathpourextrairelesparamètrescorrespondant.Le résultatde cetterègle correspondexactementau contenude l’élément de type body danslefichierSleepyHollow.smil.

Le fichier ParamsSMIL.xmlillustre bien l’utilisation de XML comme«format universel» pour lareprésentationet l’intégration de données: à partir de ressourcesXML et non-XML on définit un doc-umentXML deréférencequi relienttoutescesressources.Cefichierpeutensuiteêtreutilisédedifférentesmanièrespourcréerdesnouvellesressourcescommeparexempleun documentSMIL.

Dansle jargonde recommandationXLink du W3C, cesréférencesentreles ressourcessontappeléesdesliensexterneparoppositionaux liens internesqui sontdéfinisdansle contenudesressourcesmême:le Webactuelestbasésurle deuxièmetypedeliensimplantéparlesélémentsh a i deXHTML.

4.4 Traitement de texte dansXSLT

Nousallonsprésenterplusendétail lesélémentsdepremierniveauet lesinstructionsXSLT pourle traite-mentdesnoeudsdetypeTextequi apparaissentdansle documentà transformer, maiségalementdanslesprogrammesXSLT. Le termetraitementcomprendplusieursfonctionsqui interviennentpendantla trans-formationd’un documentet qui sontillustréesdansla figure3.1(page110duchapitre3) :g analysedu documentsourceet du programmeXSLT par le parseurXML : cettephasea étédécrite

dansla section2.3;g générationde l’arbre XPathdu documentsource: nousavonsvu page81 queXPathet doncXSLTconnaîtseulementun sous-ensembledestypesDOM et quelesnoeudsdetypeCDataSectionsonttoustransformésennoeudsdetypeText ;g suppressionéventuellede noeudsde texte «blancs»: l’arbre XPath du documentsourcecontientgénéralementun grandnombrede noeudsde type Text qui ont commevaleurun espaces(un ex-emplea étéétudiédansla section2.3). La plupartde cesespacessontnon-significatifset serventuniquementpour le formattagedu documentsérialisé. Mais ce qui estplus importantestquecesespacesne sontpastoujoursneutrespar rapportau format du documentà produire. Par exemplenousavonsvu quepour la productiond’un documentHTML, on peutsouvent ignorerla présenced’espacesdansle documentsource. Par contre,dansd’autrescas,ils sontun effet indésirableetdoiventêtresupprimés.

XSL permetde contrôlerle traitementd’espacesdansle documentsourcepar deux élémentsdepremierniveau,xsl:desc-preserve etxsl:desc-strip , qui serontdécritsplusloin.g transformationdu document: la phasede transformationde l’arbre XPath permetuniquementdecréerdesnoeudsdetypeText enmélangeantdesnoeudsdetypeText :

– obtenuscommerésultatd’uneexpressionXSLT ;

– contenuxdansle corpsdesrèglesXSLT ;g sérialisationdudocument: aprèsla transformationonobtientunarbreXPathqui estensuitesérialisépour obtenir un documentXML qui peut être stockédansun fichier ou échangéavec une autreapplication.Cettephasedesérialisationpeutêtrecontrôlepar l’élémentxsl:output décritplusloin.

4.4.1 xsl:preserve-space et xsl:strip-space

Cesdeux élémentsXSLT de premierniveaupermettentde contrôlerla suppressiondesespacesblancsdansle documentsourceavant de commencerla transformation. Le niveaude contrôleest le type del’élémentqui contientle noeudd’espace: il estpossiblededéciderpour touslesélémentsd’un types’ilfaut supprimer(xsl:strip-space ) ou préserver (xsl:preserve-space ) les fils d’espace.Les

Page 196: Comprendre XSLT

196 CHAPTER4. PRODUCTION DE DOCUMENTSXML

typesd’élémentssontspécifiéssousforme d’une liste de nomsde balisesou en utilisant le symbole’*’pourtouslestypesd’élément.

Parexemple,l’expression

<xsl:strip-space name="A C"/>

signifiequetouslesfils espacesd’élémentsdetypeA et B doiventêtresupprimés,tandisquel’expressionsuivantechoisit lesfils detousleséléments:

<xsl:strip-space name="*"/>

Voici un documentXML avec desespaces(cesespacessontuniquementcomposésde séquencesducaractère« » renduvisibleparle symbole«_») :

<A>_<B>__<C>_<D>__</D><D>a_</D>_b_< /C></B >_c</ A>

L’arbre XPath estmontrédansla figure 4.12. Les noeudssuppriméspar la premièreexpressionsontmis en évidenceparun fond gris, tandisqueles élémentssupprimésen plus par la deuxièmeexpressionsontrayés.

ElementA

Text-

#x20

ElementB

Text-

#x20#x20

ElementC

Text-

#x20

ElementD

Text-

#x20#x20

ElementD

Text-

a #x20

Text-

#x20b #x20

Text-

#x20c

Figure4.12:ArbreXPath

Onvoit queseulementlesnoeudsqui necontiennentquedescaractèresblancssontsupprimés.L’élémentxsl:preserve-space a l’effet inversedel’élémentxsl:strip-space , c’est-à-dire

quelesfils d’espaceblancsontpréservés.Ainsi il estpossibledespécifierquele fils detouslesélémentssauflesélémentsh Di doiventêtresupprimés:

<xsl:strip-space name="*"/><xsl:preserve-space name="D"/>

Lesconflitspossiblesqui peuventêtrecréésparuneutilisationsimultanéedecesdeuxélémentssontrésolusdela mêmemanièrequelesconflitsderèglesXSLT (chapitre3).

Page 197: Comprendre XSLT

4.5. RSSET RDF 197

Attrib ut xml:space

Lesdeuxélémentsdeniveauprécédentpermettentun contrôledu traitementdesespacesblancauniveaudu type d’élément. Un contrôleplus fin estpossibledansle contenumêmedu documentà transformer.ChaqueélémentXML peutavoir un attribut prédéfinixml:space qui décidesi les fils d’espaceblancdoiventêtresupprimésou pas.Nousavonsdéjàillustré l’utilisation decetattribut dansla balise h pre idela DTD XHTML.

L’attribut xml:space peutprendredeuxvaleurs: default ou preserve . La premièrevaleurin-diquequec’estl’application– dansnotrecasle programmeXSLT – qui doit décider. La valeurpreservenesignifiepasseulementquelesfils d’espacesblancdel’élémentmaisquetouslesdescendantsd’espaceblancdoiventêtrepréservésjusqu’àl’indication contraireparla valeurdefault .

En résumé,le processusdedécisiond’unesuppresiondesespacesestle suivant. Un élémentpeutêtresupprimés’il estsélectionnéparuneexpressionxsl:strip-space (aprèsrésolutiondesconflits)et sil’une desdeuxcontraintessuivantesestsatisfaite:g il n’a pasd’élémentancêtreavecun attribut xml:space oug l’élémentancêtreavecunattribut xml:space leplusprèsacommevaleurpourcetattribut la valeur

default .

Exemple83 Voici un documentXML :

<A xml:space="preserve"><B xml:space="default">

<C> </C></B><B>

<C> </C></B>

</A>

et uneexpressionxsl:strip-space :

<xsl:strip-space elements="B C">

Cetteexpressiondemandela suppressiondetouslesfils detypeB etdetypeC. L’attribut xml:space del’élémentA indiquequelesfils d’espaceblancsdoiventêtrepréservéspourtouslesélémentsdescendantsde cet élément. Cettecontrainteest à son tour effacéepour le premierélémentde type B et tous cesdescendants.Ainsi, le documentprécédentpeutêtreconsidérécommeéquivalentaudocumentsuivant:

<A><B><C/></B><B>

<C> </C></B>

</A>

4.4.2 Générationde texte: xsl:text

TODO

4.4.3 Sérialisationdu résultat : xsl:output

TODO

4.5 RSSet RDF

Vadansle chapitre«Échangeet Integration»: c’està çaqueçasert...;

Page 198: Comprendre XSLT

198 CHAPTER4. PRODUCTION DE DOCUMENTSXML

Page 199: Comprendre XSLT

Chapter 5

Production dedocumentspapier

Sommaire

199

Page 200: Comprendre XSLT

200 CHAPTER5. PRODUCTION DE DOCUMENTSPAPIER

Page 201: Comprendre XSLT

Chapter 6

Échangeet intégration

Sommaire

201

Page 202: Comprendre XSLT

202 CHAPTER6. ÉCHANGEET INTÉGRATION

Page 203: Comprendre XSLT

Chapter 7

Publication debasesdedonnées

Sommaire

7.1 Basesde donnéeset XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204

7.1.1 QuelquesrappelssurlesBD relationnelles . . . . . . . . . . . . . . . . . . . . 204

7.1.2 Documentsorientés«texte» et documentsorientés«données» . . . . . . . . . 207

7.1.3 Transformationd’unebasededonnéesenXML . . . . . . . . . . . . . . . . . 209

7.1.4 Créationdela DTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215

7.2 Ar chitectures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218

7.2.1 UneclasseJava d’exportationXML . . . . . . . . . . . . . . . . . . . . . . . . 218

7.2.2 ArchitectureServlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

7.2.3 Utilisation desJavaServerPages . . . . . . . . . . . . . . . . . . . . . . . . . 225

7.3 XML dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

7.3.1 XSP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230

7.3.2 XSQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

7.4 Perspectives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

Cechapitreestconsacréà la publicationdedocumentsincluantdesinformationsissuesd’unebasededonnées.Dansle domainedessitesweb,il estdésormaisclassiquedeconstruirelespagesen intégrantàdutextefixedesdonnéesextraitesdynamiquementdela base(la majoritédessiteswebprofessionnelssontd’aileursgérésdecettemanière).Leslangageslesplusutilisésdanscetyped’applicationsontASP, PHPou lesJavaServerPages(JSP).Tousconsistentàplacerdansdu HTML desinstructionsqui seconnectentà la base,effectuentdesrequêtesetmettentenformentle résultatà l’aide debalisesHTML.

La justification d’une gestiondesdonnéesséparéede leur affichagedansune pageweb est claire:HTML n’estpasunlangagepermettantla modélisation,le stockageetl’interrogationdedonnées,etunein-formationplacée«endur» dansunepageHTML nepeutêtrerécupéréepourunusageautrequel’affichagedansun navigateur.

Est-ceencorevrai dansle casde XML ? Ce chapitreva essayerde répondreà cettequestionou dumoinsde fournir desélémentsd’appréciation.Nouscommençonspar partir du postulatque la majeurepartiedesinformationsrestentà l’heureactuellestockéesdansdesbasesdedonnées,etqu’ellesdoiventenêtreextraitesauformatXML soit pourpubliertout ou partiedela base,soit pourintégrerdesfragmentsàd’autrestypesdecontenus.

La premièrequestionposéeest alors d’engendrerune représentationXML d’une basede donnéesrelationnelle.La secondeest relative aux architectureslogiciellesqui permettentde combinerdescom-posantsaussidiversqu’unebasede données,un modulede conversionversXML, un processeurXSLTet un serveur de publicationweb. Nousdécrivonsune(petite)classeJava effectuantdesconversionsetmontronscommel’intégrer dansplusieursarchitectures: programmebatch, servlet, et JSP. Nousprenonsensuitedeuxexemplestrèsdifférentsd’environnementsqui fournissentdesoutilspermettantla publicationdebasededonnées:

203

Page 204: Comprendre XSLT

204 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

1. Cocoon,un environnementdepublicationcompletincluantXSP, uneadaptationdesJSPpourpro-duiredynamiquementduXML ;

2. XSQL,unoutil Oraclequi traduitautomatiquementle résultatd’unerequêteSQLenXML, etpermetl’intégrationavecXSLT.

Pourconclurele chapitrenousreprenonsla questiondefond poséeci-dessus: a-t-onbesoind’utiliserunebasededonnéesenassociationavecXML ? Ne pourrait-onpasutiliser XML commeformatdebasede donnéeset effectuerdirectementl’interrogationsur desdonnéesXML, évitantainsi desconversionsparfois coûteuses? Nous reprenonsles principalesfonctionnalitésd’un systèmede gestionde basededonnées,discutonsdeslimitationsd’unereprésentationXML dansun tel cadreet présentonsbrièvementdestechniquesémergentes(schémas,langagesd’interrogation)qui visentàpalierceslimites.

7.1 Basesde donnéeset XML

Plaçons-nouspourl’instantdanslasituationoùdesinformationsstockéesdansunebasededonnéesdoiventêtreconvertiesendocument(s)XML. Nouseffectuonsunrappeldesprincipalescaractéristiquesdumodèlerelationnelavantdedécrirele processusdeconversion.

7.1.1 Quelquesrappels sur lesBD relationnelles

Prenonsl’exemple(trèssimplifié)dela basededonnéesd’un organismedevoyage.Cetorganismeproposedesséjours(sportifs,culturels,etc)sedéroulantdansdesstationsdevacances.Chaquestationproposeunensembled’activités(ski, voile, tourisme).Enfin l’organismesouhaitegéreruneliste desclients(avec lesoldedeleur compte!) et desséjoursauxquelsils ont participéavecleursdatesdedébut etdefin.

La premièrechoseà faireestd’établir un schémadécrivantcommentlesinformationsnécessairesvontêtrestockéesdansla base.La conceptiond’un schémarelationneln’entrepasdansle cadrede ce livre.Il suffira dedire qu’il estconstituéd’un ensemblede schémasde tables(ou relation), chaquetableétantdécritepar un ensembled’attributs. Voici une représentationconcisedu schémapour notre agencedevoyages.

g Station(nomStation, capacité,lieu, région,tarif)

g Activité (nomStation, libellé, prix)

g Client (id, nom,prénom,ville, région,solde)

g Séjour(idClient, station, début, nbPlaces)

On trouvedoncquatretables,chacuneayantun nomdistinct. Ellescorrespondentrespectivementà ladescriptiondesstations,desactivitésproposéesdanschaquestation,desclientsetdesséjourseffectuésparlesclientsdanslesstations.Pourchaquetableon a donnéla liste desattributs,sansentrerpour l’instantdansle détaildestypesdedonnées.Parmi cesattributscertainsprésententuneimportanceparticulière.

La cléprimaire estle (ou les)attribut(s)dontla valeurvapermettred’identifierdemanièreuniqueuneligne dansla table. Lesclésprimairessontreprésentéesen gras. Pourle schémaci-dessus,celasignifiequ’il nepeutpasy avoir deuxstationsavecle mêmenom.Le choixdesclésrelèvedechoixdeconception(souventassezdélicats)quenousnecommenteronspasici. Pourla tableClient, onavisiblementconsidéréquele nomn’était passuffisantpour identifier uneligne de la table,et on a crééun attribut artificiel idpournuméroterlesclientsaufur et àmesuredeleur insertion.

Certainesclés peuvent être constituéesde plusieursattributs. Chaqueligne de la table Activité parexempleest identifiéepar le nom de la station,et le libellé de l’activité. Il peutdoncy avoir plusieursactivités de libellés différentsdansunemêmestation,et plusieursactivités de mêmeslibellés dansdesstationsdifférentes.Enfin la tableSéjourestidentifiéepar trois attributs: un client peutrevenir plusieursfois dansla mêmestation,maispasà la mêmedate.

Page 205: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 205

id nom prénom ville région solde10 Fogg Phileas Londres Europe 1246520 Pascal Blaise Paris Europe 676330 Kerouac Jack New York Amérique 9812

La tableClient

idClient station début nbPlaces10 Passac 2001-07-01 230 Santalba 2001-08-14 520 Santalba 2001-08-03 430 Passac 2001-08-15 330 Venusa 2001-08-03 320 Venusa 2001-08-03 630 Farniente 2002-06-24 510 Farniente 2002-09-05 3

La tableSéjour

Figure7.1: Lesclientset leursséjours

Uneclé étrangère estun (ou plusieurs)attribut(s)dansunetable l dont la valeurfait référenceà unevaleurdeclé primairedansunetable m . Prenonsl’exempledestablesde la figure7.1. L’attribut idClientdansla tableSéjourcontientunevaleurdeclé de la tableClient. De mêmel’attribut stationcontientunevaleurde clé de la tableStation. Les clésétrangèresconstituentdesréférencesentretables,avec deuxobjectifs:

g définir descontraintesd’intégrité référentielle: on ne devrait paspar exemplepouvoir référencerdansla tableSéjourun clientqui n’existepasdansla tableClient;g permettre,pardesopérationsditesde jointure, le regroupementdedonnéesrépartiesdansplusieurstables: à partir de la premièreligne de la tableSéjour, on sait par exemplequele client s’appellePhileasFoggenprenantidClient et enrecherchantla ligne correspondantedansla tableClient.

Lesclésprimaireetétrangèresontlescaractéristiquesessentiellesd’un schéma,etdéfinissentlesprin-cipalescontraintesliant les tables.D’autrescontraintes,internesà chaquetable,peuventêtreexprimées.Prenonsparexemplela figure7.2.Ona:

1. descontraintesdetypes: certainsattributssontnumériques,d’autresalphanumériques,avecousansdécimale,etc;

2. descontraintesd’existence: la capacitéde la stationSantalba,ou le tarif de la plongéeà Venusa,sontinconnus,maistouslesautresattributsont unevaleur;

3. descontraintesd’appartenanceà un ensembleénuméré: on pourraitparexempledéfinir unecodifi-cationdesrégions(«Antilles», «Europe», «Amérique», «Asie», etc).

Toutescescontraintessontexprimablesavecle langageSQL(ouplusexactementla partiedela normeSQLANSI relativeàladéfinitiondedonnées).Ainsi onpeutdéclarerquecertainsattributsdoiventtoujoursêtreconnus(contrainteNOT NULL), qu’il sontdesinstancesdetypesSQL, ou queleur valeurappartientà unelistefixée.

Le scriptci-dessouscontientlescommandesdecréationduschémadela base.Notezl’absenceounondela contrainteNOT NULLselonqu’un attribut doit êtreconnuou non,et la combinaisondesPRIMARYKEYetFOREIGN KEYpourdécrirelesliensentrelestables.Cescriptestconformeà la norme,etdevraitêtreacceptépartoutSGBDrelationneldignedecenom(nousl’avonstestéavecMySQL etORACLE).

Exemple84 Schema.sql: Créationduschémadela base

Page 206: Comprendre XSLT

206 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

nomStation capacité lieu région tarifVenusa 350 Guadeloupe Antilles 1200

Farniente 200 Sicile Europe 1500Santalba Martinique Antilles 2000Passac 400 Alpes Europe 1000

La tableStation

nomStation libellé prixVenusa Voile 150Venusa Plongée

Farniente Plongée 130Passac Ski 200Passac Piscine 20

Santalba Kayac 50La tableActivité

Figure7.2: Lesstationset leursactivités

## Schéma de la base ’Agence de voyages"#

CREATE TABLE Station (nomStation VARCHAR(30) NOT NULL,capacite INTEGER,

lieu VARCHAR(30) NOT NULL,region VARCHAR(30) NOT NULL,tarif DECIMAL (10,2),

PRIMARY KEY (nomStation),CONSTRAINTnom_region

CHECK(region IN (’Antilles’, ’Europe’,’Amérique’, ’Asie’,’Afrique’))

);

CREATE TABLE Activite (nomStation VARCHAR(30) NOT NULL,libelle VARCHAR(30) NOT NULL,prix DECIMAL (10,2),PRIMARY KEY (nomStation, libelle),FOREIGN KEY (nomStation) REFERENCESStation);

CREATE TABLE Client (id INTEGER NOT NULL,nom VARCHAR(30) NOT NULL,prenom VARCHAR (30) NOT NULL,

ville VARCHAR(30) NOT NULL,region VARCHAR(30) NOT NULL,

solde DECIMAL (10,2) NOT NULL,PRIMARY KEY (id)

);

CREATE TABLE Sejour (idClient INTEGER NOT NULL,station VARCHAR(30) NOT NULL,debut DATE NOT NULL,nbPlaces INTEGER NOT NULL,

PRIMARY KEY (idClient, station, debut),FOREIGN KEY (idClient) REFERENCESClient,FOREIGN KEY (station) REFERENCESStation);

Page 207: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 207

Parlonsmaintenantdu contenud’une table. Il peutêtrevu commeun tableauconstituéde colonnes,unepour chaqueattribut de la table,et de lignes,unepour chaqueentitéstockéedansla table. Danslemodèlerelationnel,l’ordre deslignesou descolonnesn’estpassignificatif. En pratique,celasignifiequela requêtesuivante:

SELECT nomStation, lieu, régionFROMStationWHEREcapacité > 100

donnerale mêmerésultatquelquesoit le réagencementdeslignesetdescolonnesdeStation.

En résumé,voici lesaspectsdu modèlerelationnelqui nousimportentpourla conversiondesdonnéesversXML :

1. la baseestdécriteparun schémaséparé(physiquement)desdonnées;

2. le schémaestconstituédedescriptionsdetables(ou relations);

3. lescaractéristiquesd’unetablesont:

(a) sonnom;

(b) le nomdesesattributs(oucolonnes);

(c) le ou lesattribut(s)formantla clé primaire;

(d) uneou plusieursclésétrangères, chacuneconstituéed’un ou plusieursattributs;

(e) le typedechaqueattribut, et la contrainteNOT NULL;

(f) lescontraintesd’appartenanceà unensembleénuméré.

4. l’ordre deslignesou descolonnesd’unetablen’estpassignificatif.

Voyonsmaintenantcommentun schémarelationneltrouvesonéquivalentenXML.

7.1.2 Documentsorientés«texte» et documentsorientés«données»

L’exportationdebasesdedonnéesdonnedesdocumentsXML assezparticuliers.Au départ,XML estundérivédeSGML destinéàfaciliterl’échangeetla représentationdedocumentsnumériques(documentationtechnique,livres,maquettes,etc).De telsdocumentssontcaractérisésparl’absencedetypage(tout estvucommeunechaînedecaractères),uneforte présencede texte descriptif,et unestructuretrèssouple.Parcontraste,unebasededonnéesesttrèsstructurée,décritl’information avecunegranularitétrèsfine,et typecetteinformation.

Voici une représentationpossibleen XML de la table Station. La racinedu documentest de typeStation . On trouveensuiteun élémentpourchaqueligne,et danscetélémentautantd’élémentsqu’il ya d’attributs.

Exemple85 Station.xml: UnereprésentationXML dela tableStation

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station><nomStation>Venusa</nomStation><capacite>350</capacite><lieu>Guadeloupe</lieu><region>Antilles</region><tarif>1200.00</tarif></Station><Station>

Page 208: Comprendre XSLT

208 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

<nomStation>Farniente</nomStation><capacite>200</capacite><lieu>Seychelles</lieu><region>Océan Indien</region><tarif>1500.00</tarif></Station><Station><nomStation>Santalba</nomStation><capacite>null</capacite><lieu>Martinique</lieu><region>Antilles</region><tarif>1200.00</tarif></Station><Station><nomStation>Passac</nomStation><capacite>400</capacite><lieu>Alpes</lieu><region>Europe</region><tarif>1000.00</tarif></Station>

</Stations>

La structureobtenueestextrêmementrégulière: l’arbre XML estéquilibré(exactementtrois niveauxpourtouteslesbranchesdel’arbre). De plusle contenudechaqueélémentpeutêtreprécisémenttypé.

Il existed’autresdifférencesplussubtilesquecellesliéesà la formeentrela représentationXML et lareprésentationrelationnelle.La principaleestquel’ordre deslignesn’est passignificatif pour unetable,alorsquel’ordre desélémentsl’est pourun documentXML. En pratique,si touterequêteSQL donnelemêmerésultatquelquesoit l’ordre deslignes,le résultatd’un programmeappliquéaudocumentXML (parexempleunetransformationXSLT) peutdépendredel’ordre deséléments.

Un systèmedegestiondebasededonnéesestlibre deréorganiserle stockagedeslignesd’unetable,parexemplepouroptimiserlesaccès.Celasignifiequeriennepeutgarantirquedeuxexportationssuccessivesvont présenterlesdonnéesdansle mêmeordre. Il estimportantdegarderentêtecetteparticularitéquandon manipuledesdonnéesXML issuesd’unebasededonnées.

Uneautredifférenceestquela descriptiondesdonnées(le schéma)estintégréeauxdonnéesenXML,alorsquele schémaestreprésentéuneseulefois, etséparédesdonnéesdansunSGBD.Le documentXMLestbeaucoupplusredondant(et doncvolumineux)quele stockagerelationnel.De plusla descriptiondesdonnéesXML estmoinsricheet précisequecelled’un schémarelationnel.En particulieril n’y a pasdenotiondetype,etpeudecontraintessurle contenu.Nousverronsunpeuplusloin commentengendreruneDTD qui traduit(enpartie)lesspécificationsduschémarelationnel.

Un documentorienté«texte» estbeaucoupmoinsstructuré,et contienten généralbeaucoupde de-scriptifs de longueurstrèsvariables. Voici par exempleun documentreprésentantl’avant-proposde celivre. Il s’agit d’un flot detextedanslequellesbalisesmarquentlesexpressionsimportantes,lesénuméra-tions,etc. La notionde typen’est pasimportante.En revanchel’ordre estessentiel,et on nepeutpaslechangersanschangerla significationdu document.

Exemple86 AvantPropos.xml: Un documentorienté«texte»

Onnepeutpasconsidérerqu’il existeuneséparationstricteentrelesdocumentsorientés«texte» et lesdocumentsorientés«données». Dansdenombreuxcasle contenud’un systèmed’informationseramixte,et rassembleradesinformationsdenatureet deprovenancedifférentes.Voici un documentprésentantunepromotionpour notreagencede voyage. On y trouve un descriptif libre placésousla responsabilitédel’initiateur dela promotion,etdesinformationsissuesdela basededonnées.

Exemple87 Promotion.xml: Un documentmixte

Page 209: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 209

<?xml version="1.0" encoding="ISO-8859-1"?>

<Promotion auteur="Jules"><Description>

Nous proposons une réduction de <Reduction>25</Reduction>pourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Vous pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombde de places offertes est limité.</Important>

</Description>

<Station><nomStation>Passac</nomStation><capacite>400</capacite><lieu>Alpes</lieu><region>Europe</region><tarif>1000.00</tarif>

<Activite><libelle>Ski</libelle><prix>200.00</prix>

</Activite><Activite>

<libelle>Piscine</libelle><prix>20.00</prix>

</Station></Promotion>

Toutela questiondansce casestde définir le systèmequi va permettred’intégrer le plus facilementpossiblelesdeuxtypesd’informations.On peutpenserà stocker le document«texte» XML dansla basededonnées,cequi esttoutà fait possiblemaisrendbeaucoupplusdifficile l’accèset la miseà jour pourunutilisateur. À l’in verseonpeutfournir desmoyenssimples(si possible..)d’incluredynamiquementdansundocumentXML desextraitsd’unebasededonnées.Nousmontreronsdansla suitedecechapitreunexem-plerelativementsimplemaiscompletd’uneréalisationd’un documentXML dynamique,et l’enchaînementdela générationdu documentavecl’applicationd’un programmeXSLT.

7.1.3 Transformation d’une basede donnéesenXML

Nousétudionsmaintenantdemanièresystématiquela transformationdetout ou partied’unebasededon-néesrelationnelleendocumentXML.

Élémentsou attrib uts?

La premièresolution, immédiate,consisteà conserver la structure«plate» de la baserelationnelle,et àtranscrirechaquetableparunélémentayantle nomdela tableouundérivé(parexemple h Stations i ).Cetélémentcontientlui-mêmeunélémentpourchaqueligne,ayantpournomunautredérivédunomdelatable(parexemplr«Station », sans«s», enfinchaqueattribut dela tableestreprésentéparunélément,constituantainsiun troisièmeniveaudansl’arbre.

Il existe(aumoins)uneautrepossibilité.Au lieu dereprésenterlesattributsdela tablepardeséléments,onpeutlesreprésenterpardesattributsXML del’élémentreprésentantla ligne. Voici cequeceladonneraitpourla tableStation.

Page 210: Comprendre XSLT

210 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Exemple88 StationAttrs.xml: RéprésentationdeStationavecdesattributs

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station nomStation=’Venusa’capacite=’350’lieu=’Guadeloupe’region=’Antilles’tarif=’1200.00’/><Station nomStation=’Farniente’capacite=’200’lieu=’Seychelles’region=’Océan Indien’tarif=’1500.00’/><Station nomStation=’Santalba’capacite=’null’lieu=’Martinique’region=’Antilles’tarif=’1200.00’/><Station nomStation=’Passac’capacite=’400’lieu=’Alpes’region=’Europe’tarif=’1000.00’/>

</Stations>

Cetteméthodeprésentequelquesavantages.Tout d’abordelle estassezproche,conceptuellement,dela représentationrelationnelle.Chaqueligne d’une tabledevient un élémentXML, chaqueattribut de laligne devient un attribut XML del’élément.La structureestplusfidèlementretranscrite,et notammentlefait qu’uneligned’unetableformeuntout,manipulésolidairementparleslangages.EnSQLparexemple,on n’accèdejamaisà unattribut sansêtred’abordpasséparla ligne dela table.

Techniquement,l’absenced’ordre (significatif) sur les attributs XML correspondà l’absenced’ordresignificatif sur lescolonnesd’une table. On s’affranchitdoncenpartiedesproblèmespotentielsévoquésprécédemment.Du point devuedu typage,l’utilisation desattributspermetégalementd’êtrepluspréciset plusprochedela représentationrelationnelle:g on nepeutpasavoir deuxfois le mêmeattribut pourun élément,demêmequ’on nepeutpasavoir

deuxcolonnesavec le mêmenom dansunetable(notezquece n’est pasvrai si on représentelescolonnespardesélémentsXML) ;g on peutindiquer, dansun DTD, la liste desvaleursqueprendun attribut, cequi renforceun peulescontrôlessurle document.

Enfin l’utilisation desattributsaboutità un documentmoinsvolumineux.Nousutiliseronsdoncplutôtcetteméthodedeconversionparla suite,bienqu’il soit justedesoulignerquela représentationdescolonnespardesélémentsaaussisesdéfenseurs.Commepourbeaucoupd’autresproblèmessanssolutiontranchée,le choixdépendenfait beaucoupdel’applicationetdel’utilisation qui estfaitedesinformations.

Représentationdesassociationsentre tables

Passonsmaintenantà la représentationXML desliensentrelestables.En relationnel,nousavonsvu queles liens sont définis par unecorrespondanceentrela clé primaire dansune table, et une clé étrangère

Page 211: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 211

dansuneautretable. L’opération(relationnelle)qui va ensuites’appuyersur cettecorrespondancepourrapprocherles lignes de deux tablesest la jointure. Dansla figure 7.2, page206, on voit par exemplequeles tablesStationet Activité sont indépendantesl’une de l’autre (ellespeuvent êtrestockéesen desendroitsdifférents),maisquel’on peut,par calcul, reconstituerl’associationenprenant,pourchaquelignedécrivantunestation,leslignesdeActivitéayantle nomdela station.

End’autrestermes,laconditionnécessaireetsuffisantepourqu’il soitpossibledereconstituerl’informationestl’existenced’un critèrede rapprochement.Il esttout à fait possibled’appliquerle mêmeprincipeenXML. Voici parexempleun documentoù figurentdesélémentsdetypeStation et detypeActivite(nousn’avonsgardéquedeuxstationspoursimplifier). Cesélémentssontindépendantslesunsdesautres(ici celasignifiequedesinformationsapparentéesnesontpasliéesdansla structurehiérarchiquedudocu-ment),maison aconservéle critèrederapprochement.

Exemple89 StationActivite.xml: Stationsetactivités

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station nomStation=’Venusa’capacite=’350’lieu=’Guadeloupe’region=’Antilles’tarif=’1200.00’/>

<Station nomStation=’Farniente’capacite=’200’lieu=’Seychelles’region=’Océan Indien’tarif=’1500.00’/>

<Activite nomStation=’Venusa’libelle=’Voile’prix=’150.00’/>

<Activite nomStation=’Venusa’libelle=’Plongee’/>

<Activite nomStation=’Farniente’libelle=’Plongée’prix=’130.00’/>

</Stations>

Maintenant,commedansle casdu relationnel,il estpossiblede déterminerpar calcul, la correspon-danceentreuneactivité et une station. Supposonsque l’on exécuteun programmeXSLT. Si le nœudcourantestdetypeStation , il estpossibledesélectionnertouteslesactivitésavecl’expressionXPath:

/Activite[@nomStation=current()/@no mStati on]

De même,si le nœudcourantestdetypeActivite , voici l’expressionXPathqui désignela station:

/Station[@nomStation=current()/@nom Statio n]

Page 212: Comprendre XSLT

212 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Cetterecherches’apparenteà la jointuredeSQL, mêmesi on procèdeassezdifféremmentici : il fautd’abordsepositionnersurun nœud,puisexprimeravecXPathle cheminqui mèneauxnœudsassociés.

Cettereprésentationestpossible,maiselle n’estpasnaturelleenXML et mèneà quelquesdifficultés.Elle n’estpasnaturelleparcequ’uneactivité esttoujoursdansuneetuneseulestation: il estdoncinutile dela représenterséparément.Elle présentedesdifficultésparcequ’il va êtrebeaucoupcoûteuxdeparcourirdescheminscompliquésdansl’arbrepourrelierdesnœuds.

Labonnereprésentationdanscecasconsisteà imbriquerlesélémentsdetypeActivite dansl’élémentde type Station . On peutdu mêmecoups’épargnerla peinede conserver le nom de la stationdanslesélémentsh Activite i puisquela correspondanceStation/Activité estmaintenantreprésentéeparlastructure,et pasparun lien denavigationbasésurdesvaleurscommunes.Voici cequeceladonne.

Exemple90 StationImbriquee.xml: Représentationavecimbrication

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station nomStation=’Venusa’capacite=’350’lieu=’Guadeloupe’region=’Antilles’tarif=’1200.00’>

<Activite libelle=’Voile’ prix=’150.00’/><Activite libelle=’Plongee’/>

</Station>

<Station nomStation=’Farniente’capacite=’200’lieu=’Seychelles’region=’Océan Indien’tarif=’1500.00’>

<Activite libelle=’Plongée’ prix=’130.00’/></Station>

</Stations>

Cettereprésentationest bien meilleure. Il est maintenantpossible,pour un nœudcourantde typeStation , d’accéderà touteslesactivitésavecl’expressionXPathActivite . Inversementl’expression« .. » donnela stationpouruneactivité. Cesexpressionss’évaluenttrèsefficacementpuisqueles infor-mationsapparentéessont localiséesdansla mêmepartiede l’arbre XML. Notonsau passagequ’il n’estpaspossibled’utiliser d’imbrication dansle relationnelclassique(les SGBD «relationnel/objet» récentssavent le faire). Tout y est représenté«à plat», ce qui mèneà multiplier le nombredestables,souventinutilement.

La méthodeci-dessusneposepasdeproblèmedansle casoù l’un deséléments(ici h Activite i )estlié à un et un seulautre(ici h Station i ). On parled’associationdeun à plusieurs enmodélisationbasededonnées.

Enrevanche,dansle casd’associations«plusieursàplusieurs», l’imbrication nevapasdesoi. Prenonsparexemplel’associationentrelesstationset lesclients.Pourunestationil peuty avoir plusieursclients,et réciproquement.Dansle schémarelationnelon a crééunetableintermédiaireSéjourpour représentercetteassociation.

Il n’estpasévidentdechoisirl’ordre d’imbricationdeséléments.Toutdépenddel’ordre denavigationqui va êtreemployé. Si on supposepar exemplequeles accèsseferont par les stations,on peutchoisirl’imbrication représentéedansl’exemplesuivant(toujoursennouslimitant à deuxstations):

Exemple91 StationSejour.xml: Lesstationset leursséjours imbriqués,aveclesclientsà part

Page 213: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 213

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station nomStation=’Venusa’capacite=’350’lieu=’Guadeloupe’region=’Antilles’tarif=’1200.00’>

<Sejour idClient=’30’debut=’2001-08-03’nbPlaces=’3’/>

<Sejour idClient=’20’debut=’2001-08-03’nbPlaces=’6’/>

</Station>

<Station nomStation=’Farniente’capacite=’200’lieu=’Seychelles’region=’Océan Indien’tarif=’1500.00’>

<Sejour idClient=’30’debut=’2002-06-24’nbPlaces=’5’/>

<Sejour idClient=’10’debut=’2002-09-05’nbPlaces=’3’/>

</Station>

<Client id=’10’nom=’Fogg’prenom=’Phileas’ville=’Londres’region=’Europe’solde=’12465.00’/><Client id=’20’nom=’Pascal’prenom=’Blaise’ville=’Paris’region=’Europe’solde=’6763.00’/><Client id=’30’nom=’Kerouac’prenom=’Jack’ville=’New York’region=’Amérique’solde=’9812.00’/>

</Stations>

Un séjourest lié à uneseulestation,doncon a appliquéla méthoded’imbrication. Il est trèsfacile,

Page 214: Comprendre XSLT

214 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

si le nœudcourantest de type Station , d’accéderaux séjoursde la stationavec l’expressionXPathtextttSejour. Le problèmeseposemaintenantpour les clientsqui ont été laissésà part. Si, étantsur unnœudclient,on recherchetouslesséjoursd’un client, l’expressioncorrespondanteest:

/Station/Sejour[@idClient=current() /id]

EnintroduisantunehiérarchieStation/Séjour, onadoncprivilégiéunchemind’accèsauxdonnées.Dèsque,travaillant sur l’information relativesaux stationset à leursséjours,on voudraobtenircelle relativeauxclients,il faudrasuivre desliensde navigationet accéderà unepartieéloignéede l’arbre, cequi estdifficile à exprimer, et difficile àévaluerpourle processeur.

On peutcompléterla hiérarchieen y introduisantles clients,ce qui permetde supprimerle lien denavigationbasésurl’identifiant du client. Onobtientalorsle documentsuivant.

Exemple92 StationSejourClient.xml: Stations,séjoursetclients

<?xml version=’1.0’ encoding=’ISO-8859-1?>

<Stations>

<Station nomStation=’Venusa’capacite=’350’lieu=’Guadeloupe’region=’Antilles’tarif=’1200.00’>

<Sejour debut=’2001-08-03’nbPlaces=’3’>

<Client id=’30’ nom=’Kerouac’ prenom=’Jack’ville=’New York’ region=’Amérique’ solde=’9812.00’/>

</Sejour>

<Sejour debut=’2001-08-03’nbPlaces=’6’>

<Client id=’20’ nom=’Pascal’ prenom=’Blaise’ville=’Paris’ region=’Europe’ solde=’6763.00’/>

</Sejour></Station>

<Station nomStation=’Farniente’capacite=’200’lieu=’Seychelles’region=’Océan Indien’tarif=’1500.00’>

<Sejour debut=’2002-06-24’nbPlaces=’5’>

<Client id=’30’ nom=’Kerouac’ prenom=’Jack’ville=’New York’ region=’Amérique’ solde=’9812.00’/>

</Sejour>

<Sejour debut=’2002-09-05’nbPlaces=’3’><Client id=’10’ nom=’Fogg’ prenom=’Phileas’

ville=’Londres’ region=’Europe’ solde=’12465.00’/></Sejour>

</Station>

</Stations>

Page 215: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 215

Cettefois, en supposantque le point d’accèssoit toujoursunestation,on a toutesles informationssituéesdansle mêmesous-arbre,cequi va permettred’y accéderefficacementet simplement.On voit enrevanchequesi on souhaiteprendrecommepoint d’accèsun client, les informationsutilessontrépartiesun peupartoutdansl’arbre,et queleur reconstitutionseraplusdifficile.

Uneautreconséquencede la structurehiérarchiquepropreauxdocumentsXML estqu’il estdifficiled’éviter la redondanced’information. Le client JackKerouac,avec toutessescaractéristiques,apparaîtparexempleplusieursfois dansle documentStationSejourClient.xml. Si cedocumentnesertquepourunepublicationdedonnées,ouplusgénéralementpourdesrecherchesd’information,alorsle seulinconvénientestla taille plusimportantedudocumentparrapportàceluiobtenuenmettantunseulexemplairedechaqueélément,et enlesassociantpardesliens.

La basededonnéesquenousutilisonsdansnosexempleesttrèssimple.Il estclair quepourdesbasesréalistesprésentantquelquesdizainesde tables,la conceptiond’un schémaXML d’exportationdoit fairedescompromisentrel’imbrication desdonnéeset la conservation descorrespondancesclé primaire/cléétrangèresousforme de lien de navigation dansle documentXML. Tout dépendalors desbesoinsdel’application,dela partiedela basequ’il fautexporter, etdescheminsd’accèsprivilégiésauxinformationsqui serontutilisésdansl’exploitationdu document.

7.1.4 Création de la DTD

Quandon créeun outil exportantunebasede données(ou une partied’une basede données)dansundocumentXML, on peut,enplusdu documentrépresentantle contenudela base,créerla DTD. L’intérêtestde pouvoir fournir aux utilisateursunedescriptionde la structurequi ne dépendepasd’une instanceparticulièrede la base.La créationd’uneDTD permetégalementdereconstituerenpartielescontraintesdu schémarelationnel,

Nouscontinuonsà prendrel’exemplede notre base«Agencede voyages», en supposantles choixsuivants:

1. lescolonnessontreprésentéespardesattributsXML ;

2. le chemind’accèsprincipalestla station;

3. pourchaquestationon trouve, imbriqués,lesséjoursdela station,et danschaqueséjourlesclientsqui ont séjournédansla station;

4. pourlesbesoinsdela présentation,onvasupposerquelesactivitésdela stationsontreprésentéspardesélémentsindépendants,avecun lien denavigation.

Un exemplede documentconformeà ce schémaest StationSejourClient.xml, page214, auquelonpourraitajouterdesélémentsh Activite i commefils del’élémentracine.

Racinedu document

LesdocumentsaurontunélémentracinedetypeStations , constituéde0 ou plusieursélémentsdetypeStation .

<!ELEMENT Stations (Station*)>

Description de la table Station

Rappelonsle schémarelationneldela tableStation. Nousallonsessayerdenousy conformerdansla DTD.

CREATE TABLE Station (nomStation VARCHAR(30) NOT NULL,capacite INTEGER,lieu VARCHAR(30) NOT NULL,region VARCHAR(30) NOT NULL,tarif DECIMAL (10,2),

Page 216: Comprendre XSLT

216 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

PRIMARY KEY (nomStation),CONSTRAINTnom_regionCHECK(region IN (’Antilles’, ’Europe’,

’Amérique’, ’Asie’,’Afrique’)));

Chaquecolonnedela tabledevient un attribut de l’élément. Nousnepouvonspasreproduirele type,donctoussontdéclaréscommeCDATA. En cequi concernela contrainted’existenceNOT NULL, elle auneéquivalencedirectedansla DTD.

1. si la colonneestà NOT NULL, l’attribut XML estqualifiéavec#REQUIRED;

2. sinonl’attribut XML estqualifiéavec#IMPLIED .

Onchoisitdoncdenepasreprésenterun attribut àNULL, cequi estle plusprocheéquivalentenXMLdu fait quela valeurestinconnue.La valeurNULLcorrespondvraimentàuneabsencedevaleur, cequi esttrèsdifférentd’unevaleurà 0 ou dela chaînevide,cettedernièrepouvantêtrereprésentéeparun élémentou un attribut vide enXML.

Lesautrescontraintessurle contenudela tablesontd’unepartla clé primaire,d’autrepartl’ensembledevaleursénuméréespourla colonneregion . Quandla clé primaireestconstituéed’uneseulecolonne,elle correspondà l’ ID d’uneDTD XML :

nomStation ID #REQUIRED

Si leparseurestvalidant(autrementdit s’il vérifiequeledocumentestconformeàlaDTD), il contrôleraqu’il n’y a pasdeuxélémentsh Station i avecle mêmeattribut nomStation . En fait la portéed’unedéclarationd’identifiantcouvretouslesélémentsd’un document,quelquesoit leur type,alorsqu’elle estrestreinteà unetableenrelationnel.Si on déclareun ID pourun autreélémentcorrespondantà uneautretable,il fautenvisagerqu’il puisseexisterdesvaleursdeclé identiquesdanslesdeuxtables(danscecasonpeutparexemplepréfixer lescléspar le nomdela table,mêmesi cen’estpasunegarantietotale). Dansle cas– fréquent– où la clé primairecomprendplusieurscolonnesdela table,il n’existepasd’équivalentdansla notationdesDTD.

Pourla valeurénumérée,on peutaussil’indiquer dansla DTD. Notezque,parchance(!), il n’y a pasdevaleurcontenantdesblancsdansnotrelistedesrégions,cequi seraitpossibledansle schémarelationnelmaisnepourraitpasêtreretranscritdansla DTD.

Finalementil resteà indiquerqu’un élémenth Station i peutavoir commefils 0 ou plusieursélé-mentsh Sejour i . Voici la partiedela DTD correspondantà la tableStation.

<!ELEMENT Station (Sejour*)><!ATTLIST Station

nomStation ID #REQUIREDcapacite CDATA #IMPLIEDlieu CDATA #REQUIREDtarif CDATA #REQUIREDregion (Antilles Europe Amérique Asie) #REQUIRED

>

TablesSéjouret Client

Voici la commandedecréationdela tableSéjour. La cléestconstituéedeplusieursattributs,eton nepeutdoncpasla représenteravecla DTD.

CREATE TABLE Sejour (idClient INTEGER NOT NULL,station VARCHAR(30) NOT NULL,debut DATE NOT NULL,nbPlaces INTEGER NOT NULL,

Page 217: Comprendre XSLT

7.1. BASESDE DONNÉESET XML 217

PRIMARY KEY (idClient, station, debut),FOREIGN KEY (idClient) REFERENCESClient,FOREIGN KEY (station) REFERENCESStation);

Cettetablecomprenddeuxclé étrangères: chaqueséjourfait référenceà une (uneseule)stationetun (un seul)client. Commenousavonschoiside représenterparuneimbricationles liensentrecestroisentités,la reprisede cesclésétrangèresdansla DTD est inutile. Il sufit de dire qu’un élémentde typeSejour estcomposéd’un (un seul)élémentdetypeClient , un élémenth Sejour i étantparailleursfils d’un et un seulélémenth Station i .

<!ELEMENT Sejour (Client)><!ATTLIST Sejour

debut CDATA #REQUIREDnbPlaces CDATA #REQUIRED

>

Enfin la tableClient estretranscriteenreprenantsimplementlescolonnesdela tablescommeattributsdansla DTD. Notezquel’on ne peutplus dire quel’attribut id estuniquedansle documentpuisqu’unclient seradupliqué pour chaqueséjour auquel il a participé (voir documentStationSejourClient.xml,page214). On doit quandmêmeconserver l’attribut id dansl’élément, pour pouvoir reconnaîtrelesélémentscorrespondantaumêmeclient.

La table Activite

Pourlesbesoinsdela cause,nousplaçonslesélémentsdetypeActivite indépendammentdela stationà laquellesils se rattachent,en conservant un lien identiqueà celui de la baserelationnelle. Voici lacommandedecréationdecettetable.

CREATE TABLE Activite (nomStation VARCHAR(30) NOT NULL,libelle VARCHAR(30) NOT NULL,prix DECIMAL (10,2),PRIMARY KEY (nomStation, libelle),FOREIGN KEY (nomStation) REFERENCESStation);

Onnepeutpasdéclarerd’identifiantpuisqu’il estcomposédedeuxcolonnes.En revancheil estpossi-bledetranscrirepartiellementla clé étrangèreparuneréférenceIDREF.

<!ELEMENT Activite EMPTY><!ATTLIST Activite

nomStation IDREF #REQUIREDlibelle CDATA #REQUIREDprix CDATA #IMPLIED

>

Un processeurvalidantvérifiera,sur notreexemple,quechaqueattribut nomStation d’un élémenth Activite i aunevaleurégaleàcelledel’attribut correspondantdansunélémenth Station i . Con-trairementauschémadela tablerelationnelle,rien n’indiquequenomStation dansh Activite i faitréférenceànomStation dansh Station i puisquelesidentifiantssontglobauxaudocument.

Voici pourconclurela DTD complète.

Exemple93 BaseStation.dtd: La DTD dela base

<!-- DTD des documents exportés de la base"Agence de voyages -->

<!ELEMENT Stations (Station*)>

Page 218: Comprendre XSLT

218 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

<!ELEMENT Station (Sejour*)><!ATTLIST Station

nomStation ID #REQUIREDcapacite CDATA #IMPLIEDlieu CDATA #REQUIREDtarif CDATA #REQUIREDregion (Antilles Europe Amérique Asie) #REQUIRED

>

<!ELEMENT Sejour (Client)><!ATTLIST Sejour

debut CDATA #REQUIREDnbPlaces CDATA #REQUIRED

>

<!ELEMENT Client EMPTY><!ATTLIST Client

id CDATA #REQUIREDnom CDATA #REQUIREDprenom CDATA #REQUIREDville CDATA #REQUIREDregion CDATA #REQUIREDsolde CDATA #REQUIRED

>

<!ELEMENT Activite EMPTY><!ATTLIST Activite

nomStation IDREF #REQUIREDlibelle CDATA #REQUIREDprix CDATA #IMPLIED

>

7.2 Ar chitectures

Nousallonsmaintenantétudierquelquesarchitectures-typespermettantd’intégrerdansunsystèmedepub-lication desinformationsextraitesd’unebasededonnées.Il n’existepasà l’heureactuelledemécanismestandard,maison peutdégagerquelquesprincipesgénérauxsurlesquelss’appuientla plupartdesoutils.

Unedesprincipalesmotivationsdansce typed’architectureestla séparation despointsdevues(sep-aration of concern). L’idée est que dansun systèmebasésur plusieurscoucheslogicielles présentantchacuneun hautdegré de complexité, le passaged’une coucheà uneautredoit être le plus transparentpossible. Concrètement,les développeursXSLT ne devraientpasavoir à connaîtreaussiun langagedeprogrammationcomeJava, la structuredela basededonnéesou l’interfaceJDBC.

Il existe de nombreuxoutils qui exportenten XML unepartied’une basede données,et permettentl’intégrationavecXSLT. Dansla mesureoù cesoutils diffèrentlesunsdesautreset sontamenés,deplus,à évoluer rapidement,nousavonschoisi de présentertout d’abordun exemplecompletet autonomederéalisationd’un extracteuret d’insertionde cetextracteurdansdiverstypesd’architectures.Cetexempleestbiensûrsimplifiémaisdoit permettredecomprendrerapidementlesproblèmesposésparla créationdeXML «dynamique».

Nousdécrironsensuitedeuxoutils assezdifférentsqui proposent,chacunà samanière,unesolutionàcesproblèmes: l’environnementdepublicationCocoon,et lesoutils XML d’Oracle.

7.2.1 UneclasseJava d’exportation XML

CommeçonsparcréeruneclasseJavaqui exportele résultatd’unerequêteensuivantlesprincipesexposésdansla sectionprécédente.Cetteclassedoit offrir lesfonctionnalitéssuivantes:

Page 219: Comprendre XSLT

7.2. ARCHITECTURES 219

1. connexion à n’importequellebasededonnées;

2. exécutiond’unerequête;

3. miseenformedurésultatdela requêteenreprésentantchaquelignesoitpardesélémentsXML, soitpardesattributs.

Bien entenducetteclasse,ExportXML.java, utilise JDBC,l’interfacestandarddeconnexion auxbasesde donnéesrelationnelles. Voici le code de la classe,les méthodesformatXML() , formatEle-ments() et formatAttributs() étantdécritesparla suite.

public class ExportXML{

static Connection connexion;

public ExportXML(String driver, String nomBase,String login, String password)

throws SQLException, ClassNotFoundException{

// Chargement du driverClass.forName (driver);

// Connection à la baseconnexion = DriverManager.getConnection

(nomBase, login, password);}

public String formatXML (String requete,String nomElement,String mode)

{...

}

// Formatage avec élémentsprivate String formatElements (String nomElement,

ResultSet resultat,ResultSetMetaData schema)

throws SQLException{

...}

// Formatage avec attributsprivate String formatAttributs (String nomElement,

ResultSet resultat,ResultSetMetaData schema)

throws SQLException{

...}

}

Le constructeurde la classe(appeléaumomentde l’instanciationd’un nouvel objetavecnew) reçoitle nomdu driver JDBCà utiliser, et lesparamètresdeconnexion à la base.Le constructeurcherchealorsà instancierle driver (ce qui supposeque la classesoit accessibledansle CLASSPATHau momentdel’exécution),et essaiede seconnecterà la baseavec les paramètresfournis. Si l’une de cesopérationséchoue,uneexceptionJavaestenvoyéeauprogrammeappelant.

Page 220: Comprendre XSLT

220 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Remarque: NousconsidéronscommeacquiseuneconnaissancedebasedeJDBC,suffisantepourcom-prendrenosexemples.Pouren savoir plus, reportez-vousà un ouvragespécialisé,par exempleJDBCetJava,Guidedu programmeur, parGeorgeReese,auxÉditionsO’Reilly.

Si l’instanciationd’un objet de la classeExportXML réussit,l’objet estconnectéà la baseet prêt àexécuteret formatterdesrequêtes.Ceserviceestfourni parla méthodeformatXML() ci-dessous.

public String formatXML (String requete,String nomElement,String mode)

{StringBuffer chaineXML = new StringBuffer ();Statement reqJDBC; // Le ’statement’ JDBCResultSet resultat; // Le résultat de la requêteResultSetMetaData schema; // Le schéma de la requête

// Exécution de la requêtetry{

reqJDBC = connexion.createStatement ();resultat = reqJDBC.executeQuery (requete);schema = resultat.getMetaData();

// Sortie du résultat avec balises XMLwhile (resultat.next ()){

if (mode.equals("elements")){

chaineXML.append(formatElements(nomElemen t,resultat, schema));

}else{

chaineXML.append(formatAttributs(nomEleme nt,resultat, schema));

}}resultat.close();

}catch (SQLException e){

chaineXML.append("<ERREUR>" + e.getMessage() +"</ERREUR>\n");}

return chaineXML.toString();}

La méthodereçoit trois arguments: la requêteà exécuter, le nomdel’élémentdécrivantchaqueligne,et le modede formattagequi peutêtreelements ou attributs . La requêteestalorsexécutée,et onrécupèredeuxvariables: resultat estun curseursur la liste deslignesrenvoyéespar l’exécutiondelarequête,et schema estla descriptiondu résultat(nombred’attributs,nomdesattributs,etc). Il ne resteplusqu’à appelerla méthodequi, selonle cas,va mettreenformechaqueligne avecdesélémentsou desattributs. Voici parexempleformatAttributs() , formatElements() étanttout à fait semblable(vouspouvezbienentendurécupérerle codecompletsurle site).

private String formatAttributs (String nomElement,ResultSet resultat,

Page 221: Comprendre XSLT

7.2. ARCHITECTURES 221

ResultSetMetaData schema)throws SQLException

{StringBuffer chaine = new StringBuffer();

String valeur, nom ;int i, nbAttrs;

// On prend le nombre d’attributsnbAttrs = schema.getColumnCount();

chaine.append("<" + nomElement + " ");for (i=1; i <= nbAttrs; i++){

nom = schema.getColumnName(i);valeur = resultat.getString(i);if (!resultat.wasNull()){

chaine.append(nom + "=’" + valeur + "’ \n");}

}chaine.append("/>\n");return chaine.toString();

}

La méthodecréeun élément(le nom estcelui passéen paramètre)et insèreautantd’attributs XMLqu’il y a decolonnesdansle résultat.Noterquelesvaleursnulllesnesontpasprisesencomptegrâceautest:

if (!resultat.wasNull())

Pourcomplétercecode,il faudraittesterquechaquevaleurissuedela basenecontientpasdecaractèreréservéXML comme«< », «>» ou «& », et les remplaceréventuellementpar desentités. Telle quelle,cetteclasseestdéjàsuffisantepourétudierlesdifférentstypesd’architecturedanslesquelsellepeutprendreplace.

Avantd’étudierdessolutionsbaséessur desservlet, JSPou XSP, mentionnonsle casle plus simple,celuid’un programmelancésurla lignedecommandequiprendenargumentla requête,etsortle documentXML.

Le programmeExtracteur.java ci-dessousse connecteà une base«agencede voyage» géréeparMySQL. Il prenden paramètre,sur la ligne de commande,n’importequellerequêtesur cettebase,ainsiquele nomdel’élémentreprésentantchaqueligne du résultat,et le nomdel’élémentracinedu document.Tout l’exportestpris enchargeparuneinstancedeExport.java.

Exemple94 Extracteur.java: Programmed’extractiond’unebasededonnées

/* Ce programme fait appel à la classe ExportXML pour formatter* le résultat d’une requête SQL en XML (en mode attributs).* Il prend trois arguments:* 1 - La requête SQL sur la table Station* 2 - Le nom de l’élément pour chaque ligne* 3 - Le nom de l’élément racine du document* Exemple: java Extracteur ’select * from Station’ ’STATION’ ’STATIONS’** NB: ceci est un programme de démonstration:* aucun contrôle n’est effecté sur les paramètres*/

// Import des classes Java

Page 222: Comprendre XSLT

222 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

import java.util.*;import ExportXML;

class Extracteur{

public static void main (String args []){

try{

ExportXML export = new ExportXML("org.gjt.mm.mysql.Driver",

"jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

System.out.println("<?xml version=’1.0’ encoding=’ISO-8859-1?>’\n");

// Elément racine du documentSystem.out.println ("<" + args[2] + ">\n");

// Mise en forme du résultatSystem.out.println(export.formatXML (args[0],

args[1],"attributs"));

// Fin de l’élément racineSystem.out.println ("</" + args[2] + ">\n");

}catch (Exception e){

System.out.println ("Impossible de se connecter à MySQL");System.out.println (e.getMessage());

}}

}

L’utilisation d’un programmecommecelui-ci,combinéàdestransformationsXSLT pourcréerparex-empleunsiteHTML, constitueunesolutionsimpleet robustequi neposepasdeproblèmedeperformanceou dedisponibilitéduserveur. Le seulinconvénient,qui doit êtreappréciéenfonctiondescaractéristiquesdel’application,estl’absencederafraîchissemententempsréeldesdonnées.Nouspassonsmaintenantàdessolutionsplussophistiquéesoù le représentationXML estproduitedynamiquement.

7.2.2 Ar chitecture Servlet

La premièresolutionpermettantdegénérerdynamiquementduXML enfonctiondedemandesutilisateursestunearchitectureservlet. Uneservletestun objetJava intégréàun serveurwebqui prendenchargedesrequêtesHTTP(figure7.3). cetobjetdisposedetouteslespossibilitésdu langageJava,et enparticulierdela possibilitédeseconnecterà unebasededonnéesvia JDBC.

Nousallonsprendrel’exempled’uneservletqui reçoitdesrequêtesSQLsurla baseStationety répondsousformed’un documentXML. Pourl’instantnousn’introduisonspasdetransformationXSLT.

La figure 7.4 montrele formulaireHTML qui permetd’interrogerla servlet. Commedansle casduprogrammeExtracteur.java ci-dessus,le formulaireenvoie la requête,ainsi quedesparamètresde créa-tion du document: nomde l’élémentracine,nom de l’élémentpour chaqueligne, modede présentation(attributsou éléments).

Au lieu de répondrecommed’habitudepar un documentHTML mis en pagepar le navigateur, laservletrenvoie un documentXML quel’utilisateur peutchoisir soit de stocker, soit de mettreen formeavecun programmeXSLT ou unefeuille destyleCSS.Nousverronsun peuplus loin commenton peut,

Page 223: Comprendre XSLT

7.2. ARCHITECTURES 223

BD

requêtes HTTP

document(s)HTML Machine Java

webServeur

Request

Response

Servlet

Machine serveur

JDBC

Figure7.3: Archictectureavecservlet

sur le serveur, appliquerun programmeXSLT afin d’obtenir uneversionHTML transmiseau client. Lerésultat«brut» fourni parla servletestdonnédansla figure7.5.

Voyonsmaintenantcommentonmetenœuvreceserviceweb. Le codecompletdela servletestdonnéci-dessous.

Exemple95 ServletXML.java: La servletd’extractionXML

import java.io.*; import java.util.*;import javax.servlet.*;import javax.servlet.http.*;

import ExportXML;

public class ServletXML extends HttpServlet {public void doGet(HttpServletRequest request,

HttpServletResponse response)throws IOException, ServletException

{StringBuffer chaineXML = new StringBuffer();String requete, element, mode, racine;ExportXML export;

response.setContentType("text/plain");PrintWriter out = response.getWriter();

// Récupération des paramètresrequete = request.getParameter("requete");mode = request.getParameter("mode");racine = request.getParameter("racine");element = request.getParameter("element");

try{

// Exécution de la requêteexport = new ExportXML ("org.gjt.mm.mysql.Driver",

"jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

// Extraction XMLchaineXML.append (export.formatXML (requete,

element,

Page 224: Comprendre XSLT

224 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Figure7.4: Un formulaired’interrogationdeservlet

mode));

// Affichage du résultatout.println("<?xml version=’1.0’ encoding=’ISO-8859-1?>’\n");out.println("<" + racine + ">");out.println (chaineXML.toString());out.println("</" + racine + ">");

}catch (Exception e){

chaineXML.append ("Erreur JDBC: " + e.getMessage());}

}}

La servletServletXML estunesous-classeHttpServlet , ethéritedoncdetoutessesfonctionnal-ités. En particulierelle reçoitdeuxparamètres,request et response qui représententrespectivementun objetcontenanttouteslescaractéristiquesdela requêteHTPPtransmiseà la servlet, et un objetservantd’intermédiairepour construireet communiquerle résultat. On sesertde cet objet pour indiquerqueletypeMIME dudocumentfourni esttext/plain (onpeutégalementutiliser text/xml si le navigateurle connaît)aulieu del’habituel text/html .

response.setContentType("text/plain") ;

Lapremièretâcheconsisteàrécupérerlesparamètresrequete , racine , element etmodeprovenantduformulaire.Ensuiteon instancieunobjetdela classeExportXML eton le charged’exécuterla requêteetdeconstituerunereprésentationXML appropriéedurésultat.Enfinonplacecerésultatdansle documentrésultattransmispar le serveurau navigateur(ou à tout autreprogrammeclient ayanteffectuéla requêteHTTP).

Page 225: Comprendre XSLT

7.2. ARCHITECTURES 225

Figure7.5: Le résultatdel’interrogation

Cetteservlettrèssimplefournit doncunmoyendepubliersousformeXML deesextraitsdela basededonnées.Surcemêmecanevasonpeutconstruiredesservicesplusoumoinscomplexesqui vontpermettred’échangerdesdocumentsXML construitsdynamiquementavec d’autresapplications(voir chapitre6).Maintenantla questionqui peutnouspréoccuperest: oùfaireintervenirunetransformationXLT ?Il existe(aumoins..)deuxpossibilités.

1. Laisserle programmeclient traiter le documentà sa guise. C’est la situationoù on publie sur lewebdesdocumentsqui, contrairementauxpagesHTML, sontexploitables: on peutenextrairedesinformations,lesrestructurer, lesintégrerà d’autres,etc.Nousavonsdéjàdiscutédansleschapitresprécédentsdecelivre du rôle deXML/XSLT dansl’intégrationdedonnées.DanscescirconstancesXSLT estutilisé du côtéclient pourtraduirele documentfourni danssapropreDTD (exempled’unmoteurderecherche).

2. Effectuerla transformationcôtéserveur. Danscecasonconnaîtunservicesurlewebqui«consomme»desdocumentsconformesà unecertaineDTD, et c’estauniveaudu serveurquela transformationesteffectuéeafin decommuniquerdesinformationsaubonformatàceservice.

Poureffectuerla transformationcôtéserveur, il faut,avantla transmissiondudocumentXML auclient,lui appliquerun programmeXSLT. On peutle fairedansnotreservleten appelantlesservicesJava d’unprocesseurXSLT (par exempleXalan). Nousallonsmontrerunesolutionun peuplus simpleà basedeJavaServerPages.

7.2.3 Utilisation desJavaServer Pages

Les Java ServerPages constituentune extensiondesservletdont l’objectif principal est de faciliter lacréationde documentscombinantdespartiesstatiqueset despartiesdynamiques.Un desprincipauxin-convénientsdesservletsesteneffet la nécessitédeproduiretout le résultatenfaisantappel,pourchaque

Page 226: Comprendre XSLT

226 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

ligne, à la fonction println(), ce qui alourdit considérablementle codeet va à l’encontredu partagedestâchesentrelesdifférentsintervenantsd’un systèmedepublication.

Dansuneservlet,toutestprogrammé.Il n’ya doncplusdedistinctionentrele contenu,la présentationet lesparties«applicatives» (accèsà la base,calculs,etc). Au contraire,avec lesJSP, on peutconstituerun servicewebdeplusieurscouches(figure7.6):

1. la couchecontenu/présentationutilise un langageavec balisequi uniformise(relativement...) lamanipulationdespartiesstatiqueset despartiesdynamiques;

2. la coucheapplicationestconstituéed’objetsqui fournissentles servicesde calcul,miseen forme,transformationdesdonnées;

3. enfinla couchedonnéesconstituele stockagedesinformationsdel’application.

La figure7.6 montrecettearchitecture,la coucheapplicativeétantreprésentéeparun composantJavaBean.

Serveur

web JSP JavaBeanJDBC

BD

Représentation XML

DonnéesApplicationContenu/Présentation

Objet intermédiaire

Figure7.6: ArchitectureavecJSPet un javabean

Au départlesJSPsontprincipalementdestinéesàfaciliter la productiondeHTML dynamiquement.Onpeutdonclesconsidérer, aumêmetitre quelesASPouquePHP, commeunmoyend’introduiresouplementdespartiesprogramméesdansdespagesHTML. Voici un exempletrèssimplede pageJSP, illustrant cemécanisme.

Exemple96 JSPSimple.jsp: Un exemplesimpledepageJSP

<HTML><HEAD><TITLE>JSP Simple</TITLE></HEAD><BODY>

<%@page import="java.io.*,java.util.*" %>

Date : <%= new Date()%>

</BODY></HTML>

Il s’agitdoncd’un documentHTML, auseinduquellespartiesprogramméesenJavasontplacéesdansdesbalisesmarquéespar<%. Au momentoùle serveurlit cespages,il vacompilerlespartiesprogramméeset lesassocierauxpartiesstatiquesdansuneservlettransitoirequi estalorsexécutée.LesJSPpeuventtrèsbienêtreconsidéréescommeun moyendefaciliter l’écrituredeservlets.

LesJSPétantinitialementorientéesversHTML, lesnotionsdecontenuet deprésentationnesontpasencoreclairementséparées.On peutcependantutiliser les JSPpour produiredu XML, et tirer parti dela capacitédesJSPà «masquer» les partiesprogrammées.Nousallonsillustrer les JSPen prenantpourexempleunpetit formulairequi permetdedonnerle nomd’unestation,etd’obtenirenretourundocumentXML représentantcettestation.La requêteestdonctoujours:

Page 227: Comprendre XSLT

7.2. ARCHITECTURES 227

select * from Station where nomStation=’ nom’Nousavonsbesoind’uneclasseintermédiaire(un«bean» Java)qui vaprendreenchargeleséchanges

entrela pageJSPet la classeExportXML.java . Voici le codedecetteclasse:

Exemple97 XMLBean.java: Un JavaBeanassociéà unepageJSP

// Bean Java pour page JSPimport ExportXML;

public class XMLBean{

private StringBuffer chaineXML = new StringBuffer();private String nomStation, element, mode;private ExportXML export;

public XMLBean(){

try{

export = new ExportXML ("org.gjt.mm.mysql.Driver","jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

}catch (Exception e){

chaineXML.append ("Impossible de se connecter à MySQL : ");chaineXML.append (e.getMessage());

}

mode = "attributs";nomStation = "";element = "Station";

}

public void setNomStation(String s) {nomStation = s;}public void setElement(String e) {element = e;}public void setMode(String m) {mode = m;}

public String getChaineXML() {chaineXML.append (export.formatXML

("select * from Station where nomStation=’"+ nomStation + "’", element, mode));

return chaineXML.toString();}

}

Cetteclasseesttrèssimple.Sonprincipal intérêtestdeseconformerà uneinterfacenormaliséqui vapermettredefaireappelàsesservicestrèsfacilementdansunepageJSP. Chaquepropriété(nomStation ,element , mode) estmodifiéeparuneméthodenomméesetXXX() où XXXestle nomdela propriété.RéciproquementdesméthodesgetXXX() permettentde récupérerla valeur d’une propriété. Danslecodeprécédentnousn’avonsmis que les méthodesdont nousavonsvraimentbesoinpour simplifier laprésentation.

Voici maintenantla pageJSP. Onpeutconstaterquecettefois le codeJavaestcomplètementcaché.

Exemple98 RequeteXML.jsp: La pageJSPeffectuantla miseenpagedela requête

<% response.setContentType("text/plain"); %><%@page import="java.io.*,java.util.*,XMLBean" %><jsp:useBean id="monBean" class="XMLBean"/>

Page 228: Comprendre XSLT

228 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

<jsp:setProperty name="monBean" property="nomStation"/><jsp:setProperty name="monBean" property="element"/><jsp:setProperty name="monBean" property="mode"/>

<?xml version=’1.0’ encoding=’ISO-8859-1’?><<%= request.getParameter("racine") %>>

<jsp:getProperty name="monBean" property="chaineXML"/>

</<%= request.getParameter("racine") %>>

Onutilise,demanièretransparente,lesfonctionnalitésdu beanavecdesinstructionsJSP:

1. l’instruction n jsp:useBean id="monBean" class="XMLBean"/ o estl’équivalent,enJSP,de l’instanciationd’un objet: on lui donneun nomqui permettrad’y faire référence,et on indiquesaclasse;

2. l’instruction n jsp:setProperty name="monBean" property="nomStation"/ o re-vient à appelerla méthodesetNomStation() surl’objet monBean : on l’occurrenceon affecteàcettepropriétédu beanla valeurtransmiseparle formulaire;

3. inversement,l’instruction n jsp:getProperty name="monBean" property="chaineXML"/ orevientàappelerla méthodegetChaineXML() surl’objet monBean.

La modificationou l’extractionde certainespropriétésdéclenchedesopérationsinternes(accèsà labase,mise en forme XML) qui sont transparentesdanscettepage. On obtient donc l’équivalentde laservletde la sectionprécédente,en obtenantuneséparationrelativementsatisfaisantedu contenu(ici undocumentXML dynamiquequel’on pourraitfacilementintégreràdespartiesstatiques)etdela « logique»(ici unaccèsàunebasededonnée).Voici unexempleplusconcretqui reprendle documentPromotion.xml,page208,dontnousavionssignaléqu’il comprenaitdespartiesstatiques,etdespartiesextraitesdela base.Nousdisposonsmaintenantd’un moyentechniqued’intégrercespartiesdynamiques.

Exemple99 Promotion.jsp: Le documentPromotion.xmlavecdu codeJSP

<?xml version="1.0" encoding="ISO-8859-1"?>

<% response.setContentType("text/plain"); %><%@page import="java.io.*,java.util.*,XMLBean" %><jsp:useBean id="monBean" class="XMLBean"/>

<Promotion auteur="Jules"><Description>

Nous proposons une réduction de <Reduction>25</Reductionpourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Pour pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombre de places offertes est limité.</Important>

</Description>

<jsp:setProperty name="monBean" property="nomStation" value="Passac"/>

<jsp:getProperty name="monBean" property="chaineXML"/></Promotion>

Page 229: Comprendre XSLT

7.2. ARCHITECTURES 229

C’est presqueun documentXML bien formé, à l’exceptiondesinstructionsJSPpour les partiesdy-namiques.

Il resteà intégrerla présentationdesdonnéesobtenuesavecun programmeXSLT. JSPoffre la possi-bilité decréerdeslibrairies debalisesqui permettentd’invoquersimplementdesfonctionnalitéscommel’application d’un programmeXSLT. Des librairies sont fournies par la fondationApache,sur le sitehttp://jakarta.apache.org/taglibs. Voici un exempledeleurutilisation:

Exemple100 PromotionXSL.jsp: Transformationdu documentPromotion.jspavecun programmeXSLT

<%@taglib uri="http://jakarta.apache.org/taglibs/x sl-1.0 "prefix="xsltlib" %>

<% response.setContentType("text/plain"); %><%@page import="java.io.*,java.util.*,XMLBean" %><jsp:useBean id="monBean" class="XMLBean"/>

<xsltlib:apply xsl="/bdxml/Promotion.xsl"><?xml version="1.0" encoding="ISO-8859-1"?>

<Promotion auteur="Jules">

<Description>Nous proposons une réduction de <Reduction>25</Reduction>pourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Vous pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombre de places offertes est limité.</Important>

</Description>

<jsp:setProperty name="monBean" property="nomStation" value="Passac"/>

<jsp:getProperty name="monBean" property="chaineXML"/></Promotion>

</xsltlib:apply>

Le programmeJSPcommencepar déclarerl’utilisation de la librairie de balisesxsl-1.0 , avec lepréfixexsltlib .

<%@taglib uri="http://jakarta.apache.org/tagl ibs/x sl-1.0 "prefix="xsltlib" %>

On peutensuiteappliquerun programmeXSLT avec la balise n xsltlib:apply o en indiquantlenomdu fichier contenantle programme:

<xsltlib:apply xsl="/bdxml/Promotion.xsl">...</xsltlib:apply>

Cettesolutionn’est pasencoretotalementsatisfaisantepuisquedesfragmentsXML sontassociésàdesbalisesnon-XML, cequi empêchede lesutiliser indépendammentdu serviceweb,parexemplepoureffectuerunetransformationXSL-FO.

En résuméles JSPoffrent un premierexempled’une architecturecherchantà «séparerles pointsdevue» du programmeur, de l’administrateurdebasesdedonnées,et du gestionnairedeprésentation.Mal-heureusementla séparationn’estpasencoreparfaiteentrel’aspect«contenu» et l’aspect«présentation».

Page 230: Comprendre XSLT

230 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

UnepageJSPcontenantet engendrantdu XML n’estpaselle-mêmedu XML bien formé,et l’utilisationdeXML/XSLT estdonclimitée à la productiondefragmentsassembléspardesinstructionsJSP.

7.3 XML dynamique

LessolutionsconçuesinitialementpourHTML nesontdoncpastotalementadaptéesàlacréation«dynamique»deXML. Lesproducteursdelogicielsontdoncproposédenouveauxoutils,enreprenantsouventenpartielesprincipesdesservletsoudesJSP. La présentationd’un panoramacompletdecesoutilsdépassele cadredecelivre,d’autantqu’il s’agitd’un domainequi évoluetrèsrapidement.Nousprésentonsdeuxoutilsquinoussemblentassezreprésentatifs:

1. Cocoonestunenvironnementdepublicationopensourcedéveloppédansle cadreduprojetXML dela fondationApache.Unedesinnovationsproposéesdansle cadredeceprojetestXSP, un langagequi généraliselesJSP.

2. Oracledéveloppeégalementdetrèsnombreuxoutils autourdesonSGBD,dontune«suite» XML.Cettesuitecomprendunoutil detransformationautomatiquedurésultatd’unerequêteSQLenXML,suivi d’unetransformationXSLT.

Il existedetrèsnombreuxautresproduitsqui s’apparententà l’un oul’autre: nousendonnonsuneliste(pasforcémentexhaustive...)surle siteassociéà celivre.

7.3.1 XSP

LeseXtensibleServerPages(XSP),proposéesinitialementdansle cadredu projetCocoon,et maintenantadoptéeségalementpar un environnementde publicationcommeAxKit (www.axkit.org), sontuneadap-tation desprincipesdesJSPen mettantcette fois l’accent sur une parfaite intégrationavec XML. UndocumentXSPestun documentXML, incluant,dansdesélémentsspécifiques,du codeJava.

La transformationd’un documentXSPs’effectueenplusieursétapes.Tout d’abordle documentXSPestcompiléet exécuté,ce qui donneun documentXML intermédiairedanslequel les instructionsjavaont étéremplacéespar leur résultat,au format XML. PuiscedocumentXML intermédiaireestsoumisànouveauà un processusdetransformation,avecun programmeXSLT cettefois, et le résultatproduit (duHTML, duXML, etc)estenfintransmisauprogrammeclient.

L’architecturedeCocoon1 permetunegénéralisationdeceprocessusimpliquantplusieurstransforma-tions successivesd’un document.Le systèmeestbasésur la combinaisonde producteurs, chacunétantchargéd’effectuerunetransformation(parXSLT, exécutiondecodeou tout autremécanisme)d’un doc-umentXML enentréeversun documentXML ensortie(figure7.7). En boutdechaîneun formateurestchargéd’effectuerla miseenformedu documentfinal (enHTML, enPDFsi le documentestenXSL-FO,ou toutautreformat)avantdele transmettreauclient.

Présentationde XSP

Il n’estpasdansnotreproposdeprésenterdemanièreappronfondieXSP. Nousallonssimplementprésenterlesprincipesdefonctionnementsurun exemple.Voici doncun documentPromotionXSP.xmlqui reprenddespartiesstatiques(tout cequi concernele texte de la promotion)et unepartiedynamique,consistantàinterrogerla basededonnéeset à intégrerle résultatdansle document.

Exemple101 PromotionXSP.xml: UnedocumentXSP

<?xml version="1.0" encoding="ISO-8859-1"?>

<?cocoon-process type="xsp"?><?cocoon-process type="xslt"?><?xml-stylesheet href="Promotion.xsl" type="text/xsl"?>

1Nousparlonsici dela version1.8,la version2.0étantencore,à l’heureoùceslignessontécrites,enphasededéveloppement.

Page 231: Comprendre XSLT

7.3. XML DYNAMIQUE 231

Producteur(XSP)

Documentintermédiaire

Producteur(XSLT)

Documentintermédiaire

(autres transformations)

Requête

Formateur

Réponse

Figure7.7: TransformationssuccessivesdansCocoon

<xsp:page language="java"xmlns:xsp="http://www.apache.org/1999/XS P/Core ">

<xsp:structure><xsp:include>java.sql.*</xsp:include>

</xsp:structure>

<Promotion auteur="Jules">

<xsp:logic>DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());// Connection à la baseConnection conn = DriverManager.getConnection

("jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

Statement stmt = conn.createStatement ();ResultSet resultat = stmt.executeQuery (

"select * from Station where nomStation=’Passac’");</xsp:logic>

<Description>Nous proposons une réduction de <Reduction>25</Reduction>pourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Vous pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombre de places offertes est limité.</Important>

</Description>

<Station><nomStation><xsp:expr>resultat.getString (1)</xsp:expr></nomStation><capacite><xsp:expr>resultat.getString (2)</xsp:expr></capacite><lieu><xsp:expr>resultat.getString (3)</xsp:expr></lieu><region><xsp:expr>resultat.getString (4)</xsp:expr></region><tarif><xsp:expr>resultat.getString (5)</xsp:expr></tarif>

</Station>

Page 232: Comprendre XSLT

232 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

</Promotion></xsp:page>

Il fautbiennoterpourcommencerquecedocumentestduXML toutà fait correct.Sonélémentracineestxsp:page , et il contientde nombreuxélémentsappartenantà l’espacede nom xsp , déclaréde lamanièresuivante:

xmlns:xsp="http://www.apache.org/19 99/XSP /Core "

OntrouvedanscettepagelesprincipauxélémentsdeXSP:

1. p xsp:structure q permetd’insérerdescommandesd’inclusiondemodulesexternes: danslecasde Java on trouve des p xsp:include q qui donnentles packagesà utiliser (l’équivalentdeimport ) ;

2. p xsp:logic q estun élémentdontle contenuestconstituédecodeJava(attention,c’esttoujoursduXML doncil nefautpasutiliser directement«<», maisla référenceà l’entité &lt; ) ;

3. p xsp:expr q enfin permetd’insérerdansle documentle résultatd’une expressionJava (il estautomatiquementconverti enchaînedecaractères).

Dansnotreexemplel’élément p xsp:logic q contientle codeJDBCpourseconnecterà la baseetévaluerunerequête.

<xsp:logic>DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());// Connection à la baseConnection conn = DriverManager.getConnection

("jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

Statement stmt = conn.createStatement ();ResultSet resultat = stmt.executeQuery (

"select * from Station where nomStation=’Passac’");</xsp:logic>

Quandcecodeestexécutéaumomentdela transformationparle producteurXSP, la variableresul-tat estdéfinieet il estpossibled’y faireréférenceailleursdansle document,commeparexemple:

<Station><nomStation><xsp:expr>resultat.getStr ing (1)</xsp:expr></nomStation><capacite><xsp:expr>resultat.getStrin g (2)</xsp:expr></capacite><lieu><xsp:expr>resultat.getString (3)</xsp:expr></lieu><region><xsp:expr>resultat.getString (4)</xsp:expr></region><tarif><xsp:expr>resultat.getString (5)</xsp:expr></tarif>

</Station>

Il resteunedernièreparticularitédanscedocument,les instructionsde traitementplacéedansle pro-logue:

<?cocoon-process type="xsp"?><?cocoon-process type="xslt"?><?xml-stylesheet href="Promotion.xsl" type="text/xsl"?>

Cesinstructionsindiquentquedeuxtransformationssuccessivesdoiventêtreappliquées.La premièreestun traitementdesinstructionsXSP. Tout sepasseen fait – aumoinsconceptuellement– commedansle casdeXSLT. Le documentesttransforméenarbreDOM, puisle processeurXSPregardelesnœudsdel’espacedenomxsp: , évalueleur contenu(en l’occurrenceenexécutantle codeJava qui s’y trouve) etremplacele nœudparlesdonnéescaractèresproduitesparcetteexécution.

Page 233: Comprendre XSLT

7.3. XML DYNAMIQUE 233

Ensuitel’élémentracine p xsp:page q estsupprimé.L’élément p xsp:page q nepeutavoir qu’unseulélémentlittéral fils, quidevientl’élémentracineaprèscettesuppression.Dansnotrecasc’est p Promotion qqui devientdoncl’élémentracine.

Le documentobtenuestalorssoumisà unesecondetransformation,avecXSLT cettefois, définieparle programmePromotion.xsl. Il fautsoulignerquela séquenceXSP-XSLT n’estpasuneobligationet quetoutemanipulationpeutêtreappliquéeà un documentissud’uneévaluationXSP.

Séparationdespoints de vue

Pourl’instant on peutdire quenousn’avonspasgagnégrandchosepour la séparationdespointsdevuespuisqu’il a fallu insérerdansun documentXML du codeJava,avecdu SQL et du JDBC.L’étapesuivanteestelle-aussiinspiréedesJSPet consisteà définir des librairies de balises, strictementconformesà lasyntaxeXML cettefois. Voici la nouvelleetdernièreversiondenotrepromotion:

Exemple102 PromotionXSPLib.xml: Un documentXSPavecbalisedynamique

<?xml version="1.0" encoding="ISO-8859-1"?>

<?cocoon-process type="xslt"?><?xml-stylesheet href="PromotionXSP.xsl" type="text/xsl"?>

<Promotion auteur="Jules"xmlns:BDS="http://cortes.cnam.fr/Station ">

<Description>Nous proposons une réduction de <Reduction>25</Reduction>pourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Vous pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombre de places offertes est limité.</Important>

</Description>

<BDS:Station nom="Passac"/>

</Promotion>

Cettefois il n’y a plusdeJavaTout le codequi apparaissaitdansla versionprécédenteestmaintenantréduità:

<BDS:Station nom="Passac"/>

Il s’agit d’un élémentXML trèssimple,appartenantà un espacede nom«BDS: » qui désignenotrelibrairie de balises,et contenantun attribut qui permetdeparamétrerla stationquel’on souhaiteobtenir.La significationdecetélémentest: « insèreici, à chaquefois quecedocumentestutilisé,unedescriptionXML dela stationdont le nomestdonnédansl’attribut nom. ». Cetteinsertionestdynamique: si la basededonnéeschange,le contenudu documentreflèteracechangementdèsqu’on y accèderaà nouveau.

Par quellemiracleest-onpasséd’un documenttrèscompliquéavecdu codeJava à un documenttrèssimplesansaucuneinstructiondeprogrammation? Et bien tout simplement(!) enajoutantunenouvelleétapedetransformationpourtraiter la balisedynamique.Cetteétapedevient la premièredu processusdetransformation,etelleconsisteà recopierle documenttel quel,saufla balisedynamiquequi estremplacéeparle codejavaquenousavonsvu toutà l’heure.DansCocoon,cettepremièretransformationestpriseenchargeparXSLT. Voici le programmePromotionXSP.xslqui traitenotrebalisedynamique:

Page 234: Comprendre XSLT

234 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Exemple103 PromotionXSP.xsl: La transformationXSLT associéeà la balisedynamique

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"xmlns:xsp="http://www.apache.org/1999/XS P/Core "xmlns:BDS="http://cortes.cnam.fr/Station ">

<xsl:template match="Promotion">

<xsl:processing-instruction name="cocoon-process">type="xsp"

</xsl:processing-instruction><xsl:processing-instruction name="cocoon-process">

type="xslt"</xsl:processing-instruction><xsl:processing-instruction name="xml-stylesheet">

href="Promotion.xsl" type="text/xsl"</xsl:processing-instruction>

<xsp:page language="java" xmlns:xsp="http://www.apache.org/1999/XSP /Core" ><xsp:structure>

<xsp:include>java.sql.*</xsp:include></xsp:structure><xsl:copy>

<xsl:apply-templates/></xsl:copy>

</xsp:page>

</xsl:template>

<xsl:template match="BDS:Station"><xsp:logic>

DriverManager.registerDriver(new org.gjt.mm.mysql.Driver());// Connection à la baseConnection conn = DriverManager.getConnection

("jdbc:mysql://localhost/Station","visiteurStation", "mdpVisiteur");

Statement stmt = conn.createStatement ();ResultSet resultat = stmt.executeQuery (

"select * from Station "+ "where nomStation=’<xsl:value-of select=’@nom’/>’");

// Affichage du résultatresultat.next ();

<Station><nomStation><xsp:expr>resultat.getStrin g (1)</xsp:expr></nomStation><capacite><xsp:expr>resultat.getString (2)</xsp:expr></capacite><lieu><xsp:expr>resultat.getString (3)</xsp:expr></lieu><region><xsp:expr>resultat.getString (4)</xsp:expr></region><tarif><xsp:expr>resultat.getString (5)</xsp:expr></tarif>

</Station></xsp:logic>

</xsl:template>

<xsl:template match="@*|node()" priority="-1"><xsl:copy>

<xsl:apply-templates select="@*|node()"/></xsl:copy>

Page 235: Comprendre XSLT

7.3. XML DYNAMIQUE 235

</xsl:template></xsl:stylesheet>

Puisquevousêtesmaintenantfamiliariséavec XSLT, vouspouvez constaterquece programmeap-pliqué au documentPromotionXSPLib.xml (page233) va créerun documentrésultatidentiqueà Promo-tionXSP.xml(page230).Voici quandmêmequelquesexplicationspourvousfaciliter la tache:

r lesinstructionsdetraitementdePromotionXSP.xmlsontobtenueavecxsl:processing-intruction :

<xsl:processing-instruction name="cocoon-process">type="xsp"

</xsl:processing-instruction>

r les règlesdu programmeXSLT recopientle documentsource: notezquela dernièrea uneprioritéégaleà -1;r la règleavecle patternBDS:Station estpriseenprioritéquandle nœudcorrespondantà la balisedynamiqueesttraité: c’estalorsle codeJava qui estinsérédansle résultat;r remarquezenfinquele nomdela stationà rechercherdansla requêteSQLestprisdansle documentsourcegrâceà xsl:value-of . Il s’agit del’attribut nomdela balisedynamique:

ResultSet resultat = stmt.executeQuery ("select * from Station "+ "where nomStation=’<xsl:value-of select=’@nom’/>’");

Il resteà appliquerau documentrésultatles deux transformationsdéjàétudiées,l’une avec XSP, etl’autreavecXSLT, pourobtenirla versionfinale.

Il existedansCocoondesmécanismesqui permettentd’associerautomatiquementà unespacedenomcommeBDSdesprogrammesXSLT qui vont remplacerun élémentpar le codeJava correspondant.Nousnedécrivonspascesmécanismesqui dépassentle cadredecelivre, d’autantquenotrebut estmaintenantatteint.Nousavons:

1. un documentXML simpleet intégrantdesbalises«dynamiques» demanièretransparente: le ges-tionnairedecontenupeutsecontenterdeconnaîtrela significationdecesbalises,sansavoir à com-prendreleur fonctionnement;

2. unprogrammeXSLT/XSPqui contientla « logique» del’application: nousavonsmontrél’exempled’un accèsbasededonnéesavecJava,maison peutimaginertoutessortesd’architectures,avecparexemplel’utilisation debeanscommecelui quenousavonscréépournosexemplesJSP;

3. enfin un ou plusieursprogrammesXSLT pour transformerle documentfinal en HTML, WML ouXSL-FO/PDF.

L’utilisation deXSPresterelativementcomplexe,cequi induit uncoûtdeconceptionetdedéveloppe-mentnonnégligeablesi onveutaboutiràunevraieséparationdespointsdevue.Depluslesperformancesposentproblème.La version2.0deCocoonvaprobablements’attacherà corrigercesdéfauts.

7.3.2 XSQL

L’utilitaire XSQL fait partieduXML DevelopmentKit (XDK) d’Oracle,unensembled’outils detraitementdedocumentsXML comprenantlesparseursDOM etSAX, unprocesseurXSLT, etdenombreuxpackagesJava. ContrairementàXSPqui estun langagegénéralistedestinéàpermettrel’inclusion den’importequelcodeJava dansdespagesXML, XSQL seconcentresur l’extractionde donnéesd’une baseOracleavecle langageSQL (quelquepeuétendu),sur l’inclusion au format XML du résultatde la requêtedansundocument,suivie enfind’unetransformationXSLT. XSQL estdoncdecepointdevuepluslimité queXSP,maiss’avèreencontrepartiebeaucoupplussimpleà utiliser.

Page 236: Comprendre XSLT

236 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

XSQL fournit laplupartdesfonctionnalitésquenousétudionsdepuisledébutdecechapitreetconstituedoncunexcellentexempled’uneréalisationpratiqued’un environnementdepublicationwebintégrantunebasededonnées.Ony trouve:

1. le paramétragedu formatdesortieXML, semblableà cequ’offre notrepetit outil ExportXML.java;

2. la possibilitéde paramétrerles requêtesavec desvariablesprovenantpar exempled’une requêteHTTP;

3. un enchaînementdu processusd’intégrationdesdonnéesissuesde la baseavecunetransformationXSLT ;

4. enfinunecloisonnement(presque)completentrelescouchesSQL,XML et XSLT.

NouscommençonsparquelquesexemplessimplesdedocumentsXSQL avantdedécrirelesprincipalesoptionsfourniesparcetoutil.

Exemplesde documentsXSQL

NousreprenonsbienentendunotrebaseStationet notredocumentPromotion.xml(page208)danslequelnoussouhaitonstoujoursintégrerdynamiquementdesdonnéesissuesdela base.Voici le documentXSQLpouratteindrecebut :

Exemple104 Promotion.xsql: Le documentXSQLavecla promotionpour Passac

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="Promotion.xsl" type="text/xsl"?>

<Promotion auteur="Jules"><Description>

Nous proposons une réduction de <Reduction>25</Reduction>pourcent, restreinte à la période du<Periode> <Debut>Septembre 2001</Debut>au <Fin>Octobre 2001</Fin> </Periode> pour tousles séjours dans certaines stations de vacances.L’automne est une saison <Important>merveilleuse</Important>

pour reprendre des forces à la montagne. Vous pourrezprofiter du calme,

d’une nature aux couleurs chatoyantes, et d’un contactprivilégié avec l’autochtone. <Important>Attentionle nombde de places offertes est limité.</Important>

</Description>

<xsql:query connection="connexionVisiteur"xmlns:xsql="urn:oracle-xsql">

SELECT * FROMStation WHEREnomStation=’Passac’</xsql:query>

</Promotion>

On retrouve les mêmeprincipesdéjàétudiéspour XSP (et, plus globalement,pour deslangagesdeproductiondeHTML dynamiquecommelesJSP).Cedocumentestun documentXML, certainesbalisesétantassociéesà un espacedenomparticulier(ici xsql ). Le processeurqui traitecedocumentreconnaîtcesbalisescommedesinstructions,déclencheun traitementet créeun nouveaudocumentdanslequellesbalises«dynamiques» sontremplacéesparle résultatdecetraitement.

LeprincipalélémentdeXSQLest p xsql:query q . SoncontenuestunerequêteSQL(ici l’interrogationdela tableStation), et il peutprendreun ensembled’attributspourparamétrernotammentla manièredontle résultatestmis enformeXML. Lesdeuxattributsutilisésdanscepremierexemplesont:

Page 237: Comprendre XSLT

7.3. XML DYNAMIQUE 237

r connection qui indique le nom de la connexion à utiliser pour accéderà Oracle; ce nom deconnexion estassocié,dansun fichier de paramétrage,au compteutilisateurainsi qu’à la baseàutiliser;

r la déclarationdel’espacedenomxmlns .

Cedocumentpeutêtretraitédansplusieursdesarchitecturesprésentéesprécédemment: avecun pro-grammelancédepuisla ligne decommande,avecuneservlet, ou dansunepageJSP.

Enl’absenced’indicationsurla miseenformesouhaitée,XSQL produitundocumentXML dela formesuivante:

Exemple105 Station.xsql: Le documentXSQLrésultatdela requêtesur Passac

<?xml version="1.0" encoding="ISO-8859-1"?>

<ROWSET><ROWid="1">

<nomStation>Passac</nomStation><capacite>400</capacite><lieu>Alpes</lieu><region>Europe</region><tarif>1000.00</tarif>

</ROW></ROWSET>

L’élémentracinedu documentest p ROWSETq (ensemblede lignes). Chaqueligne de la table estreprésentéeparun élémentdetypeROWSET, automatiquementidentifiéparun attribut id dont la valeur,par défaut, est simplementun compteursur les lignesdu résultat. Enfin chaquecolonneestégalementreprésentéeparunélément.

Cerésultatestintégrédansle documentprincipal. Éventuellementun programmeXSLT spécifiéparl’instruction detraitementp ?xml-stylesheet q estalorsappliquépoureffectuerunetransformation.

Voici maintenantcommentutiliser desparamètresprovenantd’une requêteHTTP. Nous reprenonsnotreexempled’un serveurwebpermettantd’interrogerla baseStationendonnanttrois paramètres(voirnotreservletpage223etsonformulaireassocié): le nomdela stationàafficher, le nomdel’élémentracinedu document,et le nomdel’élémentpourchaqueligne. Voici ceserviced’interrogationavecXSQL:

Exemple106 RequeteXSQL.xsql: DocumentXSQLavecparamètres

<?xml version="1.0" encoding="ISO-8859-1"?>

<xsql:query connection="connexionVisiteur"xmlns:xsql="urn:oracle-xsql"rowset-element="{@racine}"row-element="{@element}">

SELECT * FROMStation WHEREnomStation=’{@nomStation}’

</xsql:query>

Lesparamètressontreprésentésparla syntaxe@nomParam. On peutlesintégrerdanslesattributsdep xsql:query q , ou dansla requêteSQL elle-même.Cet exemplemontredeuxnouveauxattributsdecetélément:

r rowset-element définit le nom de l’élémentracinedu documentproduit, savaleurpar défautétantROWSET;

r row-element définit le nomdel’élémentpourchaquelignedu résultatdela requêteSQL.

Page 238: Comprendre XSLT

238 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

Le documentci-dessusrenvoie le résultatauformatXML, maison pourraitbienentenduappliquerunprogrammedetransformationXSLT surle serveuravantla transmissionauclient.

XSQL fournit doncuneinterfacetrèssimpleentreunebasededonnéesetXML. Il existedenombreusesautresélémentset optionspour choisir par exemplela miseen forme XML, le modede sérialisationdudocumentrésultat,ou, à l’in verse,le stockaged’un documentXML dansOracle. Nouscomplétonscetteprésentationen décrivant les possibilitésde mise en forme du documentXML produit par une requêteXSQL.

Options de sortiesXML

XSQL fournit desoptionsà plusieursniveauxpour les optionsde sortiesXML. Tout d’abord l’élémentp xsql:query q utilise un ensembled’attributsprésentésdansle tableau7.1. Les plus importantsontétéillustrésdanslesexemplesqui précèdent.

Nom de l’attrib ut Descriptionrowset-element Nomdel’élémentracinerow-element Nomdel’élémentpourchaquelignemax-rows Nombremaximaldelignesramenéesparla requêteskip-rows Nombredelignesà ignorerdansle résultatid-attribute Nomdel’attribut XML identifiantuneligne (id ) pardéfautid-attribute-column Nom de la colonneconstituantla clé du résultat (par défaut

XSQL créeun compteurdelignes)null-indicator Si yes , inclut lesvaleursà NULLavecun indicateur(pardéfaut

unevaleurà NULLn’engendrepasd’élément).tag-case Permetd’indiquer si les nomsd’élémentssont en majuscules,

minuscules,ou respectentla casseutiliséedansla requête.bind-params Définit unelistedeparamètres

Table7.1: Lesattributsdel’élémentxsql:query

Au niveaudela requêteSQLelle-même,onpeutagirsurle formatdurésultatendemandantnotammentuneimbricationdeséléments.En principeSQL estun langagequi agit surdestableset produitunetable.Dansunetablerelationnelle,on trouvedeslignesconstituéed’attributsdontla valeurest«atomique» (unentier, unechaînedecaractères).Onnepeutpasenthéoriedirequ’unevaleurestungraphe,uneautretable,ou toutestructureun tantsoit peucomplexe. Il n’existedonc,à aucunniveau,la possibilitédemanipulerunestructurehiérarchique.

Oraclefournit deuxtypesd’extensionspour étendrele modèlerelationnel: au niveaudu modèle,etau niveaudu langaged’interrogation. Au niveaudu modèlele SGBD d’Oracleest,depuisla version8,«relationnel-objet», etpermetd’imbriquerdestypesdedonnéescomplexesdansdestablesrelationnelles.La miseenformeXML d’unetabledecetypereprendexactementl’imbrication du modèleOracle.

La secondepossibilitéapparaîtauniveaudu langagelui-même,avec l’opérateurCURSORqui, utilisédansla clauseSELECT, permetdeconstituerunerésultatderequêtequi comprenddesattributssimplesetdestablesimbriquées.Voici un exemplederequêteSQL avecCURSOR:

SELECT nomStation, capacite,CURSOR(SELECTlibelle, prix FROMActivite

WHEREA.nomStation = S.nomStation) AS activitesFROM Station S

Dansla clauseSELECT, nomStation et capacite sont desvaleursatomiques(deschaînesdecaractères),mais l’évaluationde CURSORestunetable. Ce troisièmeattribut estnomméactivitesavecla clauseAS. Onobtientdoncunetableimbriquéedontvoici la représentationXML (ennouslimitantà la stationPassac).

Page 239: Comprendre XSLT

7.4. PERSPECTIVES 239

<ROWSET><ROWnum=’1’>

<nomStation>Passac</nomStation><capacite>400</capacite><activites>

<activites_row num=’1’><libelle>Ski</libelle><prix>200.00</prix>

</activites_row><activites_row num=’2’>

<libelle>Piscine</libelle><prix>20.00</prix>

</activites_row ></activites>

</ROW></ROWSET>

On peututiliser plusieurscurseurs,avecplusieursniveauxd’imbrication,cequi permetd’obtenirdesdocumentshiérarchiquesXML arbitrairementcomplexes.

7.4 Perspectives

Commedanstoutesituationoù dessystèmesbaséssur desreprésentationsdifférentesde l’informationdoiventcoexister, l’associationentreXML et unebasededonnéesrelationnelle,et lesconversionsnéces-sairesauxéchangesdansl’un ou l’autresens,introduisentun niveaudedifficultésupplémentairedansdesarchitectureslogiciellesdéjàpassablementcomplexes.Nousn’avonsparléici quedecequi relèvedenotresujet,l’exportationdedonnéesversXML afin deles intégrerà un systèmedepublicationbasésurXSLT.L’opérationinverse,le stockagede documentsXML dansunebasede données,estau moinsaussidéli-cate,la conversiond’une représentationhiérarchiquecommeXML versunereprésentationrelationnelle«à plat» étantdifficile àdéfinir sansperted’information.

Ce qu’une basede donnéesfait mieux queXML

La questionsuivanteseposedonc: puisquele modèledeXML semblepluspuissantqueceluidesbasesdedonnéesrelationnelles,pourquoinepasutilisercemodèleets’épargnerainsileprocessusdetransformationdesdonnées? Ou,pourdire leschosesplussimplement,XML est-il un formatdebasesdedonnées?

On peutêtretentéderépondre«oui», enprenantcommedéfinitionminimaled’unebasededonnéescelled’un ensembled’information,structuré,et pouvantêtresauvegardésur disque.CelaétantXML neproposepasbeaucoupplus dansce cadrequ’un simplefichier de texte. Mêmesi on prenden comptelenombreconsidérabled’outils qui existentmaintenantpour traiter desdocumentsXML, de très grandesdifférencessubsistentavec lesservicesfournis parun systèmedegestionde basededonnées.Citons-enquelques-unes:r Typage: il estdifficile d’exprimerdescontraintessurdesdonnéesXML, lesDTD étanttrèsinsuff-

isantesde ce point de vue. Or un SGBD estcapablede prendreen compteun grandnombredecontraintesetdegarantirleur satisfactionà toutmoment.r Interrogation: le langagequi serapprochele plus de SQL estprobablement... XSLT ! Il n’offrecependantpasdu tout les mêmesfacilités,notammenten termed’intégrationavec les langagesdeprogrammation;r Misesà jour : mêmesi on en parle moins, la possibilitéd’effectuerdesmisesà jour (insertion,destruction,modifications)estessentielle.Il n’existepasenXML d’équivalentauxclausesUPDATE,DELETEou INSERT. Onpeutbiensûrutiliserun éditeurdetexte,maisvecuneabsenceà peuprèstotaledecontrôle.

Page 240: Comprendre XSLT

240 CHAPTER7. PUBLICATION DE BASESDE DONNÉES

r Performances: lesSGBDproposentdesstructuresd’index trèsperformantespouraccéderauxdon-nées.r Sécurité,transactions,...: enfinbeaucoupd’aspectssystèmesliés à la sécuritédesdonnées(droitsd’accès,transactions,reprisessurpanne)manquentenXML.

CertainssystèmesutilisantXML commeformatnatif semblentencoursd’expérimentation,cequi per-mettra(it) de régler certainsde cesproblèmes.À l’heure actuelleil semblecependantplus raisonnabled’utiliser unebasededonnéesclassiquedèsqu’onabesoindegérerunensemblededonnéesdetaille con-séquente,et deprendreplutôt XML commeformatd’échangeou de«vue» surlesdonnéespourcertainesapplications.Il estcependantjustedesignalerquecertainstravauxmenéspar le W3C visentà lever cer-tainesdeslimitationsmentionnéesci-dessus.Nousencitonsbrièvementdeux: l’introduction d’un typageplusprécisavecXML Schema,et le langaged’interrogationXML Query.

Plus de typage: XMLSchema

TODO:qq paragraphessurXMl Schema

Interr ogation avecXML Query

TODO: idemavecXML Query

Page 241: Comprendre XSLT

Chapter 8

Un serveur de publication XML

Sommaire

241

Page 242: Comprendre XSLT

242 CHAPTER8. UN SERVEUR DE PUBLICATION XML

Page 243: Comprendre XSLT

Appendix A

L’envir onnementXML/A pache

Sommaire

A.1 Le projet XML/A pache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

A.2 Xalan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244

A.2.1 Préliminaire: le JavaDevelopmentKit . . . . . . . . . . . . . . . . . . . . . . 245

A.2.2 InstallationdeXalan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

A.2.3 Testd’expressionsXPathavecApplyXPath . . . . . . . . . . . . . . . . . . . . 245

A.2.4 EffectuerdestransformationsXSLT avecXalan . . . . . . . . . . . . . . . . . 246

A.2.5 Utiliser XalanenAppletouenServlet . . . . . . . . . . . . . . . . . . . . . . 247

A.3 Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

A.3.1 Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247

A.3.2 Cocoon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

A.4 Intégration Apache/Tomcat/Cocoon. . . . . . . . . . . . . . . . . . . . . . . . . . . 249

A.4.1 Compilateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250

A.4.2 Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

A.4.3 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

A.4.4 Lien Apache/Tomcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251

A.4.5 Et Cocoon? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

Nousdécrivonsdanscechapitrel’installationetl’utilisation desprincipauxoutilsduprojetXML/Apache1.Ceprojeta pourprincipauxobjectifsde fournir deslogicielset boîtesà outils de grandequalité,gratuitset développésen suivant la philosophieOpenSource: unecommunautéde programmeurcontribue, viale Web, à la conception,à l’élaborationet à l’amélioration de produitsdont les sourcessont librementdisponibles.Le sitederéférenceest:

http://xml.apache.org

Il existe maintenantune trèsgrandequantitéde logiciels intégrantdesfonctionnalitésde traitementXML, et nousne prétendonspasqueceuxde XML/Apache sontles meilleurs. Cet environnementoffresimplementl’avantaged’êtregratuit,des’installerrelativementfacilement,etdes’appuyersurleslibrairiesXML de la fondationApache,largementutiliséeset qui suiventde prèsl’évolution desnormesdu W3C(Xalanparexempleseprésentecommeun processeurXSLT totalementcompatibleavec la normeXSLT1.0). Touslesexemplesdecelivreont ététestésaveccesoutils.

1Nepasconfondreavecle serveurwebApache,qui n’estquel’un deslogiciels– le plusconnu– diffuséparla fondationApachedontlesobjectifssontplusgénéraux.

243

Page 244: Comprendre XSLT

244 APPENDIX A. L’ENVIRONNEMENTXML/APACHE

A.1 Le projet XML/A pache

Leprojetestsubdiviséenplusieurssous-projets.Voici ceuxdontnousdécrivonsl’installationetl’utilisation.Deuxsous-projetsqui nesontpasabordésici sontXang,unoutilsdeproductiondepageswebdynamiquesenJavaScript,etSOAP, un protocoled’échangesdeservicesXML.

1. Xerces,unensembled’outils d’analyseavecnotammentdesparseursSAX et DOM ;

2. Xalan,un processeurXSLT ;

3. Cocoon,un l’environnementdepublicationwebXML/XSLT ;

4. FOP, unelibrairie permettantdeformatterenPDFdesdocumentsXSL-FO.

Les parseursSAX et DOM fournis par Xercessontutiliséspar les autressous-projetspour analyseret sérialiserlesdocumentsXML : nousne détailleronspasl’interface(API) qui estdisponibleenJava etenC++. En revanchenousdécrivonsl’installation, et quelquesexempled’applicationdeXalan,qui peuts’utiliser indépendammentdetoutautreoutil pourlestâchessuivantes:

1. testinteractifd’expressionsXPathavecle programmeJava ApplyXPath;

2. transformation«statique» de documentsXML avecXSLT : un exemplede productionstatiqueestla générationdepagesHTML destinéesà êtreplacéessurunserveurweb;

3. appelà l’API dansle cadred’applicationsJava.

Xalans’installeet s’utilise extrêmementfacilementet peutvousfournir enpeude tempsun environ-nementdetest.

Leschosessontun peudifférentespourCocoonqui seprésentesousla formed’uneservlet, autrementdit un objetJava intégréà unserveurwebqui prendenchargedesrequêtesHTTP. Il s’agit doncd’un outilspécifiquementorientéversla publicationweb. À l’heure où ceslignessontécritesla versionstabledeCocoonestla1.8,maisuneversion2 – longtempsattendue–estenphasebétaetdevrait êtreprochainementdisponible.Cocoonen associationavecun serveurweb commeTomcatfournit un environnementtout àfait satisfaisantpourexpérimenterla publicationà basededocumentsXML/XSLT.

Enfinnousconcluonsle chapitreparl’installationd’unearchitecturepluscomplexeincluantle serveurweb Apacheassociéà PHPet à unebasede données,et communiquantavec Tomcatpour les servicesXML. Voici lessitesweboù vouspourrezrécupérertousleslogiciels:

r pourle serveurwebApache,c’estwww.apache.org;r pourTomcat,c’est java.apache.org;r pourPHP, c’estwww.php.net.

Toutesles installationssontdécritesenprenantcommeenvironnementderéférenceun serveurLinux.Les outils étantécrit en Java, il n’y a pasde grandesdifférencesquandon veut utiliser un serveur sousWindows: nouscitonscesdifférencesaufur et àmesure.

A.2 Xalan

Xalan estune librairie Java, accompagnéede plusieursprogrammesutilitaires ou de démonstration.Lalibrairie proposeuneAPI conformeà la – récente– normeTrAX qui définit l’interfaced’un processeurde transformationXSLT. Le fait dedéfinir uneinterfacecommunepermet(enprincipe...)depasserd’unprocesseuràun autresansavoir à réécriretouteuneapplication.

Xalans’appuieenprincipesurlesparseursXercesmaisil peut– toujoursenprincipe– utiliserd’autresparseurs.Il existeenJavaet C++: c’estla versionJava quenousdécrivonsci-dessous.

Page 245: Comprendre XSLT

A.2. XALAN 245

A.2.1 Préliminair e: le JavaDevelopmentKit

Toutesles applicationssontécritesen Java. Il estdoncindispensablede disposerd’un compilateurJavaraisonnablementrécent,par exemplele 1.2. Si Java n’est pasinstallé sur votre machine,récupérezlaversionla plus récentedu JavaDevelopmentKit (JDK) sur le sitehttp://java.sum.comet installez-la,parexempledans/usr/local. Parexemple:

cp jdk-1_2_2_007-linux-i386.tar.gz /usr/localtar xvfz jdk-1_2_2_007-linux-i386.tar.gz /usr/local

Cescommandescréentunrépertoirejdk-1.2.2. Il resteàmodifierdeuxvariablesd’environnementpourquele JDK soit disponible.Placezparexemplelescommandessuivantesdansvotrefichier .bashrc :

export JAVA_HOME=jdk-1.2.2export PATH=$JAVA_HOME/bin:$PATH

SousWindowsil suffit desuivre exatementla mêmedémarche,endéfinissantlesvariablessoitdanslefichier autoexec.bat, soitavecle panneaudecontrôle,optionSystème.

À partirdelà vouspouvezcompilerducodeJavaavecla commandejavac , etexécuterunprogrammeJava avecla commandejava . Au casoù vousneconnaitriezpasdu tout Java,rassurez-vous: il n’y a pasbesoind’écriredu code.

A.2.2 Installation de Xalan

Récupérezla dernièreversionsur le sitexml.apache.org. À l’heureoù ceslignessontécritesc’estXalan-Java 2. Le fichier pour Linux s’appellexalan-XXX.tar.gz, et pour Windows xalan-XXX.tar.zip (le XXXétantunepartievariableenfonctiondesévolutions).Placezl’archivedansle répertoiredevotrechoix, etdécompressez-la.

cd /usr/localcp xalan-XXX.tar.gz .tar xvfz xalan-XXX.tar.gz

Celacréeun répertoirexalan-XXXqui contient,entreautre:

1. le sous-répertoirebin avectouteslesarchives(librairies)Java (.jar) ;

2. un répertoiredocsavectoutela documentationauformatHTML ;

3. un répertoiresamplesavecdenombreuxexemplesd’utilisation.

Il neresteplusqu’à placerlesdeuxarchivesxerces.jaret xalan.jar dansla variabled’environnementCLASSPATH. Voici un exemple(toujourssousLinux) : utilisez les commandeséquivalentespour Win-dows.

export CLASSPATH=/usr/local/xalan-XXX/bin /xala n.jar :$CLAS SPATHexport CLASSPATH=/usr/local/xalan-XXX/bin /xerc es.ja r:$CLA SSPATH

C’estprêt! Il estmaintenantpossibledecompilerdesprogrammesutilisantl’API deXalan.

A.2.3 Testd’expressionsXPath avecApplyXPath

Xalan comprendun package org.apache.xpath.XPathAPI dédiéau traitementdesexpressionsXPath. On peutappelerles méthodesde ce package pour faire de la programmationXML/XPath,maisil y a beaucoupplus simple: un programmeApplyXPath permetd’interpréterinteractivementdescom-mandesXPath. Ceprogrammesetrouve dansle sous-répertoiresamples/ApplyXPath. Il fautcommencerparcompilerApplyXPath.java:

Page 246: Comprendre XSLT

246 APPENDIX A. L’ENVIRONNEMENTXML/APACHE

javac ApplyXPath.java

OnobtientunfichierApplyXPath.classqui peutêtreexécutéparunemachinejavaavecla commande2 :java ApplyXpath fichierXML expressionXPath

VouspouveztestervosexpressionsXPath. Voici quelquesexemples,enutilisant le fichier ExArbreX-Path.xmlquenousavonsutilisé dansle chapitre2 pourprésenterXPath(voir page87) et quevouspouveztrouversurnotresite(le «%» indiquele promptdu shellLinux) :

% java ApplyXPath ExArbreXPath.xml /A/B<output><B att1="a1">

<D>Texte1</D><D>Texte2</D>

</B><B att1="a2">

<D>Texte2</D></B>

</output>

% java ApplyXPath ExArbreXPath.xml /A/*[@att2]<output><C att2="a3" att3="15"/></output>

% java ApplyXPath ExArbreXPath.xml /A/C/@att3<output>15</output>

NoterquetouteslesexpressionsXPathsontbaséessurdescheminsabsolus.

A.2.4 Effectuer destransformations XSLT avecXalan

Le processeurXSLT deXalanpeut,commele processeurXPath,êtreappeléà partir de la ligne decom-mande.Voici la syntaxedebase:java java org.apache.xalan.xslt.Process -in fichierXML -xsl FichierXSL -out fichierHTML

L’option -out est facultative: par défaut le documentrésultatestaffiché à l’écran. L’option -xsl estégalementfacultativesi ledocumentXML contientuneinstructiondetraitementp ?xsl-stylesheet qindiquantle programmeXSLT à appliquer.

Voici unexempledetransformationinteractive,avecdesdocumentsextraitsdesexemplesdonnésdansle chapitre1.

% java org.apache.xalan.xslt.Process -in Alien.xml -xsl Film.xsl<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Film: Alien</title></head><body bgcolor="white"><p><img height="220" align="left" SRC="Alien.gif"><h1><i>Alien</i>

2Le fichier ApplyXPath.classdoit êtredansun répertoireréférencésparla variableCLASSPATH.

Page 247: Comprendre XSLT

A.3. COCOON 247

</h1>Science-fiction,<i>Etats Unis</i>,1979</p>

<p>Mis en sc&egrave;ne par <b>Ridley Scott</b>

<h3>R&eacute;sum&eacute;</h3>Pr&egr ave;s d’un vaisseauspatial &eacute;chou&eacute; sur une lointaineplan&egrave;te, des Terriens en missiond&eacute;couvrent de bien &eacute;tranges"oeufs". Ils en ram&egrave;nent un &agrave; bord,ignorant qu’ils viennent d’introduire parmi euxun huiti&egrave;me passager particuli&egrave;rementf&eacute;roce et meurtrier.</p></body>

Ce moded’utilisation de Xalan peutêtreutile pour testerdesprogrammesXSLT, ainsi quepour en-gendrerdessitesHTML «statiques» etéviterle coûtdetransformationsdynamiques.De trèsnombreusesautresoptionssontdisponiblespourcontrôlerle formatdesortie,passerdesparamètres,etc.La définitiondeparamètredepremierniveauparexemples’effectueavecl’option :

-PARAM nomParam valeurParam

Si leprogrammeXSLT appeléaunélémentdepremierniveaup xsl:param name=’nomParam’ q ,la valeurvaleurParam lui seraaffectée. Nousrenvoyonsà la documentationde cet utilitaire (fichierdocs/commandline.html) pourplusd’informations.

A.2.5 Utiliser Xalan enAppletou en Servlet

LesexemplesfournisparXalanincluentuneAppletqui fournit lapossibilitéd’effectuerdestransformationscôtéclient,et uneservletpoureffectuerdestransformationscôtéserveur.

L’appletsetrouvedansle répertoiresamples/AppletXMLtoHTML, avecunepetitedocumentationetunfichier appletXMLtoHTML.htmlqui permetd’avoir un aperçude sespossibilités.En résumé,le principeconsisteàchargerlesarchivesxerces.jaretxalan.jardansle navigateuretàaccéderauxfonctionnalitésdetransformationavecJavaScriptcequi permetdetout faireenlocal.

L’inconvénientimmédiatementrencontréest la nécessitéde transférerdu serveur au client les deuxarchivesqui sonttrèsvolumineuses: 1,8M pourxerces.jaret 800Kpourxerces.jar!!

En cequi conernela servlet, elle setrouve danssamples/servlet(fichier ApplyXSLT.javaavecun peude documentation.La miseen placed’une servletestun peucompliquéepar la nécessitéd’utiliser unservletcontainercommeTomcat.DeplusCocoonquenousprésentonsdansla prochainesectionoffre desfonctionnalitéspluspuissantes.

A.3 Cocoon

Cocoondoit êtreassociéà un serveurweb capablede gérerlesservlets. Nousproposonsl’utilisation deTomcat,un serveur web entièrementécrit en java et égalementfourni par la fondationApache. Cocoonpeutcependantfonctionneren associationavec tout serveurcompatibleavec la version2.0 desservlets:nousvousrenvoyonsauxspécificationsdisponiblessurle sitehttp://java.sun.org et à la documentationdeCocoonpourtouteinstallationavecun serveurautrequeTomcat.

A.3.1 Tomcat

Tomcatest un servletcontainerce qui correspond,pour dire les chosesbrièvement,à un serveur webcapablede charger desobjetsjava (les servlets) qui vont prendreen charge certainesrequêtesHTPPetengendrerdynamiquementle documentHTML constituantla réponse.

Page 248: Comprendre XSLT

248 APPENDIX A. L’ENVIRONNEMENTXML/APACHE

Tomcatest un sous-projetde Jakarta/Apache,le projet de la fondationApachedédiéaux environ-nementsJava, commeCocoonestun sous-projetdeXML/Apache. VouspouvezrécupérerTomcatsur lesite

http://jakarta.apache.org

Si vousn’avezpasl’intention demodifierle codesource(!), l’archivecontenantlesexécutablessuffira.Au momentoù ceslignessontécritesla versionde référenceest la 3.2.2,et le fichier archive s’appellejakarta-tomcat-3.2.2.tar.gz.

Commed’habitude,il fautdécompacterl’archivequelquepart.

cd /usr/localtar xvfz jakarta-tomcat-3.2.2.tar.gz

Et maintenantunebonnenouvelle: Tomcatest prêt! On peutsimplementle lanceren allant dansjakarta-tomcat-3.2.2et enentrant:

bin/startup.sh

Si la variableJAVA_HOMEest correctementdéfinie,Tomcatdevrait se lancersansproblème. Celaétantil estsansdoutepréférablededéfinir la variabled’environnementTOMCAT_HOMEqui doit contenirle chemind’accèsversjakarta-tomcat-3.2.2:

export TOMCAT_HOME=/usr/local/jakarta-tom cat-3 .2.2

Tomcatestun serveurweb. Par défaut il estlancésur le port 8080(vouspouvezchangercettevaleurdanslefichierconf/server.xml). Aprèslestartup, onpeutdoncaccéderàTomcatàl’URL http://localhost:8080.La paged’accueilproposedetesterquelquesexemplesdeservletset depagesJSP.

PourarrêterTomcat,on exécutesimplement:

bin/shutdown.sh

Le scripttomcat.shestlancéparstartupet shutdownaveclesoptionsrespectivesstart etstop. Onpeutdoncs’enservircommescriptd’initialisationdeTomcataulancementdeLinux. NoussommesmaintenantprêtspourinstallerCocoon.

A.3.2 Cocoon

Cocoonestsimplement(!) uneservletqui va êtreappeléeparTomcat.RécupérerCocoon,sousla formehabituelled’un fichier .tar.gz, surle sitehttpd://xml.apache.orget l’installer (parexemple)dans/usr/local/.Onobtient,endécompressantl’archive,un répertoirecocoon-1.8(à la versionprès).

Pour installer CocoondansTomcat, il faut commencerpar quelquescopiesde fichier. Notez queCocoonest livré avec sespropresversionsde xalan.jar et xerces.jarde manièreà éviter les problèmesconsécutifsà desincompatibilitésdeversion.Il estdoncrecommandédes’entenir auxlibrairiesfournieset denepaschercherà lesmélangeravecd’autres.

1. Copier tous les .jar de COCOON_HOME/libdansTOMCAT_HOME/lib; copier égalementCO-COON_HOME/bin/cocoon.jardansTOMCAT_HOME/lib

Tomcatchargeautomatiquementtouteslesclassesdontlefichier.jar setrouvedansTOMCAT_HOME/lib,cequi évited’avoir à configurercechargement.

2. Il faut maintenantajouterun «contexte» à Tomcatpour lui indiquerquandil doit utiliser Cocoon.Pourcela,ajouterla ligne suivantedansle fichier TOMCAT_HOME/conf/server.xml.

<Context path="/cocoon" docBase="webapps/cocoon"debug="0" reloadable="true" >

</Context>

Page 249: Comprendre XSLT

A.4. INTÉGRATION APACHE/TOMCAT/COCOON 249

Maintenant,touteURL commençantpar /cocoonseratraitéeparCocoon,et lesfichiersserontprisdansTOMCAT_HOME/webapps/cocoonqui tient lieu d’adresserelative.

3. Finalement,il resteàplacerdesfichiersXML dansTOMCAT_HOME/webapps/cocoon. Commencezparcréerlesrépertoires:

mkdir TOMCAT_HOME/webapps/cocoonmkdir TOMCAT_HOME/webapps/cocoon/WEB-INF

PuiscopiezlesfichiersfournisparCocoon:

cp $COCOON_HOME/src/WEB-INF/web.xml$TOMCAT_HOME/webapps/cocoon/WEB-INF

cp $COCOON_HOME/conf/cocoon.properties$TOMCAT_HOME/webapps/cocoon/WEB-INF

Important : il faut éditer le fichier web.xml et indiquer un chemind’accèsrelatif vers le fichiercocoon.properties. Cechemindoit êtreWEB-INF/cocoon.properties. Voici la partiedu fichier, avecla bonnevaleur.

<servlet><servlet-name>org.apache.cocoon.Coco on</se rvlet -name ><servlet-class>org.apache.cocoon.Coc oon</s ervle t-cla ss><init-param>

<param-name>properties</param-name><param-value>WEB-INF/cocoon.propert ies</p aram- value >

</init-param></servlet>

4. Dernièreopération: copiezlesfichiersdeCOCOON_HOME/samplesdansTOMCAT_HOME/webapps/cocoon/samples.

Voilà ! RelancezTomcat,et essayezd’accéderà l’URL http:localhost:8080/cocoon/Cocoon.xml ouhttp:localhost:8080/cocoon/samples. Enprincipetoutdoit biensepassermais...il sepeutquele problèmesuivantsurvienne: Tomcatinitialise automatiquementla variableCLASSPATH audémarrage,enprenanttousles .jar de TOMCAT_HOME/lib. Or, pour queCocoonfonctionne,le .jar de Xercesdoit êtreplacéavantlesautres.jar dansle CLASSPATH.

Si Cocoonrefusede traiter un documentXML, c’est probablementde là quevient le problème(unjour où l’autre cetteanomalieseracorrigée).La manipulationsuivantedevrait tout régler: renommezlesfichierslib/xml.jar et lib/parser.jar en lib/zxml.jaret lib/zparser.jar. C’estscabreux,maisefficace.

Quandtout marche,vousêteséquipésd’un environnementdepublicationwebà basedeXML. Nousvousinvitonsà consulterles exemplesfournisdanscocoon/samples, enaccédantavecvotrenavigateuràl’URL

http:localhost:8080/cocoon/samples

Bien entenduvouspouvezégalementrécupérerlesexemplesdecelivre et lestesterdansvotrepropreenvironnement.

A.4 Intégration Apache/Tomcat/Cocoon

Tomcatest un serveur web généralistequi est capablede fournir desdocumentsHTML, de gérerdesservletset de traiter desJava ServerPages, uneforme simplifiéedesservletspermettantd’intégrersou-plementbalisesHTML et instructionsJava. En pratiqueil n’est cependantpasrecommandéde baseren

Page 250: Comprendre XSLT

250 APPENDIX A. L’ENVIRONNEMENTXML/APACHE

totalitéunserveurwebsurTomcat.Si Tomcatestparfait pourgérerdesservletset leursdérivés(JSP),il estloin d’êtreaussisouple,aussiparamétrableet aussiouvertqu’un serveurwebclassiquecommeApache.

Une solution robusteet ouverte à de très nombreuxoutils de développementconsistedonc à fairecollaborerun serveurcommeApacheet Tomcat,selonunearchitectureillustréedansla figureA.1. Deuxserveursweb, Apacheet Tomcat,tournenten parallèle,chacunen écoutesur le port réseauqui leur estaffecté. DansnotreschémaApacheesten écoutesur le port HTTP standard80, tandisqueTomcatestassociéauport8080.

Cocoon Servlet A

Apache

Programmes CGI Pages HTML

Pages JSPDoc. XML

Tomcat

808080

Requêtes HTTP

Scripts PHP

Transfert requêtesServlets

FigureA.1: ArchitectureApache-Tomcat-Cocoon

Toutesles requêtespeuventêtreadresséesau port 80: s’il s’agit de demandesHTTP pour desdocu-mentsHTML ou PHP, Apachelesprendenchargesansrecourirà Tomcat.En revanchedesdemandesquiimpliquentlesservicesbaséssurdesservletssonttransmisparApacheàTomcat.

C’estl’installationdecettearchitecturequenousdécrivonsci-dessous.Encoreunefois il esttoutà faitpossibledes’arrêterà l’installationdeTomcatseul,etdes’enservircommeenvironnementdetest.

Touteslesindicationsqui suiventont ététestéessousuneversion7.0dela distributionSuSedeLinux.

A.4.1 Compilateur

Éventuellement,il fautrécupérerle compilateurGNU C++si vousnel’avezpas.Onpeutle trouverparex-empleàhttp://www.gnu.ai.mit.edu/software/gcc/gcc.htmlousurunsitemiroir GNU. Voici lescommandespermettantd’installerle compilateur:

1. Récupérezparle fichier gcc-2.8.1.tar.gz(ouversionsupérieure)et placezle dans/usr/local/src.

2. Décompressezl’archive,etextrayezsoncontenu:

% gunzip gcc-2.8.1.tar.gz% tar xvf gcc-2.8.1.tar

Cequi créeun nouveaurépertoiregcc-2.8.1dans/usr/local/src.

3. Placezvousdanscerépertoireavecla commande

% cd gcc-8.2.1

4. Entrezsuccessivementlescommandessuivantes:

% ./configure% make% make install

C’esttout! Pardéfaut,l’installation sefait dans/usr/local/bin . Il fautdoncmettrecerépertoireaudébut dela variablePATH, avecunecommandequi dépenddu shellemployé, ici pourlesshelldetypeBournecommebash:

% export PATH=/usr/local/bin:$PATHVouspouvezvérifieralorsquetouts’estbienpasséaveclacommandegcc -v qui devraitvousafficher

gcc version 2.8.1 (ouversionsupérieure).

Page 251: Comprendre XSLT

A.4. INTÉGRATION APACHE/TOMCAT/COCOON 251

A.4.2 Apache

Le plus simpled’installer Apacheavec les modulesdynamiques(DSO), ce qui évite de tout recompilerà chaquefois. Commencezpardécompacterl’archive apache_1.3.20(ou uneversionultérieure)quelquepart, disonsdans/usr/local/src/apache_1.3.20. Placezle fichier archive dans/usr/local/src et entrezlacommandesuivante:

% tar xvfz apache_1.3.20.tar.gzTouslesfichiersvontêtreextraitsdel’archiveetplacésdansle répertoire/usr/local/src/apache_1.3.20.

Allez alorsdanscerépertoireetentrezlescommandessuivantes:

./configure --prefix=/usr/local/apache --enable-module=somakemake install

Apacheestmaintenantprêtet installédans/usr/local/apache. Entrezlescommandessuivantes: % cd/usr/local/apache% ./bin/apachectl start

httpdestlancéet semetenécoutesur le port 80 (à moinsquevousn’ayezchangéla valeurdePortdanshttpd.conf). Pour lanceret stopperApacheavec Linux, copiezle script apachectldans/etc/rc.d etcréezdans/etc/rc.d/rc3.ddeuxlienscommesuit:

ln -s ../apachectl S33Apacheln -s ../apachectl K33Apache

A.4.3 PHP

Pourajouterle modulePHP(optionnel!), entrezles commandessuivantesdansle répertoireracinedessourcesdePHP(onpeutajouterl’option --with-mysql si vousavezinstalléMySQL) :

./configure --with-apxs=/usr/local/apache/bin/ apxsmakemake install

La dernièrecommandecopiele fichier libphp4.sodans/usr/local/apache/libexec, et indiqueà Apachequele moduledoit êtrechargéenplaçantla commandesuivantedansle fichier httpd.conf:

LoadModule php4_module libexec/libphp4.so

Il neresteplusqu’àdécommenterleslignessuivantesdanshttpd.confpourquePHPsoit disponible:

AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phps

Maintenantsi MySQL ou un autreSGBD estaussiinstallé,on disposed’un environnementcompletpour faire de la programmationweb et basede donnéesavec PHP. On seservirade cet environnementpour toutesles requêtesHTTP demandantdu HTML ou du PHP, et on redirigeraversTomcattouteslesdemandesdetypeXML/XSLT ou JSP.

A.4.4 Lien Apache/Tomcat

Il resteà bien répartir le travail entreApacheet Tomcat. Le premierdoit prendreen charge tous lesdocumentsclassiques,type HTML, PHPou autre,et passerla main au secondpour les servlets,les JSPou les documentsXML. Initialement,on utilisait le moduleJServpour permettreà Apachede prendreen compteles servlets. Maintenantil estplus simpled’utiliser le moduleJK. Un fichier mod_jk.soestdisponiblesur java.apache.org avec Tomcat. Installezce fichier dans/usr/local/apache/libexec. Si parmalheurcefichier necorrespondpasà votredistribution, il n’y aplusqu’à le recompiler...

Page 252: Comprendre XSLT

252 APPENDIX A. L’ENVIRONNEMENTXML/APACHE

1. Récupérezle codesourcedeTomcatsur java.apache.org

2. Décompressez-le,etallezdanssrc/native/apache1.3(vérifiezla versiond’Apache).

3. La commandedecompilationestla suivante:

apxs -o mod_jk.so -I../jk -I/usr/local/jdk/include \-I/usr/local/jdk/include/linux -I../jk \

-c *.c ../jk/*.c

Le programmeapxsestdans/usr/local/apache/bin, et il fautvérifierquele JDK estbieninstallédans/usr/local, ou modifierlesoptions-I demanièreappropriée.

4. Copiezle fichier mod_jk.sodans/usr/local/apache/libexec.

Maintenantil faut inclure dansle fichier danshttpd.conf les directivespour charger le moduleJK etpourlui signalerquecertainesURL doiventêtretransmisesà Tomcat.

Par chance(!) Tomcatproduit automatiquementun fichier de configurationqui doit suffire danslaplupartdescas. Cefichier estdansTOMCAT_HOME/confet s’appellemod_jk.conf-auto. Attention: cefichier estregénéréà chaquelancementdeTomcat.Commencezparle copieravantdefaireunemodifica-tion:

cp mod_jk.conf-auto mon-mod-jk.conf

Il fautinclurecefichier dansle httpd.conf:

Include /usr/local/jakarta-tomcat-3.2.1/c onf/m on-mo d-jk.c onf

Cefichier inclut lui-mêmeunautrefichier, nomméworkers.properties, qui indiqueàApachecommentcommuniqueravecTomcat.Il fautéditerworkers.propertiesetmettrelesbonnesvaleurs.Parexemple:

workers.tomcat_home=usr/local/jakar ta-tom cat-3 .2.1workers.java_home=/usr/lib/jdk1.1.8ps=/

Bien. RedémarronsApacheetTomcat,etessayonsd’accéderà l’URL suivante:

http://localhost/examples/jsp/

C’est le serveurApachequi a reçula requête(noterl’absencedu port 8080). Commeelle commencepar /examples, Apachetransmetcetterequêteà Tomcat. Cetteredirectionestspécifiéepar unedirectiveJkMoun t dansle fichier mon-mod-jk.conf.

A.4.5 Et Cocoon?

Il resteà indiqueràApachecequ’il fautfaireenprésenced’un fichierXML. Bienentenduil fauttraiterceXML avecCocoon.Voici leslignesàajouterdansle fichier mon-mod-jk.conf.

Alias /cocoon TOMCAT_HOME/webapps/cocoon<Directory "TOMCAT_HOME/webapps/cocoon">Options Indexes FollowSymLinks</Directory>JkMount /cocoon/*.xml ajp12AddType text/xml .xml

<Location /cocoon/WEB-INF/ >AllowOverride Nonedeny from all</Location>

Maintenant,vousdevriez,enaccédantà Apache,pouvoir redirigerversCocoonuneURL comme:

localhost://cocoon/Cocoon.xml

Page 253: Comprendre XSLT

Appendix B

RéférenceXPath/XSLT

Sommaire

B.1 ÉlémentsXSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

B.2 FonctionsXPath/XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282

Cetteannexe estconsacréeauxélémentset aux fonctionsXLST. Elle estconçueet présentéecommeune référence,venantcompléterles chapitres«explicatifs» qui précèdent. Contrairementaux autreschapitresde ce livre qui suivaientun ordrebasésur la thématiqueet la miseen œuvredesfonctionalitésXSLT, la présentationsuit l’ordre alphabétiquepourfaciliter la recherche.Nousdonnonsunedescriptionla plusconciseet informativepossibledechaqueélément,enrenvoyantsi besoinestà la pagedu livre quidéveloppedesexplicationset desexemplessursonutilisation.

Vouspouvez aussivousaiderde l’annexe pour trouver toutesles pagesde ce livre qui traitentd’unélémentXSLT donné,lespagesrelativesà la référenceétantindiquéesengras.

B.1 ÉlémentsXSLT

La liste desélémentsXSLT a étédonnéedansle chapitre3, avecunerépartitionen élémentsdepremierniveau(tableau3.1 page112)et en instructions(tableau3.2 page114). Danscequi suit nousreprenons,dansl’ordre alphabétiquecettefois, touscesélémentsendonnantla syntaxecomplète,unedescriptiondela sémantique,etéventuellementunoudeuxexemplescomplétantceuxquevousavezdéjàputrouverdansleschapitresqui précèdent.

Chaqueélémentestdéfini parsontype, la liste desesattributs,et le typedesoncontenu.Pourlesat-tributsnousdistinguonsceuxqui sontobligatoires,indiquésengras, deceuxqui sontoptionnels,indiquéssimplementavecunepoliceà chasse fixe .

Il estpossibled’exprimer descontraintessur le type d’un attribut ou d’un élémentsousla forme decatégoriessyntaxiquesqui définissentla forme quepeutprendrela valeurde l’attribut ou le contenudel’élément.Quandc’estle casnousl’indiquonsdansla descriptiondel’élément.Lescatégoriessyntaxiqueslespluscourantessontrappeléesdansle tableauB.1.

NousutilisonslesconventionsdesDTD pourindiqueréventuellementl’ordreoulamultiplicitéd’apparitiondetelle ou tellecatégoriesyntaxiquedansle contenud’un élément.

xsl:apply-imports

Syntaxe

p xsl:apply-imports/ q253

Page 254: Comprendre XSLT

254 APPENDIX B. RÉFÉRENCEXPATH/XSLT

Désignation DescriptionExpression TouteexpressionXPathQName Le termeQualified name(QName) désignetout

nomd’élémentXML valide,commeparexemplexbook:monEl . Un QNamese composed’unpréfixe, optionnel(en l’occurrencexbook ), cor-respondantà un espacede nom déclaré,et d’unnomlocal, obligatoire(ici monEl )

NCName Cette catégoriedésignetout nom XML valide,utilisablepar exemplepor un préfixe, ou un nomlocal,ou un nomd’élément.

Pattern Les patterns appartiennentau sous-ensembledes expressionsXPath autoriséesdansl’attributmatch de l’élément xsl:template : voirpage119

URI Un Uniform Resource Identifier. Il prendle plussouvent la forme d’un fichier local, ou d’uneadresseHTTP

Corps de règle Un corpsde règle(voir page111) esttoutecom-binaison de texte littéral, d’éléments littéraux(c’est-à-direnon interprétéspar le processeur)etd’instructionsXSLT correctementformées. Uncorpsde règle définit un fragmentdu documentXML à instancieraucoursdu traitement

TableB.1: Catégoriessyntaxiques

Description

QuandonimporteunprogrammeXSLT dansunautre,lesrèglesduprogrammeimportéontunepriorité in-férieureàcellesduprogrammeimportateur. Unedesconséquencesestquela règleimportéeestremplacée,ce qui n’est pastoujoursl’ef fet souhaité. On peut trèsbien vouloir utiliser cetterègle,et la compléterpar d’autresinstructions. Dansce cason utilise, dansle corpsde la règle, l’instruction xsl:apply-imports .

Cettefonctionnalités’apparenteaumécanismedesurchargedeméthodedanslaprogrammationorientée-objet.Notezqu’il estsouventpossibled’obtenirle mêmerésultatavecxsl:call-template .

XSLT prévoit la possibilitédepasserdesparamètresà la règleimportéeenplaçantdanssoncontenuuneouplusieursinstructionsxsl:with-param (voir page282).

Exemple

Voici par exempleun programmeXSLT qui contientunerèglede présentationstandardpour le contenud’un élémentp PERSONNEq (nom,prénom,datedenaissance):

Exemple107 Personne.xsl: Un règlegénériquepour lespersonnes

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="/"><html>

<head><title>Ficher personne</title></head><body bgcolor="white">

<xsl:apply-templates/>

Page 255: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 255

</body></html></xsl:template>

<xsl:template match="PERSONNE"><b> Prénom</b> : <xsl:value-of select="PRENOM"/>,<b> Nom </b> :<xsl:value-of select="NOM"/>,

Né le <i><xsl:value-of select="NAISSANCE"/></i></xsl:template>

</xsl:stylesheet>

Maintenantsupposonsqu’on se trouve avec une occurrenced’un élémentde type PERSONNEplusdétaillée,commecelledu fichier ci-dessous.

Exemple108 JohnDoe.xml: LesalariéJohnDoe

<?xml version="1.0" encoding="ISO-8859-1"?>

<PERSONNENOSS="17517652987"><NOM>Doe</NOM><PRENOM>John</PRENOM><NAISSANCE>15:10:1981</NAISSANCE><POSTE>Directeur Informatique</POSTE><SALAIRE>50 000</SALAIRE>

</PERSONNE>

Au lieuderedéfinircomplètementla règleduprogrammePersonne.xsl, onpeutl’importer, puisl’utiliseravecxsl:apply-import insérédansla nouvelle règledetraitementdesélémentsdetypePERSONNE

Exemple109 ApplyImports.xsl: Utilisation dexsl:apply-imports

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:import href="Personne.xsl"/><xsl:output method="html" indent="yes"/>

<xsl:template match="/"><html>

<head><title>Ficher personne</title></head><body bgcolor="white">

<xsl:apply-templates/></body></html>

</xsl:template>

<xsl:template match="PERSONNE"><xsl:apply-imports/>

<b> Poste</b> : <xsl:value-of select="POSTE"/>,<b> Salaire </b> :<xsl:value-of select="SALAIRE"/>

</xsl:template>

</xsl:stylesheet>

Unerègleestutiliséedansxsl:apply-imports si etseulementsi elles’appliqueaunœudcourantet si elle a été importée. Une solution simple pour être sûr qu’une règle importéeet une règle locales’appliquentaumêmenœudestbienentenduqu’ellesaienttoutesdeuxle mêmepattern.

Page 256: Comprendre XSLT

256 APPENDIX B. RÉFÉRENCEXPATH/XSLT

xsl:apply-templates

Syntaxe

p xsl:apply-templatesselect= Expressionmode=QNameq

( p xsl:with-param q | p xsl-sort q ) sp /xsl:apply-templates qDescription

Cetteinstructiondésignetousles nœudsà traiter au seindu documentsource(ou, éventuellement,d’undocumentréférencéparla fonctiondocument()). Le processeurdéterminealorspourchaqueélémentsélec-tionnéla règleàappliquer. Lesdeuxattributspossiblessontoptionnels.L’attribut select estuneexpres-sionXPathdont l’évaluationdoit donnerun ensembledenœuds.Si cetteexpressionestrelative, le nœudcontexte est le nœuddu documentsourcequi a instanciéla règlecontenantxsl:apply-templates(voir page81). Si select estabsent,alorslesnœudssélectionnéssontlesfils dunœudcourant(autrementla valeurpardéfautdeselect estchild::node() ).

L’attribut mode indique un critère complémentairepour la sélectiondesrèglesà appliquer. Si cetattribut estprésentavec ue valeurnomMode, seulesles règlesxsl:template ayantelles-mêmesunattribut mode égaleà nomModeserontprisesencompte(voir page126).

Onpeutpasserdesparamètresauxrèglesdéclenchéesimportéeenplaçantdanslecontenudexsl:apply-templates un ou plusieursinstructionsxsl:with-param (voir page282).

Par défaut les élémentssélectionnéssontpris en comptedansl’ordre de parcoursdu document.Enintroduisantun ou plusieursélémentsxsl:sort , on peutchangercetordre: voir page277.

Exemples

xsl:apply-templates estbienentendul’un desélémentslesplusutilisés.Detrèsnombreuxexempleont étédonnésdanscelivre: voir notammentla sectionconsacréeaurègles,page119du chapitre3.

xsl:attrib ute

Syntaxe

p xsl:atrributename=QNamenamespace= URI q

Corps de règle p /xsl:attribute qDescription

Cet élémentdéclenchel’ajout d’un attribut dansl’élément courantdu documentrésultat. Cet élémentcourantpeutêtresoit un élémentlittéral, soit un élémentcrééavec l’instruction xsl:element , soit unélémentdu documentsourcecopiéavec xsl:copy . L’élémentxsl:attribute doit être instanciéimmédiatementaprèsla baliseouvrantedel’élémentcourant.

Le contenudexsl:attribute définit lavaleurdel’attribut. C’estuncorpsderèglequi peutcontenird’autresinstructionsXSLT, etdoit impérativementengendrerunnœuddetypeText (doncsansmarquage).

Il estpossibledecalculer lesdeuxattributs,name et namespace , enutilisantdesexpressionsXPathencadréespar { }, désignéespar le terme(attributevaluetemplate). Cemêmemécanismeestapplicablepourplacerdirectementlesattributsdansl’élément,sansavoir doncbesoind’utiliser xsl:attribute .Voici quelquesexemplespourillustrer cespossibilités.

Page 257: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 257

Exemples

Reprenonsle documentJohnDoe.xml, page255. Il contientun élémentracinede typePERSONNE, avecdesfils NOMetPRENOM. Le programmesuivantcréeun documentcontenantun seulélément,lesfils étanttransformésenattributs.

Exemple110 Attribute1.xsl: L’élémentxsl:attributes

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="PERSONNE"><PERSONNE>

<xsl:attribute name="NOM"><xsl:value-of select="NOM"/>

</xsl:attribute><xsl:attribute name="PRENOM">

<xsl:value-of select="PRENOM"/></xsl:attribute>

</PERSONNE></xsl:template>

</xsl:stylesheet>

Le résultatdela transformationest:p ?xml version="1.0" encoding="UTF-8"? qp PERSONNENOM="Doe" PRENOM="John"/ qMaintenanton obtientexactementle mêmerésultatavecle programmesuivant:

Exemple111 Attribute2.xsl: Un programmeéquivalent,sansxsl:attributes

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="PERSONNE"><PERSONNENOM="{NOM}" PRENOM="{PRENOM}"/>

</xsl:template>

</xsl:stylesheet>

Alors quel est l’intérêt d’utiliser xsl:attribute ? Et bien danstous les casoù on ne veut pasl’associerà un élémentlittéral (parexemplequandl’élémentestengendréparxsl:element ), ou quandle nomou la valeurdel’attribut sontcalculéspardesexpressionscomplexes.

Voici un exempleoù on veut ajouterun attribut AGEà l’élément p PERSONNEq dansle documentrésultat,encalculantla valeurdecetattribut pardifférenceentrel’annéecourante(disonsquec’est2002)et l’annéedenaissance.

Exemple112 Attribute3.xsl: L’élémentxsl:attributes , avecunevaleurcalculée

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="PERSONNE"><PERSONNENOM="{NOM}" PRENOM="{PRENOM}"><xsl:attribute name="AGE">

<xsl:value-of select="2002 - substring(NAISSANCE/text(),7)"/>

Page 258: Comprendre XSLT

258 APPENDIX B. RÉFÉRENCEXPATH/XSLT

</xsl:attribute></PERSONNE>

</xsl:template>

</xsl:stylesheet>

On pourraitcertesmettrel’expressiondirectementdansla balise p PERSONNEq , commepour NOM,maisonarriverapidementauxlimitesdecettesolutionquandonutilisepourcalculerla valeurdel’attributdestests,desitérations,etc.

xsl:attrib ute-set

Syntaxe

p xsl:attribute-setname=QNameuse-attribute-sets= QNamesqp xsl:attribute qtsp /xsl:attribute-set q

Description

Cetélémentpermetde grouperdesdéfinitionsd’attributs,et denommerlesgroupesainsiconstituésafindepouvoir lesaffecterd’un bloc à un élément.Cettefonctionnalitéestassezprochedesfeuillesdestyle(CSS)danslesquelleson factorisedespropriétésdemiseenformedecertainsélémentsHTML.

L’attribut name est obligatoire: il sert à référencerle grouped’attribut. Le secondattribut, use-attribute-set , permetdecomposerrécursivementungrouped’attributsà l’aide d’autresgroupes.Lavaleurdeattruse-attribute-setdoit êtreunelistedenomsdegrouped’attributs,séparéspardesespaces.Onpeutainsiparexempledéfinir un groupepour lesattributsrelatifsauxpolicesdecaractères,un autrepourlescouleurs,et lesgroupertousdeuxdansun troisièmegroupe.

Il estpossibledetrouverplusieursgroupesd’attributsavecle nomdansun programmeXSLT. Danscecasle processeurfusionnelesdeuxlistes.

Pouraffecterun grouped’attribut à un élément,on utiliser l’attribut use-attribute-sets desélémentsxsl:copy ou xsl:element : voir pages264 et 267, ou introduireun attribut xsl:use-attribute-sets dansun élémentlittéral.

Exemple

Le programmesuivantdéfinit un groupenomméMonStyle avecdesattributsde présentationreconnusparHTML. Cegroupeestensuiteappliquéà l’élément p body q .

Exemple113 AttributeSet.xsl: L’élémentxsl:attribute-set

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:attribute-set name="MonStyle"><xsl:attribute name="bgcolor">white</xsl:attribute><xsl:attribute name="font-name">Helvetica</xsl:attrib ute><xsl:attribute name="font-size">18pt</xsl:attribute>

</xsl:attribute-set>

<xsl:template match="/"><html>

<head><title>Ficher personne</title></head>

Page 259: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 259

<body xsl:use-attribute-sets="MonStyle">Exemple de use-attribut-sets

</body></html>

</xsl:template>

</xsl:stylesheet>

L’applicationdeceprogrammeproduit le résultatsuivant:

Exemple114 AttributeSet.html: Résultatdu programmeprécédent

<html><head><META http-equiv="Content-Type"

content="text/html; charset=UTF-8"><title>Ficher personne</title></head><body bgcolor="white" font-name="Helvetica"

font-size="18pt">Exemple de use-attribut-sets

</body></html>

xsl:call-template

Syntaxe

p xsl:call-templatename=QNameqp xsl:with-param qtsp /xsl:call-template q

Description

L’élémentxsl:call-template permetd’appelerunerègleparsonnom. Il estutilsedèsqu’un frag-mentdoit êtreinstanciéàplusieursendroitsd’un programme.Pouréviterdesrépétitions,onpeutplacercefragmentêtreplacédansunerègle,etappelercetterègleavecxsl:call-template . Le oulesélémentsxsl:with-param peuventêtreutiliséspourpasserdesparamètresà la règle: voir page282.

La fonctionnalitéapportéeparcetélémets’apparenteà un appelde fonctiondansun langagedepro-grammationclassique. Il faut noter cependantqu’il n’y a pasde valeur retournée,ni de modificationdes«arguments» définispar xsl:with-param . Une desmanièresde contournercesrestrictionsestd’inclure l’appel àxsl:call-template dansun élémentxsl:variable : voir page281.

Exemples

Voir la sectionconsacréeauxrègles,page119.

xsl:choose

Syntaxe

p xsl:choose q

Page 260: Comprendre XSLT

260 APPENDIX B. RÉFÉRENCEXPATH/XSLT

p xsl:when qvup xsl:otherwise qvwp /xsl:choose qDescription

Cet élémentestassociéxsl:when et xsl:otherwise pour créerl’équivalentdesstructuresde testquel’on trouvehabituellementdansleslangagesdeprogrammation(if-then-else ou switch ). Soncontenuestunelisted’élémentsxsl:when (aumoinsun),chacunétantassociéàun test,et chacunayantun contenusousforme de corpsde règle. Le premierélémentxsl:when pour lequelle tests’évalueàtrue voit soncorpsderègleinstancié.Lesélémentsqui suiventsontalorsignorés.Si aucunxsl:whennes’évalueà true , le contenudel’élémentxsl:otherwise , s’il existe,estinstancié.

Exemples

Le programmesuivant affiche tous les titres deschapitresdu livre en les classanten trois catégories:chapitres«courts», «moyens» et « longs». Le classements’effectueenfonctiondela valeurdel’attributLONGUEURdechaquechapitre.

Exemple115 RefChoose.xsl: Exempled’utilisation dexsl:choose

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="XBOOK"><CHAPITRES>

<xsl:apply-templates select="CHAPITRE"/></CHAPITRES>

</xsl:template>

<xsI:template match="CHAPITRE"><xsl:choose>

<xsl:when test="@LONGUEUR &lt; 20">Le chapitre "<xsl:value-of select="TITRE"/>" est court

</xsl:when>

<xsl:when test="@LONGUEUR &lt; 30">Le chapitre "<xsl:value-of select="TITRE"/>" est moyen

</xsl:when>

<xsl:when test="@LONGUEUR &gt;= 30">Le chapitre "<xsl:value-of select="TITRE"/>" est long

</xsl:when>

<xsl:otherwise>Le chapitre "<xsl:value-of select="TITRE"/>"

n’est ni court, ni moyen, ni long !</xsl:otherwise>

</xsl:choose></xsl:template>

</xsl:stylesheet>

L’attribut test a pourvaleuruneexpressionXPathquelconquequi estconvertieenbooléenselonlesrèglesprésentéesdansle chapitre2, parge103.Noterquel’opérateur« x » nepeutêtreutilisédirectementdansle testetdoit êtreremplacéparuneréférenceà l’entité prédéfinie&lt; .

Page 261: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 261

Voir égalementpage134.

xsl:comment

Syntaxe

x xsl:comment ycorps de règlex /xsl:comment y

Description

Cetteinstructionpermetd’inclure un commentairedansle documentrésultat.Bien entenduil estillusoiredeplaceruncommentairesousla formehabituellex !- ... - y dansle programmeXSLT enespérantle copierdansle documentrésultat,puisqu’il seraignorétoutsimplementignoréparle processeur. Le con-tenudel’élémentpeutêtreun corpsderègleavecdesinstructionsXSLT, du texte,desélémentslittéraux,etc. Il faut éviter d’y introduiredeuxtirets -- . L’instanciationdu corpsde règleseraintroduit dansledocumentrésultatsousla forme:x !-- instanciation du corps de règle -- y

L’introductiondecommentairespeutêtreutile pourcomprendre,enlisantle documentrésultat,quellessontlesrèglesqui ont étéinstanciéeset d’où proviennentlesinformations.

Exemples

Voici undocumentreprésentant(trèssynthétiquement)le présentlivre.

Exemple116 XBook.xml: Unedescriptiondu livre

<?xml version="1.0" encoding="ISO-8859-1"?>

<XBOOKISBN="1-67098-09"><TITRE>Publication web avec XML/XSLT</TITRE><EDITEUR>Editions O’Reilly France</EDITEUR><AUTEURS>

<AUTEUR><NOM>BerndAmann</NOM><AFFILIATION>Cnam</AFFILIATION>

</AUTEUR><AUTEUR><NOM>Philippe Rigaux</NOM>

<AFFILIATION>Université Paris-Sud</AFFILIATION></AUTEUR>

</AUTEURS><CHAPITRE LONGUEUR="8">

<TITRE>Avant-propos</TITRE></CHAPITRE><CHAPITRE LONGUEUR="43">

<TITRE>Introduction à XML/XSLT</TITRE></CHAPITRE><CHAPITRE LONGUEUR="34">

<TITRE>Documents XML : Structure et navigation</TITRE><MOT-CLE>DOM</MOT-CLE><MOT-CLE>XPath</MOT-CLE>

</CHAPITRE><CHAPITRE LONGUEUR="45">

<TITRE>Programmation XSLT</TITRE><MOT-CLE>XSLT</MOT-CLE>

</CHAPITRE></XBOOK>

Page 262: Comprendre XSLT

262 APPENDIX B. RÉFÉRENCEXPATH/XSLT

Le programmesuivantproduitla listedetouslesmots-clésprésentsdansXBook.xml, avecuncommen-taireindiquantdequelschapitresproviennentlesmots-clés.

Exemple117 Comment.xsl: Exempled’utilisation dexsl:comment

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="XBOOK"><MOTS-CLES>

<xsl:apply-templates select="CHAPITRE/MOT-CLE"/></MOTS-CLES>

</xsl:template>

<xsl:template match="MOT-CLE"><xsl:comment>

Ces mots-clés sont issus du chapitre<xsl:value-of select="../TITRE"/>

</xsl:comment>

<xsl:value-of select="."/></xsl:template>

</xsl:stylesheet>

xsl:copy

Syntaxe

x xsl:copyuse-attribute-sets= QNamesycorps de règlex /xsl:copy y

Description

Cetteinstructioncopiele nœudcourantdansle documentrésultat.Cettecopiecomprendle balisageet lavaleur, maisn’effectuepasdecopieenprofondeur. Lesélémentssontdonccopiéssansleur contenu.

L’attribut use-attribute-set permetd’introduire desattributs dansl’élémentcopiéen faisantréférenceaunomd’un grouped’attributs: voir page259.

Onpeutintroduireuncontenudansun élémentcopiéenplaçantuncorpsderègledansxsl:copy .

Exemples

Voici undocumentXML :

Exemple118 Copy.xml: Un documentXML à copier

<?xml version="1.0" encoding="ISO-8859-1"?>

<A att1="2"><!-- Test de xsl:copy --><B>Contenu B</B><C>Contenu C</C>

</A>

Page 263: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 263

Et voici un programmequi sélectionnedanscedocumentlesprincipauxtypesdenœud(à l’exceptiondeDocumentet ProcessingInstruction) et lescopie:

Exemple119 Copy.xsl: Un programmed’analyseet decopie

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="//node()|@*"/>

</xsl:template>

<xsl:template match="*">Voici un élément : "<xsl:copy/>"

<xsl:apply-templates select="@*"/></xsl:template>

<xsl:template match="@*"><attribut><xsl:copy/></attribut>

</xsl:template>

<xsl:template match="text()">Voici du texte : "<xsl:copy/>"

</xsl:template>

<xsl:template match="comment()">Voici un commentaire : "<xsl:copy/>"

</xsl:template></xsl:stylesheet>

Le résultatobtenuest:

Exemple120 ResultCopy.xml: Résultatdu programmeprécédent

<?xml version="1.0" encoding="ISO-8859-1"?>

Voici un élément : "<A/>"<attribut att1="2"/>

Voici du texte : " "Voici un commentaire : "<!-- Test de xsl:copy -->"Voici du texte : " "Voici un élément : "<B/>"Voici du texte : "Contenu B"Voici du texte : " "Voici un élément : "<C/>"Voici du texte : "Contenu C"Voici du texte : " "

Cerésultatappellequelquesexplications:

1. lesattributssontcopiésdansl’élémentcourant: ici ona introduitunélémentlittéral x attribut ydansla règlequi traitelesattributs,cequi implique

(a) quec’està cetélémentqueviennentserattacherlesattributs;

(b) quelesélémentsissusdu documentpprincipalseretrouventsansattribut.

2. le documentcontientdesnœudsdetypeText constituésuniquementd’espaces: cesnœudsapparais-sentici ;

Page 264: Comprendre XSLT

264 APPENDIX B. RÉFÉRENCEXPATH/XSLT

3. enfinlesélémentsapparaissentvidespuisqu’ilsn’ont pasdevaleur.

Une utilisation de courantede xsl:copy consisteà recopierun documenten excluantcertainsélé-mentsou certainstypesdenœuds.Le programmesuivantparexemplerecopiele documentCopy.xml ensupprimantlescommentaires.Il illustre l’introductiond’un corpsderègledansle contenudexsl:copy .

Exemple121 Copy2.xsl: Copieavecexclusiondescommentaires

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="*|@*|text()"/>

</xsl:template>

<xsl:template match="@*|node()"><xsl:copy>

<xsl:apply-templates select="*|@*|text()"/></xsl:copy>

</xsl:template>

</xsl:stylesheet>

Lapremièrerègles’appliqueàla racinedudocumentetdéclencheunappelxsl:apply-templatesensélectionnanttouslestypesdenœudsàl’exceptiondescommentaires(etdesinstructionsdetraitement).Pourtousles nœudssélectionnés(y comprisles attributs) la seconderègles’applique: elle effectueunecopiedunœudcourant,et s’appellerécursivement.

Il est importantde remarquerquesi les commentairessontexclus, c’est parcequ’il n’existe pasderèglepardéfautpourcetypedenœud.En revanche,si on souhaiteexclurelesnœudsdetypeText, il fautindiquerexplicitementunerèglequi nefait rien,commedansle programmeci-dessous:

Exemple122 Copy3.xsl: Copieavecexclusiondesnœudstexte

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates select="@*|node()"/>

</xsl:template>

<xsl:template match="@*|node()"><xsl:copy>

<xsl:apply-templates select="*|@*|comment()"/></xsl:copy>

</xsl:template>

<xsl:template match="text()"/>

</xsl:stylesheet>

Page 265: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 265

xsl:copy-of

Syntaxe

x xsl:copyselect=Expression yx /xsl:copy-of y

Description

L’élémentxsl:copy-of déclencheunecopieenprofondeurdetouslesnœudssélectionnésparl’expressionde l’attribut select . La copieen profondeurimpliquequetousles descendantssontcopiéségalement.Cerecouvrenotamment,pour leséléments,la copiedetouslesélémentsdescendants,avecleursattributs(qui sontaussidesnœuds)et leur contenutextuel.

Exemple

Le programmesuivantcopietoutd’abordl’élémentracineA, puisrecopieenprofondeurlesfils detypeB.Touslesautresélémentssontignorés.

Exemple123 CopyOf.xsl: Copieenprofondeur

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><xsl:apply-templates/>

</xsl:template>

<xsl:template match="A"><xsl:copy/><xsl:copy-of select="B"/>

</xsl:template>

</xsl:stylesheet>

AppliquéaudocumentCopy.xml, on obtientle résultatsuivant:

Exemple124 ResultCopyOf.xml: RésultatduprogrammeCopyOf.xsl

<?xml version="1.0" encoding="ISO-8859-1"?><A/><B>Contenu B</B>

xsl:decimal-format

Syntaxe

x xsl:decimal-formatname=nomdecimal-separator= séparateurDécimalegrouping-separator= séparateurGroupeinfinity= infiniminus-sign= signeMoinsNaN=symboleNaNpercent= symbolePourCent

Page 266: Comprendre XSLT

266 APPENDIX B. RÉFÉRENCEXPATH/XSLT

per-mille= symbolePourMillezero-digit= complémentZérodigit= complémentDigitpattern-separator= séparateurPlusMoins yx /xsl:decimal-format y

Description

blabla

xsl:document

Syntaxe

x xsl:documenthref=URImethod= ("xml" | "html" | "text" | autre )version= noVersionencoding= codageomit-xml-declaration=("yes" | "no")standalone=("yes" | "no")doctype-public= DTDPubliquedoctype-system= DTDSystèmecdata-section-elements= listeElémentsstandalone=("yes" | "no")media-type= typeMedia yx /xsl:document y

Description

XSLT 1.1

xsl:element

Syntaxe

x xsl:elementname={QName}namespace= {URI}use-attribute-sets= QNamesy

corps de règlex /xsl:element yDescription

Cetteinstructionpermetd’insérerun élémentdansle documentrésultat.Sonprincipal intérêtestdeper-mettrede déterminerdynamiquement(au momentde l’exécutiondu programme)le nom ou l’espacedenomdel’élémentcréé,touslesautrescaspouvantseramenerà l’insertiond’un élémentlittéral.

L’attributuse-attribute-sets permetdefaireréférenceàungrouped’attributnomméparxsl:attribute-set : voir page259.

Page 267: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 267

Exemples

Le programmesuivant transformel’attribut ISBN du documentXBook.xmlen élément,et copieen pro-fondeurlesélémentsx TITRE y et x EDITEURy .

Exemple125 Element.xsl: Exempled’utilisation dexsl:element

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m"><xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/XBOOK"><LIVRE>

<xsl:copy-of select="TITRE"/>

<xsl:element name="ISBN"><xsl:value-of select="@ISBN"/>

</xsl:element><xsl:copy-of select="EDITEUR"/>

</LIVRE></xsl:template>

</xsl:stylesheet>

Évidemmentonpourraittoutaussibieninclure x ISBN y commeun élémentlittéral.

xsl:fallback

Syntaxe

x xsl:fallback ycorps de règlex /xsl:fallback y

Description

Cetteinstructions’exécutequandle pèredel’élémentn’estpasreconnuparle processeurXSLT. Il estdoncprincipalementdestinéà permettredesextensionsdeXSLT toutenpréservantdansunecertainemesurelaportabilitédesprogrammes.

Exemples

Voici un élémentdetypexbook:refChapitre . Si cetélémentestréférencédansun appelderègle,etquele processeurXSLT estdansl’incapacitéde le traiter, le messageInstruction inconnue serainsérédansle résultat.x xbook:refChapitre no=’1’ yx fallback y Instruction inconnuex /fallback yx /xbook:refChapitre yxsl:for-each

Syntaxe

x xsl:for-eachselect=Expression y

Page 268: Comprendre XSLT

268 APPENDIX B. RÉFÉRENCEXPATH/XSLT

( x xsl:sort y{z , corps de règle)corps de règlex /xsl:for-each y

Description

L’instructionxsl:for-each instanciesoncontenupour chacunde nœudsdésignépar l’expressiondel’attribut select . Le nœudestpris à chaquefois commenœudcourant,et le contexte pour l’ensembledela boucleestconstituédel’ensembledesnœudssélectionnésparle select . L’instructionxsl:for-each changedonctemporairementle contexteet le nœudcourantd’unerègle.

Exemples

Voir la descriptionetdescasd’utilisationdecetteinstructiondansle chapitre3, page136.

xsl:if

Syntaxe

x xsl:iftest=Expression y

corps de règlex /xsl:if yDescription

Cetteinstructioninstanciesoncontenusi l’expressionde l’attribut test s’évalueà true . Il n’y a pasd’équivalentenXSLT auelse habituellementtrouvédansla syntaxe deslangagesprogrammation,maison peututiliser l’instruction xsl:choose qui estbeaucouppluspuissante: voir pageB.1.

Exemples

Voir la descriptionetdescasd’utilisationdecetteinstructiondansle chapitre3, page134.

xsl:import

Syntaxe

x xsl:import href=URI / y

Description

Cet élémentde premierniveauimporte un autreprogrammeXSLT avec tous sesélémentsde premierniveauet toutessesrègles.La précédencedetouslesélémentsimportésestinférieureà ceuxdu documentprincipal.

Cet élémentdoit apparaîtreavant tous les autresélémentsde premierniveauparmi les enfantsdel’élémentracinexsl:stylesheet .

Nous renvoyonsau chapitre3, page111 pour unedescriptiondétailléedesrèglesd’importation dedocuments.

Page 269: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 269

xsl:include

Syntaxe

x xsl:include href=URI / yDescription

xsl:include insèredansle programmele contenudu documentXSLT référencépar l’attribut href .Tout sepasseensuitecommesi lesélémentsimportésavaientétéprésentdansle programmeprincipaldèsl’origine. Contrairementà xsl:import , il n’existedoncpasd’ordre de précédenceentreles élémentsincluset lesautres.

xsl:key

Syntaxe

x xsl:keyname=QNamematch=patternuse=expression / y

Description

XSLT permetdedéfinir (attribut match ) desgroupesdenœudsdansle documentsource,deréférencercesgroupesparunnom(attribut name), etenfind’indiqueruneexpressiondontle résultatidentifiedemanièreuniquechaquenœuddu groupe(attribut use ). Touscesattributssontobligatoires.

Un fois un groupe(une«clé» dansla terminologieXSLT) défini, on peutextraire un nœudavec lafonctionkey().

Exemples

Voic un documentXML contenantquelquesfilms avecleursmetteursenscène.

Exemple126 Films.xml: Quelquesfilms

<?xml version="1.0" encoding="ISO-8859-1"?>

<FILMS><FILM ANNEE="1979"><TITRE>Alien</TITRE><AUTEUR>Scott</AUTE UR></FILM><FILM ANNEE="1958"><TITRE>Vertigo</TITRE><AUTEUR>Hitchcock </AUTEUR></FILM><FILM ANNEE="1960"><TITRE>Psychose</TITRE><AUTEUR>Hitchcoc k</AUT EUR></FILM><FILM ANNEE="1980"><TITRE>Kagemusha</TITRE><AUTEUR>Kurosaw a</AUT EUR></FILM><FILM ANNEE="1997"><TITRE>Volte-Face</TITRE><AUTEUR>Woo</A UTEUR></FILM><FILM ANNEE="1997">

Page 270: Comprendre XSLT

270 APPENDIX B. RÉFÉRENCEXPATH/XSLT

<TITRE>Titanic</TITRE><AUTEUR>Cameron</ AUTEUR></FILM><FILM ANNEE="1986"><TITRE>Sacrifice</TITRE><AUTEUR>Tarkovs ki</AU TEUR></FILM></FILMS>

Le programmeXSLT suivantdéfinituneclédenomFilmsDate qui définit ungroupecontenanttouslesfilms dontla cléestl’attribut ANNEEdel’élément x FILM y .

Exemple127 Key.xsl: Utilisation dexsl:key

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:key name="FilmsDate" match="FILM" use="@ANNEE"/>

<xsl:template match="/"><xsl:value-of

select=’key("FilmsDate", "1958")/TITRE’/></xsl:template>

</xsl:stylesheet>

Onpeutalorsutiliserla fonctionkey() pourdésignerunouplusieursdesélémentsdugroupeenfonctiond’unevaleurdela clé. Le programmeci-dessusdésigneparexempletouslesfilms de1958(soit Vertigo).On peutnoterquekey()] s’intégèreà desexpressionsXPath complexespuisquesonévaluationdonneunensembledenœudsà partir desquelson peutexprimerd’autresétapesXPath.

xsl:message

Syntaxe

x xsl:messageterminate=("yes" | "no") y

corps de règlex /xsl:message yDescription

Cetteinstructionpermetd’afficherunmessagesurla «console» duprocesseurXSLT. Elle peutprincipale-mentêtreutiliséepoursuivre le déroulementde l’exécutiondu programme.L’attribut terminate avecla valeuryes permetdeforcerl’interruption du programme.

xsl:namespace-alias

Syntaxe

x xsl:namespace-aliasstylesheet-prefix=préfixe | "#default"result-prefix=préfixe | "#default" / y

Page 271: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 271

Description

CetélémentdemandeauprocesseurXSLT de modifier le préfixe de certainsélémentslittérauxquandilssontrecopiésdansledocumentrésultat.Lepréfixeprésentdansleprogrammeestindiquéparstylesheet-prefix , et sonéquivalentdansle documentrésultatestdonnéparresult-prefix . Cesdeuxattributssontobligatoires.

CettetransformationestsurtoutimportantepourtransformerdesdocumentsXSLT eux-mêmes.

Exemples

Supposonsquele but d’un programmeXSLT soit de produireun autreprogrammeXSLT. On trouveraitalors typiquementdes règlescommecelles du programmeci-dessous,qui sont évidemmentinvalidespuisquela présenced’un xsl:stylesheet n’estpasautoriséedansun corpsderègle.

Exemple128 NamespaceAlias1.xsl: Problèmed’un élémentlittéral avecunpréfixexsl:

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="/"><xsl:stylesheet version="1.0">

<xsl:apply-templates /></xsl:stylesheet>

</xsl:template>

</xsl:stylesheet>

La solutionconsisteà utiliser, dansle programme,un préfixe spécial,par exemplemyxsl , pour lesélémentslittéraux, et à convertir ce préfixe spécialen xsl au momentde l’inclusion de cesélémentslittéraux dansle documentrésultat. La conversionest indiquéeavec xsl:NamspaceAlias , commedansl’exempleci-dessous.

Exemple129 NamespaceAlias2.xsl: Utilisation dexsl:NamespaceAlias

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:namespace-aliasstylesheet-prefix="myxsl"result-prefix="xsl"/>

<xsl:template match="/"><myxsl:stylesheet version="1.0">

<xsl:apply-templates/></myxsl:stylesheet>

</xsl:template>

</xsl:stylesheet>

xsl:number

Syntaxe

x xsl:number

Page 272: Comprendre XSLT

272 APPENDIX B. RÉFÉRENCEXPATH/XSLT

level="single" | "multiple" | "any"count= patternfrom= patternvalue= expressionformat= chaîneFormatlang= codeLangageletter-value="alphabetic" | "traditional"grouping-separator= séparateurGroupegrouping-size= tailleGroupe / y

Description

Blabla

xsl:otherwise

Syntaxe

x xsl:otherwise ycorps de règlex /xsl:otherwise y

Description

Cetélémentestsubordonnéà l’élémentxsl:choose : voir page261.

xsl:output

Syntaxe

x xsl:outputmethod="xml" | "html" | "text" | QNameversion= Ntokenencoding= stringomit-xml-declaration=("yes" | "no")standalone=("yes" | "no")doctype-public= stringdoctype-system= strincdata-section-elements= QNamesindent=("yes" | "no")media-type= string / y

Description

Cet élémentindiqueau processeurle type de documentà produire. En fonction de ce type, desmisesen forme spécialespeuvent être appliquées.Les trois typesde documentpréconiséspar la normesonthtml , xml et text , la valeurpardéfautétantxml . De plusd’autrestypesdedocumentspécifiquesà unprocesseurpeuventêtrepris encompte,maisle programmeneseraalorspasportable.

Lesattributsversion et encoding correspondentà la versionXML (à l’heureactuellela 1.0) ouHTML (à l’heureactuellela 4.0),età l’encodagedu documentrésultat.

Page 273: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 273

L’attribut omit-xml-declaration (avec pour valeurpar défaut no) peutêtreutilisé pour sup-primer la déclarationXML (savaleurdoit alorsêtreyes ). L’attribut standalone estspécifiqueà undocumentrésultatdetypeXML : il indiquesi le documentfait référenceou nonà desentitésexternes.

Lesattributsdoctype-public etdoctype-system peuventêtreutilisésrespectivementpourundocumentXML avecDTD publiqueet un documentXML avecuneDTD detypeSYSTEM.

On peutdemanderà cequelesfils de typeText decertainsélémentsdansle documentXML résultatfassentpartied’unesectionlittérale(CDATA). Danscecasles typesdecesélémentsdoiventêtredonnés,séparéspardesespaces,dansla valeurdel’attribut cdata-section-elements .

Le documentrésultatpeutêtre indentési l’attribut indent est à yes (ce qui n’est pasle caspardéfaut). Enfin l’attribut media-type donnele typeMIME du documentproduit. Cetypepeutêtreutilequandle documentesttransmisparle protocoleHTTP. PourHTML il doit valoir text/html , pourWMLtext/xml , etc.Savaleurpardéfautesttext/xml .

Exemples

Voir page197la descriptiondecetélémentetsonapplicationà unetransformationXHTML –> HTML.

xsl:param

Syntaxe

x xsl:paramname=QNameselect= Expression y

corps de règlex /xsl:param yDescription

Cetélémentpeutêtreutilisédedeuxmanières:

1. dansunerègle,pourindiquerun paramètrelocal reconnuetpris encompteparla règle;

2. commeélémentdepremierniveau,pourdésignerdesparamètresextérieurspassésauprogramme.

L’attribut select est optionnel. S’il est présent,il donnela valeur par défaut du paramètre. Siselect estomis,le corpsdel’élément(égalementoptionnel)xsl:param définit la valeurpardéfautduparamètre.

Exemples

Voir la sectionconsacréeaupassagedeparamètres,page132.

xsl:preserve-space

Syntaxe

x xsl:preserve-spaceelements=liste-éléments / y

Page 274: Comprendre XSLT

274 APPENDIX B. RÉFÉRENCEXPATH/XSLT

Description

Cet élément,ainsi que soncomplémentxsl:strip-space , permetde contrôlerla prise en comptedesnœudsdetypeText constituésuniquementdeblancs.Il estassociéà unelisted’élémentsdonnéedansl’attribut elements . Pourtouslesélémentindiqués,le nœudsdetypedomtypeText doiventêtrepréservésmêmes’ils necontiennentquedesespaces.

Pardéfautle processeurXSLT doit conserverlesnœudsdetextesvides,cequi peutintroduiredeseffetsdésagréables,notammentquandon utilise la fonction position(). Tout sepassedonccommesi l’optionsuivanteétaitprisepardéfaut:x xsl:preserve-space elements="*"/ yExemples

L’exemplesuivantestun documentavec l’indentationhabituellepourclarifier la hiérarchiedeséléments.x A y et x B y ont tousdeuxdeuxfils detypeText vides,encadrantun élément.

Exemple130 Space.xml: Un documentXML avecindentation

<?xml version="1.0" encoding="ISO-8859-1"?>

<A><B>

<C>Contenu</C></B>

</A>

Le programmesuivantcommencepardéfinirunerègleinverseà l’option pardéfaut: touslesnœudsdetypeText constituésuniquementd’espacesdoiventêtresupprimés.On procèdeensuitepar exceptionenindiquantquecetypedenœuddoit êtrepréservéuniquementpourle élémentsdetypeB.

Exemple131 PreserveSpace.xsl: Exempledexsl:preserve-space etxsl:strip-space

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:strip-space elements="*"/><xsl:preserve-space elements="B"/>

<xsl:template match="/A">Fils de A : <xsl:value-of select="count(node())"/><xsl:apply-templates select="B"/>

</xsl:template>

<xsl:template match="B">Fils de B : <xsl:value-of select="count(node())"/>

</xsl:template>

</xsl:stylesheet>

On appelleensuitedeuxrègles,l’une pourlesélémentsdetypeA, l’autre pourlesélémentsdetypeB,etdanschaquerègleonaffichele nombredefils dunœudcourant.Onobtient1 pour x A y et3 pour x B y .

Page 275: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 275

xsl:processing-instruction

Syntaxe

x xsl:processing-intructionname=QNamey

corps de règlex /xsl:processing-instruction yDescription

Cette instructionpermetd’insérerun nœudde type ProcessingInstructiondansle documentrésultat.L’attribut name estobligatoireet donnele nomou «cible» de l’instruction de traitement.Le contenudel’élémentxsl:processing-instruction doit produiredu texteformantle contenudel’instructiondetraitementdansle documentrésultat

xsl:sort

Syntaxe

x xsl:sortselect= expressionlang= codeLangueorder=("ascending" | "descending")case=("lower-first" | "upper-first")data-type= ("text" | "number" ) / y

Description

Cetélémentestutilisépourtrier lesnœudsséléctionnéssoitparunappelderèglesxsl:apply-templates ,soit par une bouclexsl:for-each . L’élémentxsl:sort doit toujoursapparaîtreimmédiatementaprèsla baliseouvrantede xsl:for-each ou xsl:apply-templates , le mélangeavec desélé-mentsxsl:with-param étantpossibledansle secondcas.

La clédetri estindiquéeparl’expressiondel’attributselect (touslesattributssontoptionnels).Cetteexpressionestévaluéeenprenantpournœudcourant,tour à tour, chaquenœuddel’ensemblesélectionnépar xsl:for-each ou xsl:apply-templates . Le tri de l’ensembles’effectuealorsd’apprèslesvaleursobtenues.

Pardéfautle tri sefait d’aprèsl’ordre lexicographiquesurleschaînesdecaractères,cequi signifieque«4» estplus grandque«30» (les caractèressontcomparésde gaucheà droite). En indiquantla valeurnumber pourl’attribut data-type , on obtientun classementnumérique.

L’ordre de tri estcroissantpar défaut et peutêtremodifié par l’attribut order . L’attribut lang estsupposéindiquél’ordre descaractèresspéciaux(est-ceque«é» est inférieur ou supérieurà «è»?) quidépendde la langue. Enfin case indiquele classementdesmotsen majusculepar rapportaux mêmesmotsenminuscules.

On peutindiquerplusieursxsl:sort successifs: le processeureffectueun premiertri avec la pre-mièreclé, puis un secondtri sur les groupesqui n’ont pasétédépartagéspar le premiertri, et ainsi desuite.

Exemples

Le tri estprésentépage140. Voici un exemplecomplémentairemontrantcommenttrier les chapitresdudocumentXBook.xml(page261)d’aprèsleur nombredepages.

Exemple132 RefSort.xsl: Exempledexsl:sort

Page 276: Comprendre XSLT

276 APPENDIX B. RÉFÉRENCEXPATH/XSLT

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:template match="/"><CHAPITRES-TRIES>

<xsl:apply-templates select="//CHAPITRE"><xsl:sort select="@LONGUEUR" data-type="number"/>

</xsl:apply-templates></CHAPITRES-TRIES>

</xsl:template>

<xsl:template match="CHAPITRE"><CHAPITRE>

<TITRE><xsl:value-of select="TITRE"/></TITRE><LONGUEUR><xsl:value-of select="@LONGUEUR"/></LONGUEUR>

</CHAPITRE></xsl:template>

</xsl:stylesheet>

Remarquezl’attribut data-type avecla valeurnumber . Par défaut,le classementlexicographiquedirait quel’avant-propos(8 pages)estpluslong quetouslesautreschapitres.

Toute valeur associéeà un nœudpar une expressionXPath peut être utilisée commecritère de tri.Reprenonsle documentFilms.xml, page269, et supposonsquele fichier Artiste.xml contienneles infor-martionssurlesmetteursenscènes.

Exemple133 Artistes.xml: Lesmetteursenscène

<?xml version="1.0" encoding="ISO-8859-1"?>

<ARTISTES><ARTISTE><NOM>Scott</NOM>

<PRENOM>Ridley</PRENOM><ANNEE>1943</ANNEE>

</ARTISTE><ARTISTE><NOM>Hitchcock</NOM>

<PRENOM>Alfred</PRENOM><ANNEE>1899</ANNEE>

</ARTISTE><ARTISTE><NOM>Kurosawa</NOM>

<PRENOM>Akira</PRENOM><ANNEE>1910</ANNEE>

</ARTISTE><ARTISTE><NOM>Woo</NOM>

<PRENOM>John</PRENOM><ANNEE>1946</ANNEE>

</ARTISTE><ARTISTE><NOM>Cameron</NOM>

<PRENOM>James</PRENOM><ANNEE>1954</ANNEE>

</ARTISTE><ARTISTE><NOM>Tarkovski</NOM>

<PRENOM>Andrei</PRENOM><ANNEE>1932</ANNEE>

</ARTISTE></ARTISTES>

Page 277: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 277

Voici un programmequi trie lesfilms enfonctiondel’annéedenaissancedeleur metteurenscène.

Exemple134 RefSort2.xsl: Films triés sur l’annéedenaissanceduréalisateur

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:output method="xml" encoding="ISO-8859-1"/>

<xsl:variable name="artistes"select="document(’Artistes.xml’)/ARTIS TES"/>

<xsl:template match="FILMS"><FILMS-TRIES>

<xsl:apply-templates select="FILM"><xsl:sort

select="$artistes/ARTISTE[NOM = current()/AUTEUR]/ANNEE"data-type="number"/>

</xsl:apply-templates></FILMS-TRIES>

</xsl:template>

<xsl:template match="FILM"><FILM>

<TITRE><xsl:value-of select="TITRE"/></TITRE><AUTEUR><xsl:value-of select="AUTEUR"/></AUTEUR><NE-EN>

<xsl:value-ofselect="$artistes/ARTISTE[NOM = current()/AUTEUR]/ANNEE"/>

</NE-EN></FILM>

</xsl:template></xsl:stylesheet>

La variable$artistes estinitialiséeavec le contenudu documentArtistes.xml(voir la descriptionde la fonction document() page283). À partir de là on peut l’utiliser commes’il s’agissaitde l’élémentracinedecedocument.L’expression:

$artistes/ARTISTE[NOM = current()/AUTEUR]/ANNEE

sélectionnel’élément x ARTISTE y dont l’élémentfils x NOMy a un contenuidentiqueà celui du nœudcourant. Attention : il s’agit de l’un desrarescasoù le nœudcontexte de XPath estdifférentdu nœudcourantdeXSLT.

1. le nœudcourantestun desélémentdetypeFILM du documentFilms.xml;

2. le nœudcontexte dépenddesétapesdel’expressionXPath: dansl’expressionci-dessus,si on rem-plaçaitcurrent par «. », on désigneraitun élément x ARTISTE y du documentArtistes.xml, etpasun film.

La fonctioncurrent() désignetoujoursl’élémentcourant(voir page283).

xsl:strip-space

Syntaxe

x xsl:strip-space

Page 278: Comprendre XSLT

278 APPENDIX B. RÉFÉRENCEXPATH/XSLT

elements=QNames/ yDescription

Cetélémentdonnela liste desélémentsdu documentssourcedont lesfils detypeText constituésunique-mentd’espacesdoiventêtresupprimés.L’attribut elements estobligatoire: il indique,séparéspardesblancs,la liste desélémentsconcernésparxsl:strip-space . On peututiliser le caractère«* » pourdésignertousleséléments.

Exemples

Voir page82,ainsiquela descriptiondexsl:preserve-space , page274.

xsl:stylesheet

Syntaxe

x xsl:stylesheetid= idElémentextension-elements-prefixes= tokensexclude-result-prefixes= tokensversion=number y

éléments de premier niveaux /xsl:stylesheet yDescription

Cetélémentesttoujoursl’élémentracined’un programmeXSLT (xsl:transform estun synonyme).Il doit toujoursêtreaccompagnéd’un numérodeversion(actuellementseulela 1.0 estunerecommanda-tion du W3C) afin de permettreau processeurde s’adapterauxéventuellesdifférencesentreles versionssuccessivesdeXSLT. Touslesautresattributssontoptionnels.

L’attribut id donneun identifiantauprogramme.Cetattribut n’estutile quequandle programmeestinclus directementdansun documentXML, et permetalorsd’identifier le nœudracinedesinstructionsXSLT.

L’attribut extension-elements-prefixes donnela liste despréfixes desélémentsqui sontdesextensionsde XSLT. On peutexclure les élémentsde certainsespacesde nom en les indiquantdansl’attribut exclude-result-prefixes .

Lesfils de xsl:stylesheet sonttousles élémentsde premierniveaude XSLT (voir tableau3.1,page112,lesélémentsdetypexsl:import devantapparaîtreenpremier.

Exemples

Voir notammentla sectionconsacréeà la structured’un documentXSLT, page111.

xsl:template

Syntaxe

x xsl:templatename=QNamematch= Patternmode=QNamepriority= number y

Page 279: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 279

( x xsl:param y{z , corps de règle )x /xsl:template yDescription

Cet élémentdéfinit une règle XSLT. Une règlepeutêtreappeléepar sonnom (attribut name) avec uneinstructionxsl:call-template . On peutaussil’associerà un patternavec l’attribut match , et larègleestdéclenchéepourtouslesnœudsauxquelsle patterns’applique.L’un desdeuxattributsdoit êtredéfini,maispaslesdeuxà la fois.

Deuxattributscomplémentairesconditionnentle choix d’une règle. L’attribut priority déterminele degré de priorité: il estpris en comptequandplusieursrèglessontpossiblespour un xsl:apply-templates . L’attribut mode permetdedéfinir plusieurscatégoriesderèglesà appliquerdansdescon-textesdifférents.

Exemple

Voir la sectiondu chapitre3 consacréeauxrègles,page119.

xsl:text

Syntaxe

x xsl:textdisable-output-escaping=("yes" | "no") y

#PCDATAx /xsl:text yDescription

Cetteinstructionpermetd’insérerunnœuddetypeText dansle documentrésultat.Le contenudel’élémentne doit pas contenir de balisage: les caractèresspéciauxdoivent donc être référencésvia une entitéprédéfiniecomme&lt; pour x ou &amp; pour &. Par défaut tous cescaractèresspéciauxserontàleur tour produitssousformederéférenceà un entitédansle documentrésultat,mécanismedésignéparletermeescapingenanglais.

Pour insérerdirectementle caractère,et pas la référenceà l’entité, on peut mettreà no l’attributdisable-output-escaping . Attention: cela affecte le documentrésultat,et pas le programmeXSLT qui doit, lui, toujoursutiliser lesréférencesauxentités.

Lesblancsintroduitsdansle contenud’un élémentxsl:text sonttoujourspréservésdansle docu-mentrésultat.

Exemples

LeprogrammeXSLT ci-dessousproduitunesimplephrasecontenantquelquescaractèresréservés.L’utilisationdesentitésestrequise.

Exemple135 Text.xsl: Exempledexsl:text

<?xml version="1.0" encoding="ISO-8859-1"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Tr ansfor m">

<xsl:template match="/">

<xsl:text disable-output-escaping="yes">Si 0 &lt; 1, alors 1 &gt; 0,

&amp; vice et versa

Page 280: Comprendre XSLT

280 APPENDIX B. RÉFÉRENCEXPATH/XSLT

</xsl:text></xsl:template>

</xsl:stylesheet>

Le résultatdeceprogrammeestle suivant. Il contientdescaractèresréservésqui le rendentimpropreà uneinclusiondansun documentXML bienformé.

Si 0 x 1, alors 1 y 0,& vice et versa

Si disable-output-escaping n’était pasdéfini (ou défini à no , ce qui revient au même),onobtiendraitdansle résultatuneversionavecentitésidentiqueà celledu programmeXSLT.

xsl:transform

Syntaxe

Voir xsl:stylesheet

Description

Cetélémentestsynonymedexsl:stylesheet : voir page278.

xsl:value-of

Syntaxe

x xsl:value-ofselect=Expressiondisable-output-escaping=("yes" | "no") / y

Description

Cetélémentévalueuneexpressionsur le documentsource(ou surun documentréférencépar la fonctiondocument()), puis convertit le résultaten chaînede caractèresselonles règlesde conversionprésentéesdansle chapitre2, et enfininsèrela chaînedansle documentrésultat.

L’attributdisable-output-escaping alamêmesignificationquedanslecasdel’élémentxsl:textdécritprécédemment.

Exemples

Voir la sectionconsacréeà cetélément,page??.

xsl:variable

Syntaxe

x xsl:variablename=QNameselect= Expression / y

corps de règlex /xsl:variable y

Page 281: Comprendre XSLT

B.1. ÉLÉMENTSXSLT 281

Description

Une variable dansXSLT estun nomréférençantuneinformationqui peutêtrede naturetrèsvariée: unnœud,un ensembledenœuds,unevaleurnumériqueou alphanumérique,ou un resulttreefragment, typespécifiqueà XSLT 1.0qui vaprobablementdisparaîtreavecXSLT 1.1.

La valeurd’unevariableestdéfiniesoit par l’évaluationde l’expressionassociéeà l’attribut select(auquelcasle contenudoit êtrevide), soit par le contenude l’élémentxsl:variable s’il n’y a pasdeselect .

La portéed’une variabledépendde la positionde l’élément. Si c’est un élémentde premierniveau(fils de xsl:stylesheet ) la variableest définie danstout le programmeXSLT. Si, en revanche,lavariableestdéfiniedansun élémentxsl:template , elle estvisible danstoussesfrèresdroitset leursdescendants.

On ne peutpasdéfinir unevariableavec le mêmenomqu’unevariablevisible. (autrementdit on nepeutpastrouverdeuxxsl:variable avecla mêmevaleurpour l’attribut name si lesélémentsont, aumoinsenpartie,le mêmeespacedevisibilité). Il s’ensuitequ’unevariableestplutôtuneconstante, ausenshabituellementdonnéà cemot enprogrammation.Cetteparticularitéfait partiedespropriétésqui font deXSLT un langage«déclaratif», et laisseun certaindegréde libertéauprocesseurXSLT pour évaluerunprogramme.

Cette interdiction ne s’appliquepasaux définitionsde variablesprésentesdansdesdocumentsim-portés: dansce cas l’ordre de précédencejoue et la définition de variableprésentedansle documentprincipalou dansle documentimportéayantla plusgrandeprécédenceestpriseencompte.

Exemples

Voir la sectionconsacréeauxvariables,page138.

xsl:when

Syntaxe

x xsl:value-oftest=Expression / y

corps de règlex /xsl:variable yDescription

Cetélémentestsubordonnéà l’élémentxsl:choose : voir page261.

xsl:with-param

Syntaxe

x xsl:value-ofname=QNameselect= Expression / y

corps de règlex /xsl:with-param yDescription

Cet élémentestutilisé pour passerdesparamètresà une règle. Il suit un xsl:call-template , unxsl:apply-templates ou un xsl:apply-imports .

Page 282: Comprendre XSLT

282 APPENDIX B. RÉFÉRENCEXPATH/XSLT

La valeurduparamètreestdéterminéecommepourlesvariables,enévaluantl’attribut select s’il estprésent,ouenprenantle contenudel’élémentsinon.Commebeaucoupd’autresaspectsdela programma-tion XSLTY, le passagedeparamètresesttrèsfaiblementtypé: on peutpasserà unerègledesparamètresqu’elle n’attendpas,ou aucontrairenepaslui passerdeparamètres.Dansle premiercasle paramètreesttout simplementignoré. Dns le secondcasla règleprendencomptela valeurpardéfautdu paramètre,sicettevaleurexiste: voir pageB.1.

Exemples

Voir la sectionconsacréeaupassagedeparamètres,page132.

B.2 FonctionsXPath/XSLT

Les fonctionsqui suivent sontutilisablesdanstouteexpressionXPath apparaissantdansun programmeXSLT. La plupart sont des fonctions définiesdansla recommandationXPath, mais certaines(format-number(), document(), key() par exemple)sontspécifiquesà XSLT. Nousne les distinguonspasdanscequi suit.

Unefonctionprendzéro,unouplusieursarguments,parfoisoptionnels.NousutilisonslesconventionshabituellesdesDTD : arg z indiqueunargumentqui peutêtrerépété0 ouplusieursfois, arg? indiqueunargumentoptionnel,etc.

En généralle type de cesargumentsest l’un desquatretypesde baseXPath (number , string ,boolean et node-set ), ou l’union de cesquatrestypesque nousdénotonsobjet commedanslarecommandationXPath.

Bien entenduun argumentpeut lui-mêmeêtre le résultatd’une autrefonction, ou bien êtreuneex-pressionXPath dont l’évaluationdonnerala valeurà passerà la fonction. Si le type de cettevaleurnecorrespondpasautypeattendu,parexemplenumber , le processeurtenterad’effectueruneconversionaumomentdel’appeldela fonction.

boolean

Boolean boolean (object arg )

La fonctionboolean() convertit sonargumentarg enbooléen.Lesrèglesdeconversionontétéprésentéesdansle chapitre2, page103.Rappelons-lesbriévement:

1. unnumériqueà zéroestconverti à false , touteslesautresvaleurssonttrue ;

2. unechaînedelongueurnulleestfalse , touteslesautressonttrue ;

3. unnode-set videestfalse , sinonla conversionrenvoie true .

ceiling

number ceiling (number valeur )

Cette fonction renvoie le plus petit entier immédiatementsupérieurà valeur . Par exempleceil-ing(1.5) est2.

concat

string concat (string chaîne1 , string chaîne2 ,string chaines z )

Cettefonctionconcatèneleschaînesdecaractères(aumoinsdeux)qui lui sontpasséesenargument.

Page 283: Comprendre XSLT

B.2. FONCTIONSXPATH/XSLT 283

contains

Boolean contains (string chaîne , string sous-chaîne )

Cettefonctiontestesi chaîne contientsous-chaîne , et renvoie true ou false selonle cas.

count

Boolean count (node-set nœuds)

Cettefonctioncomptele nombredenœudsdansle node-set passéenargument.

curr ent

node-set current ( )

Cettefonctionrenvoie le nœudcourantou, pourêtreplusprécis,node-set contenantun seulnœud,lenœudcourant.

Qu’est-cequele nœudcourant(qu’il fautbiendistinguerdunœudcontextepouruneexpressionXPath).Un programmeXSLT consisteà considérercertainsnœudsdu documentsource,à rechercherquelleestlarègleassociéeàchaquenœudetà instanciercetterègle.Chaquerègles’instanciedoncenassociationavecle nœudqui adéclenchésontinstanciation: c’estle nœudcourant.

Au seind’unerègleonpeuttrouverdesinstructionsqui vont temporairementchangerle nœudcourant:xsl:apply-templates vasélectionner, avecuneexpressionXPathunensembledenœudet lespren-drechacunàsontourcommenœudscourantspourinstancierunrègle,etdemêmepourxsl:for-each .Cesdeuxélémentsmodifientlocalementle nœudcourant,qui revientàsavaleurinitiale quandl’évaluationdexsl:apply-templates ou xsl:for-each estterminée.

Lenœudcourantpeutêtredifférentdunœudcontexte,désignédansXPathparl’expressionself:node()ou «. ». Parexemple,dansl’expressionsuivante:FILM/TITRE[.=’Alien’]le nœudcourantestcelui à partir duquelon va chercherun fils de type FILM , puis un petit-fils de typeTITRE , etc. Danscetteexpressionenrevanche,le nœudcontexte désignépar«. » estun élémentdetypeTITRE . Lesprédicatssontlesseulscasoù le nœudcourantet le nœudcontexte diffèrent,et lesseulscasoù l’utilisation de la fonctioncurrent() estjustifiée. Voici par exempleun appelde règlequi sélectionnetouslesnœudsfrèresdu nœudcourantqui ont le mêmecontenu.x xsl:apply-templates match="../*[.=current()]" y

La réféencedel’élémentxsl:sort présenteunexempleoù l’utilisation decurrent estimpérative.

document

node-set document (node-set uri , node-seturi)

TO DO

element-available

Boolean element-available (string nomElément )

Cettefonctiontestesi un élémentXSLT estconnudu processeur. Elle estprincipalementutile pourtestersi certainesextensionslargementrépandues(comme,parexemple,xsl:document ) sontdisponibles.

Page 284: Comprendre XSLT

284 APPENDIX B. RÉFÉRENCEXPATH/XSLT

false

Boolean false ()

Cettefonction renvoie false , et peutêtreutiliséepour palier l’absencede constantesbooléennesdansXSLT. En pratiquelesconversionseffectuéesautomatiquementsontle plussouventsuffisantes,et évitentd’avoir à écrire«expression!=false() » alorsque «expression » a unesignificationéquiva-lente.

floor

number floor (number valeur )

Cettefonctionrenvoieleplusgrandentierimmédiatementinférieuràvaleur . Parexemplefloor(1.5)est1. Appliquéeàunevaleurentiére,la fonctionrenvoiecettevaleur.

format-number

string format-number ()

TO DO

function-available

Boolean function-available (string nomFonction )

Cettefonctiontestesi unélémentXSLT estconnuduprocesseur. Elle peutêtreutilepourvérifierl’existencedefonctionsfourniesseulementparcertainsprocesseurs,ouapparuesdansdenouvellesversionsdeXSLT.

generate-id

string generate-id (node-set nœud)

TO DO

id

node-set id (object arg )

TO DO

key

node-set key (string nomClé , object expression )

La fonction key() fonctionneen associationavec l’élément xsl:key décrit page270. Rappelonsquecet élémentdéfinit un groupede nœud,lui attribue un nom et définit l’expression(la clé) qui permetdedifférencierlesnœudsauseindecegroupe.

La fonctionprenddeuxarguments: le nomdela clé,et la valeurdela clé. Elle renvoiele nœudidentifiéparcettevaleur.

Page 285: Comprendre XSLT

B.2. FONCTIONSXPATH/XSLT 285

Exemples

Voir page270.

lang

Boolean lang (string codeLangue )

Cettefonction vérifie quele langagedu nœudcontexte estcodeLangue , et renvoie true ou falseselonle cas.

Le langaged’un élémentestdéfiniparl’attribut réservéxml:lang , soitdansl’élémentlui-même,soitdansle plusprocheancêtreayantcetattribut.

last

number last ()

La fonction last() renvoie la taille du contexte XPath. DansXSLT il s’agit du nombredenœudsélection-néspar l’expressionde l’attribut select dansxsl:apply-templates ou xsl:for-each . Si lafonctionestutiliséedansuneprédicatXPath,ellecorrespondaunombredenœudssélectionnésparl’étapeprécédente.

Il faut êtreattentif aux nœudstextesvides qui peuvent être comptésou non selonque l’instructionxsl:strip-space a étéutiliséeou pas.

local-name

string local-name (node-set nœud?)

La fonction renvoie le nom local (sansle préfixe correspondantà l’espacede nom) du nœudpasséenargument.Si l’argumentestun ensemble,le premiernœudestpris encompte.Si l’argumentestomis lafonctions’appliqueaunœudcontexte.

name

string name (node-set nœud?)

La fonction renvoie le nom complet,comprenantéventuellmentle préfixe correspondantà l’espacedenom,du nœudpasséenargument.Si l’argumentestun ensemble,le premiernœudestpris encompte.Sil’argumentestomisla fonctions’appliqueaunœudcontexte.

namespace-uri

string namespace-uri (node-set nœud?)

La fonctionrenvoie l’URI associéeaupréfixedunœudpasséenargument.

normalize-space

string normalize-space (string chaîne ?)

TO DO

Page 286: Comprendre XSLT

286 APPENDIX B. RÉFÉRENCEXPATH/XSLT

not

Boolean not (Boolean valeur ?)

Cettefonctioncalculela négationdesonargument.

number

number number (object valeur ?)

Cettefonctionconvertit l’argumentvaleurennumérique.

position

number position ()

Cettefonction renvoie la positionde l’objet courantdansl’ensemblede nœudqueconstituele contexteXPath.

round

number round (number valeur )

Cettefonctionarronditsonargumentà l’entier le plusproche.

starts-with

Boolean starts-with (string chaîne , string sous-chaîne )

Cettefonctiontestesi chaîne débuteavecsous-chaîne .

string

string string (object valeur ?)

TO DO

string-length

number string-length (string chaîne ?)

TO DO

substring

string substring (string chaîne , number début , number longueur ?)

TO DO

Page 287: Comprendre XSLT

B.2. FONCTIONSXPATH/XSLT 287

substring-after

string substring-after (string chaîne , string sous-chaîne )

TO DO

substring-before

string substring-before (string chaîne , string sous-chaîne )

TO DO

sum

number sum (node-set nœuds)

Cettefonctioneffectuela sommedesvaleursdesnœudsdansle node-set passéenargument.

system-property

number system-property (string nomParamètre )

TO DO

translate

string translate (string chaîne , string arg1 , string arg2 )

TO DO

true

Boolean true ()

Cettefonction renvoie true , et peut être utilisée pour palier l’absencede constantesbooléennesdansXSLT. En pratiquelesconversionseffectuéesautomatiquementsontle plussouventsuffisantes,et évitentd’avoir àécrire«expression=true() » alorsque«expression » aunesignificationéquivalente.

unparsed-entity-uri

string unparsed-entity-uri (string nom)

TO DO