Author
samanis-bat
View
567
Download
0
Embed Size (px)
Publication webavecXML/XSL T
BerndAmannet PhilippeRigaux
August6, 2001
2
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
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
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
6 CONTENTS
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
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
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;
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. (?)
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
12 CONTENTS
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
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.
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.
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
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.
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 à
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é
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.
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».
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
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.
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
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>
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
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
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">
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.
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/>
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.
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'un vaisseau spatial échoué sur une lointaineplanète, des Terriens en mission découvrent de bien étranges"oeufs". Ils en ramènent un à bord, ignorantqu'ils viennent d'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
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.
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
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="/">
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
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}.
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:
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” ).
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 -->
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.
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.
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:
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>
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/>
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>= $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
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
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>");
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"?>
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).
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;
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.
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.
54 CHAPTER1. INTRODUCTIONÀ XML ET 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
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 ’>’ et ’>’ 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"?>
2.1. LA SYNTAXE XML 57
<A>Du &monTexte;, sans caractères réservés:ni < ni > ni & ni ' ni "<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
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.
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’/>
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.
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érenceC 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< .
À 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:
62 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION
Déclaration entité (prédéfinie) Référence Caractère<!ENTITY lt "<"> < <<!ENTITY gt ">"> > ><!ENTITY amp "&"> & &<!ENTITY apos "'"> ' ’<!ENTITY quot """> " "
Table2.1: EntitéscaractèresprédéfiniesdansundocumentXML sansDTD
Du &monTexte; , sans caractères réservés:ni < ni > ni & ni ' ni "
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;
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.
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.
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.
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
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
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...
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.
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
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:
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.
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.
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 < et un ></D>
</C></A>
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<et > 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><B><![CDATA[
76 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION
<?xml version=’1.0’ ?><A>
<B></B>
</A>]]></B></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
<B></B>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; }
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
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
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() ;
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.
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.
82 CHAPTER2. DOCUMENTSXML : STRUCTUREET NAVIGATION
4. Prédicatsdetest: voici un exemplerencontrédansle premierchapitre:
<xsl:if test=" ($titre = ’’ or TITRE = $titre)and ($seance = ’’ or HEURE>= $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.
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
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 ».
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.
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;
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
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:
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):
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
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’é[email protected] 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.
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.
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é[email protected]::nom (remarquezla dis-paritiondes::). Onnoteradoncl’étapeprécédentedemanièreéquivalente:
@att1
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.
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
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()
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()
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 )
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:
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é.
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.
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()]
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
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:
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 ;
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] .
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.
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
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
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.
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">
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;
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.
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
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.
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 ;
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.
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é.
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>
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.
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 [email protected], 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>
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.
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
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/>
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().
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>
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>
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;
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>
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).
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>
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
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).
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 < 1970">
<xsl:copy-of select="."/>
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< .
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 < 1960">"<xsl:value-of select="TITRE"/>" est ancien
</xsl:when><xsl:when test="ANNEE >= 1960">
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.
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
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.
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 < $annee">"<xsl:value-of select="TITRE"/>" est ancien
</xsl:when><xsl:when test="ANNEE >= $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
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.
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 :
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 <= $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>
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
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">
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
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
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.
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.
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
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.
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éance 1/2 : Documents XML</li><li> Sé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
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.
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
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).
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 "Û">
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.
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.
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 :
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>
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>
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
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.
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.
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>
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
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.
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 :
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 :
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>
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.
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
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) >
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:
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.
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 .
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"/>
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;
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
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.
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 .
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 ).
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
">
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"/>
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;
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);
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>
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;
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
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.
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">
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>
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">
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" >
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
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
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
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).
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...;
198 CHAPTER4. PRODUCTION DE DOCUMENTSXML
Chapter 5
Production dedocumentspapier
Sommaire
199
200 CHAPTER5. PRODUCTION DE DOCUMENTSPAPIER
Chapter 6
Échangeet intégration
Sommaire
201
202 CHAPTER6. ÉCHANGEET INTÉGRATION
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
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.
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
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);
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>
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
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.
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
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]
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
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,
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>
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),
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,
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*)>
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:
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.
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,
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
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,
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,
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).
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
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:
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"/>
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>
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».
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.
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>
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é < ) ;
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.
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:
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>
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.
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:
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 [email protected]. 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.
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).
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.
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
Chapter 8
Un serveur de publication XML
Sommaire
241
242 CHAPTER8. UN SERVEUR DE PUBLICATION XML
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
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.
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:
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.
A.3. COCOON 247
</h1>Science-fiction,<i>Etats Unis</i>,1979</p>
<p>Mis en scène par <b>Ridley Scott</b>
<h3>Résumé</h3>Pr&egr ave;s d’un vaisseauspatial échoué sur une lointaineplanète, des Terriens en missiondécouvrent de bien étranges"oeufs". Ils en ramènent un à bord,ignorant qu’ils viennent d’introduire parmi euxun huitième passager particulièrementfé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.
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>
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
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).
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...
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
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
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/>
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.
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.
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)"/>
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>
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
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 < 20">Le chapitre "<xsl:value-of select="TITRE"/>" est court
</xsl:when>
<xsl:when test="@LONGUEUR < 30">Le chapitre "<xsl:value-of select="TITRE"/>" est moyen
</xsl:when>
<xsl:when test="@LONGUEUR >= 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< .
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>
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>
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 ;
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>
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
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.
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
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.
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">
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
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
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.
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
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 .
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
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>
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
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
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< pour x ou & 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 < 1, alors 1 > 0,
& vice et versa
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
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 .
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.
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.
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.
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
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
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