III. Publication et Traitement avec XSL • • • • • XPATH XSLT XSL-FO Traitement de documents Conclusion 1. XPath : l'adressage XML • XPath • Expressions de chemins dans un arbre XML • Permet de sélectionner des nœuds par navigation Document XML ? XPath ‹#› XPath • XML Path Language • recommandation W3C pour expressions de chemins • acceptée le 16 novembre 1999 • version 2 acceptée depuis janvier 2007 • Expressions de chemins communes à : • XSL • Xpointer (liens) • XQuery (queries) • Xpath permet • de rechercher un élément dans un document • d'adresser toute sous partie d'un document XPath ‹#› XPath - Parcours d'arbre • XPath opère sur l'arbre d'un document racine <livre auteur = "Hugo"> <titre>Les chatiments</titre> <chapitre> <section>Buonaparte </section> <section>Neige</section> </chapitre> … </livre> livre @auteur chapitre chapitre titre "Hugo" section section Les chatiments Bonaparte XPath ‹#› Neige XPath - Expression de chemins • Une expression de chemins spécifie une traversée de l'arbre du document : • depuis un nœud de départ • vers un ensemble de nœuds cibles • les cibles constituent la valeur du cheminement • Un chemin peut être : • absolu • commence à la racine • /étape1/…/étapeN • relatif • commence à un nœud courant • étape1/…/étapeN XPath ‹#› Syntaxe et sémantique • Cheminement élémentaire • direction::sélecteur [predicat] • Directions • parent, ancestor, ancestor-or-self • child, descendant, descendant-or-self • preceding, preceding-sibling, following, following-sibling • self, attribute, namespace • Sélecteur • nom de nœud sélectionné (élément ou @attribut) • Prédicat • [Fonction(nœud) = valeur] XPath ‹#› EXEMPLES • Sections d'un chapitre racine • /child::livre/child::chapitre/ child::section • /livre/chapitre/section livre • Texte du chapitre 1 section 2 @auteur • /descendant::chapitre[position() = 1] /child::section[position() = 1] /child::text() • //chapitre[0]/section[1]/text() "Hugo" titre chapitre chapitre section section Les chatiments • Remonter à l’auteur du livre • parent::section/ancestor::livre/ child::@auteur • ancestor::livre/@auteur Bonaparte ‹#› Neige XPath - Synthèse Signification ple Exem Pattern entsdenomdonné Sélectionnelesélém Nom section ent ayant lenomdonné ier élém [0] Nom section[0] Sélectionneleprem ent ayant unnomdonné [end()] section[end()] Sélectionneledernier élém Nom | aucheIndiqueunealternative(unnœudOUbienl'autre(oulesdeux)) Droite|G Sélectionnelenœudracined'unearborescence / / /arbre/Nom/livre/chapitreSélectionnelesnœudsdescendantspar labalisedenomdonnédel'arbre ent portequel élém otif "joker"désignant n'im M * * // //personne Indiquetouslesdescendantsd'unnœud Caractériselenœudcourant . . onter d'unniveaudans et derem Désignelenœudparent. Perm .. .. l'arborescence nomdésignelavaleur del'attribut). Indiqueunattribut caractéristique(@ @ nom @ ent *désignetouslesattributsd'unélém Lanotation@ ent (letextecontenuentresesbalises) Désignelecontenud'unélém text() text() ent dont l'identifiant (lavaleur del'attribut ID) est celui Sélectionnel'élém ID() ID('a2546') ètre spécifiéenparam entaires m ent() Com m Com ent() Désignetouslesnœudscom m Désignetouslesnoeuds Node() Node() XPath ‹#› XPath 2.0 • • • • • • • • • Types des schémas et séquences supportés Elimination des « Result Tree Fragments » Support des groupes de noeuds Introduction de fonctions d'agrégats Support des boucles For et des conditions Support des expressions régulières Documents multiples en entrée et sortie Nouvelles fonctions et opérateurs Intégration de fonctions utilisateurs possible ‹#› 2. XSLT : la présentation • Permet de transformer un document • régulier ou irrégulier • de XML à XML, XHTML est un cas particulier • De XML à présentation (HTML, texte, rtf, pdf, etc.) • Un document est un arbre • Le processeur XSL parcourt l'arbre et applique les règles de transformations vérifiées (à condition vraie) aux nœuds sélectionnés • Un document est produit en sortie XSLT ‹#› Publications avec XSL • Plusieurs formats de publication pour un contenu Format ( Postcript) XML Browser Document (XHTML, DHTML, HTML) XSL Processor Format (XML) pour Word, Excel XSL Stylesheet Format (XML) application e.Commerce format (WML) • XSL permet la présentation sur des terminaux variés XSLT ‹#› Architectures HTML XML Programme XML Fichier XML S E R V E U R Affichage ASP ou JSP Processeur XSL HTML Affichage XML Processeur XSL •Affichage Base de données •Traitement XSLT ‹#› Transformation par Jscipt côté client <html> <body> <script type="text/javascript"> // Load XML var xml = new ActiveXObject("Microsoft.XMLDOM") xml.async = false xml.load("exemple.xml") // Load XSL var xsl = new ActiveXObject("Microsoft.XMLDOM") xsl.async = false xsl.load("exemple.xsl") // Transform document.write(xml.transformNode(xsl)) </script> </body> </html> ‹#› Les feuilles de style • Une feuille de style XSL • est un document XML de racine <xsl:stylesheet> • contient une liste de règles de transformation de l'arbre d'entrée en arbre de sortie <xsl:template> • Chaque règle (<xsl:template>) précise: • Une condition spécifiant le sous-arbre du document d’entrée auquel elle s’applique (match=) • Une production spécifiant le résultat de l’application de la règle (contenu) • Il s'agit de règles de production classiques • If <condtition> then <production> • Codées en XML avec espace de nom xsl: XSLT ‹#› Exemple de document <?xml version="1.0" ?> <Guide> <Restaurant Categorie="**"> <Nom>Le Romantique</Nom> <Adresse> <Ville>Cabourg</Ville> <Dept>Calvados</Dept> </Adresse> </Restaurant> <Restaurant Categorie="***"> <Nom>Les TroisGros</Nom> <Adresse> <Ville>Roanne</Ville> <Dept>Loire</Dept> </Adresse> </Restaurant> </Guide> XSLT ‹#› Exemple de feuille de style XSL <?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/xsl"> <xsl:template match="/"> <html><head><B>ESSAI XSL</B></head> <body><xsl:applytemplates/></body></html> </xsl:template> <xsl:template match="Guide"> <H1>BONJOUR LE GROUPE XML</H1> <H2>SUIVEZ LE GUIDE</H2> <xsl:apply-templates /> </xsl:template> <xsl:template match="Restaurant"> <P> <I>Restaurant :</I> <xsl:value-of select="Nom"/></P> </xsl:template> </xsl:stylesheet> XSLT ‹#› Les règles de production • Définition des règles par <xsl:template …> • Attributs • match: condition de sélection des nœuds sur lesquels la règle s'applique (XPath) • name: nom de la règle, pour invocation explicite (en conjonction avec <call-template>) • priority: priorité, utilisé en cas de conflit entre deux règles ayant la même condition • Exemples • <xsl: template match="/"> • <xsl: template match="auteur" name="R1" priority="1"> XSLT ‹#› La génération du résultat • Le contenu de l'élément <xsl:template> est la production: • Les éléments du namespace xsl sont des instructions qui copient des données du document source dans le résultat • Les autres éléments sont inclus tels quels dans le résultat • Instructions pour: • Parcourir l'arbre du document source • Copier le contenu du document source dans le résultat • Parcours de l'arbre: • <xsl:apply-templates>, <xsl:for-each> • Copie du contenu du nœud sélectionné: • <xsl:value-of select= … > XSLT ‹#› Résumé des commandes • <xsl:template> • • définir une règle et son contexte <xsl:apply-templates /> • appliquer les transformations aux enfants du nœud courant • <xsl:value-of select … /> • extrait la valeur d'un élément sélectionné à partir du nœud courant • <xsl:for-each> • définir un traitement itératif • <xsl:pi> • générer une instruction de traitement • <xsl:element> • générer un élément • <xsl:attribute> • générer un attribut • <xsl:if> • définir un traitement conditionnel XSLT ‹#› Processeurs XSLT • Processeurs XSLT conformes à la spécification: • • • • • • Apache Group (www.apache.org): Xalan Oracle XDK (www.oracle.com): XML Parser/ XSLT Proc. MSXML et System.xml (www.microsft.com/xml): packages .NET James Clark (www.jclark.com): XT Saxon XML (saxon.sourceforge.net): XSLT Proc. libXML, libXSLT (Unix C) • Browsers • • • • XSLT Microsoft IE 5 ou plus Netscape depuis la V6 Mozilla Firefox depuis la V1 Opera depuis la V7 ‹#› Quelques éditeurs • • • • • XSLT StylusStudio : www.stylusstudio.com • Edit, Map, Debug XSLT Stylesheets • Visual, Easy-to-Use Tools for XSLT! EditiX : www.editix.com • XSLT Debugger • XML XSD XSL SVG XSL-FO MoreMotion : www.moremotion.com • Fast XSLT Stylesheet Development • With High-End Wysiwyg Editor Oxygen XSLT Editor : www.oxygenxml.com • Edit and debug your XSL stylesheets • Transform XML using XSLT and FOP Altova Style Vision : www.altova.com • Visual stylesheet design from databases ‹#› Editeur XSLT (Sonic) ‹#› Mapper XSLT à XSLT (Sonic) ‹#› Bilan XSLT • XSLT est un langage très puissant de transformation d'un arbre XML en un autre • XSLT permet en particulier de publier des données XML sur le Web par transformation en un document XHTML standard • XSLT est très utilisé : • Pour publier des contenus XML • Pour transformer des formats (EAI, B2B) XSLT ‹#› 3. XSL-FO : le formatage • Nommé officiellement XSL • Standard depuis octobre 2001 • Permet les mises en pages sophistiquées sur écran, papier, ... • Génération de PDF ou RTF • Applique des objets de mise en forme aux données XML • Utilisé notamment pour la PAO XSL-FO ‹#› Complémentaire à XSLT • Peut s'appliquer aux résultats des feuilles XSLT XSL-FO ‹#› Organisation du document • Un document FO est formé d'un élément fo:root qui comprend deux parties distinctes • une description des modèles de pages • fo:layout-master-set • une description du contenu • fo:page-sequence • Le contenu comporte : • Des flux contenant les données mêmes du document • Des éléments statiques dont le contenu se répète sur les pages (en-têtes courants, no de page, etc.) XSL-FO ‹#› Structure de la feuille fo:root <?xml version="1.0" encoding="ISO-8859-1"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="A4"> <!-- Template de page ici --> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="A4"> <!-- Contenu de la page ici --> </fo:page-sequence> </fo:root> XSL-FO ‹#› Définition des masques de pages (1 à N) Définition des contenus de chaque page Modèle de page • Page découpée en régions • Les régions ont des marges • Fixées par des attributs dans le masque de page • Les flux de données sont envoyés les régions XSL-FO ‹#› Objets de formatage • Les objets de formatage sont multiples : • <fo:block> • utilisé pour les blocs de textes, paragraphes, titres… • <fo:display-rule> • ligne de séparation • <fo:external-graphic> • zone rectangulaire contenant un graphisme (SVG) • Ils possèdent de nombreuses propriétés • Pour un block on peut définir • la marge gauche et droite • l’espace avant et après le paragraphe • la couleur du texte ………... XSL-FO ‹#› XSL-FO: hello World <?xml version="1.0" encoding="iso-88591"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/F ormat"> <fo:layout-master-set> <fo:simple-page-master mastername="my-page"> <fo:region-body margin="2 cm"/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="mypage"> <fo:flow flow-name="xsl-region-body"> <fo:block>Hello, world!</fo:block> </fo:flow> </fo:page-sequence> </fo:root> XSL-FO • Element Root • • Layout master set • • C'est le container du texte utilisateur dans le document. Le nom du flot lit le texte à une zone de la page définie dans le masque. Block • ‹#› Les pages sont groupées en séquences et structurées selon la référence au masque. Flow • • Permet de déclarer une ou plusieurs page masters (masque) et page sequence masters pour définir la structure des pages (ici une de 2 cm de marges) Page sequence • • Permet de définir le namespace XSL-FO C'est le bloc de formatage qui inclut un paragraphe de texte pouvant être produit pas XSLT. Fonctionnalités • • • • • • • • • XSL-FO Pages portrait ou paysage Pages recto-verso Page de tailles variées Marges multiples Colonnes multiples Entête et pieds de page Caractères unicode Formatage multi-langages Tables des matières générées • Multiple directions d'écritures • Numérotation des pages • Graphiques et SVG • Tables, avec entêtes, lignes et colonnes fusionnables • Listes • Zones flottantes • Tris à l'édition • Notes de bas de pages ‹#› Les processeurs XSL-FO • FOP (Apache Group) Open Source • Formating Object Processor • Génère du PDF http://www.apache.org • JFOR (Sourceforge) Open Source • Génère du RTF http://sourceforge.net/projects/jfor • XSL Formatter • Antenna House http://www.antennahouse.com • RenderX • Génère du PDF http://www.renderx.com • StyleVision • Altova http://www.altova.com/products_xsl.html • Scriptura • InventiveDesigners http://www.inventivedesigners.com/scriptura • Autres • Arbortext, Adobe, Xinc, XMLPDF, APOC, XSL-FO to TeX XSL-FO ‹#› Bilan XSL • XML = format pour la production de publications échangeables sur le web : • Questions ? • production d’une source unique en XML ; • XSLT = génération automatique de présentations multiples ; • XSL-FO = génération de présentations soignées avec pages maîtres et blocs formatés. • XSL peut être vu comme le langage de programmation de XML … XSL ‹#› 4. XML: le traitement par programme XML DOM XML Schema (ou DTD) <ville>Paris</ville> <pays>France</pays> <temp echelle="C">18</temp> Manipulation de l'arbre Format interne Bien formé Valide Mal formé/Invalide Structures de données XSL Stylesheet SAX Parser XML XSLFO XSLT <city>Paris</city> <temp degree="F">65</te mp> WML Parser XML (X)HTML PDF ‹#› RTF, Word <ville>Paris</ville> événements – call back L'interface DOM • Standard du W3C fait pour HTML et XML • Structure d'objets pour représenter un document • Résultat d'un "parser" • Arbre d'objets reliés entre eux • Interface objet pour naviguer dans un document • Orientée objet • Peut être utilisée en: • Java, C++ • C#, VB • Python, PHP Parser ‹#› Principaux parseurs Document XML Xerces Apache (Java, C++) MSXML Microsoft SDK Oracle Oracle JAXP J2EE (Sun JDK) API générique J2EE Parseur DOM Arbre DOM API DOM Application Parser ‹#› Exemple d'arbre DOM Document Racine du document NodeList <Guide> Element NodeList <Restaurant> <Bar> Element Element <Guide> <Restaurant id="R1">Le meilleur restaurant</Restaurant> <Bar/> </Guide> NamedNodeMap Attr NodeList Id="R1" Text Le meilleur restaurant Parser ‹#› Quelques interfaces de base • Document • • • createElement (Nom_Element): • créer un élément avec le nom spécifié en paramètre. • createComment (commentaire): • créer une ligne de commentaires dans le document. • createAttribute (Nom_Attribut): • créer un attribut avec le nom pris en paramètre. • getElementsByTagName (nom_Tag): • retourne tous les descendants des éléments correspondants au Nom_Tag. Parser Nœud • • • • ‹#› insertBefore (Nouveau_Noeud, Noeud_Reference): • insère un nouveau nœud fils avant le " nœud référence" déjà existant. replaceChild (Nouveau_Noeud, Ancien_Noeud): • remplace le nœud "Ancien_Noeud" par le nœud "Nouveau_Noeud". removeChild (Nœud): • supprime le nœud entré en paramètre de la liste des nœuds. appendChild (Nouveau_Noeud): • Ajoute un nouveau nœud a la fin de la liste des nœuds. hasChildNodes(): • Retourne vrai si le nœud possède un enfant Autres interfaces • Interfaces fondamentales • • • • • • • • Parser • Interfaces étendues XML DOMImplementation Document Comment DocumentFragment Element Attr(ibute) NamedNodeMap CharacterData • Comment • Text • • • • • • ‹#› ProcessingInstruction DocumentType CDATASection Notation Entity EntityReference Exemple d'utilisation Public class ExempleDOM public static main (String argc[]) throws IOException, DOMExcetion {XMLDocument xmlDoc = new XmlDocument(); // creation des nœuds ElementNode nom = (ElementNode) xmlDoc.createElement("nom"); ElementNode prenom = (ElementNode) xmlDoc.createElement("prenom"); ElementNode nomfam = (ElementNode) xmlDoc.createElement("nomfam"); // creation de l'arbre xmlDoc.appendChild(nom); nom.appenChild(prenom); prenom.appendChild(xmlDoc.createTextNode("Jean"); nom.appenChild(nomfam); Document: nomfam.appendChild(xmlDoc.createTextNode("Dupont"); <nom ville ="Paris"> // positionnement d'un attribut nom.setAttribute("ville", "Paris"); <prenom> Jean </prenom> // sortie <nomfa> Dupont </nomfa> System.exit(0); } } </nom> Parser ‹#› Bilan DOM • Une interface objet standard • DOM Level 3 : • Navigation dans l'arbre XML • Traitements spécifiques • XPath • Support direct de XPath • Définition d'un XPath Evaluator • Events • Modèle d'événements • Associés à un nœud • Propagés dans l'arbre • Style • Accès aux styles • Mapping complet • Load and Save • Stockage de l’arbre • Performance limitée • Place mémoire importante • Traitement à la fin de l'analyse • DOM 2.0 • API indépendante de la structure mémoire Parser ‹#› L'interface SAX • SAX (Simple API for XML) • modèle simplifié d'événements • développé par un groupe indépendant. • Types d'événement : • début et fin de document ; • début et fin d'éléments ; • attributs, texte, … . • Nombreux parseurs publics • • • • Parser XP de James Clark, Aelfred, Saxon MSXML3 de Microsoft Xerces de Apache JAXP de SUN ‹#› Principe de fonctionnement Méthodes utilisateur Evénement startDocument Document XML Stream XML Parser Evénement startElement …. Evénement endDocument Content Handler Parser ‹#› Les méthodes essentielles • XMLReader • ErrorHandler • setContentHandler • setErrrorHandler • parse • fatalError • error • warning • ContentHandler • • • • • Parser startDocument endDocument startElement endElement characters ‹#› Exemple SAX et DOM <personne> <nom> Cover </nom> <prenom> Harry </prenom> <adresse> <rue> Stendhal </rue> <ville> Paris </ville> </adresse> </personne> Parser startDocument () startElement (personne) startElement (nom) characters (Cover) endElement (nom) startElement (prenom) characters (Harry) endElement (prenom) startElement (adresse) startElement (rue) characters (Stendhal) endElement (rue) startElement (ville) characters (Paris) endElement (ville) endElement (adresse) endElement (personne) endDocument () ‹#› personne nom #text: Cover prenom #text: Harry adresse rue #text: Stendhal ville #text: Paris DOM versus SAX • DOM utilise SAX pour la construction de l’arbre d’un document XML • SAX est plus léger que DOM • Au-dessus de DOM, il est possible d ’implémenter un « method caller » ... Parser ‹#› Integration : API JAXP • Java API for XML Parsing • JAXP est une d'API standard J2EE permettant d'effectuer des traitements XML qui englobe : • SAX (SAX 2.0) • DOM (DOM Level 2) • la manipulation de transformations XSLT • Objectif • Fournir une couche d’abstraction permettant d’utiliser n’importe quel analyseur SAX/DOM ou processeur XSL • JAXP 1.3 est inclus dans le JDK de Sun • Java WSDP 2.0, Java SE 5.0, disponible sur Java.Net Parser ‹#› Le mapping objet (Data Binding- JAXB) • Définition • Mapping entre un document XML et un graphe d’objets métier C++ ou Java Développements manuels Objets C++ Parsing Xerces C++ XML Mapping Interface générée à l’aide d’outils de Data Binding Objets Java Parsing XDK Java XML ‹#› Objets Java Binding Java XML Principes • Compilation du schéma en classes Java • Traduction des documents en objets compile Schema Classes instance of conforms unmarshal Objects Documents marshal • Possibilité de publier les objets en XML Mapping ‹#› Avantages • L’activité de développement "parsing" est réduite • Gain en coût de développement des interfaces • Les applications peuvent se concentrer sur le fonctionnel • Les développeurs n'ont pas à se soucier du mapping XML • Les Systèmes Techniques sont simplifiés • Capitalisation sur l’interface (utilisation, évolution, …) • Gain en terme de fiabilité (fin de l’utilisation de parseurs variés, parfois écrits à la main) • Les performances de l’interface sont optimisées • Les outils de mapping sont intégrés aux serveurs • J2EE = JAXB • .NET = mapper Mapping ‹#› 5. Conclusion • Un ensemble d’outils pour traiter du XML: • Questions ? • Processeurs XSLT/XSLFO • Analyseurs validants • Intégrés aux serveurs d’applications • J2EE = JAXP • .NET = MSXML • En évolution permanente ‹#›