Domaines nominaux? Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion Un document peut contenir des balises issues de plusieurs DTD différentes Un document peut être composé de fragments de plusieurs documents Se pose alors le problème de l unicité du nom de la balise Exemple de problème avec les noms Un commentaire de bas de page On utilise deux DTD, une pour définir des fonctions mathématique (math.dtd), l autre pour des éléments de mise en page textuels (texte.dtd) L élément fn est utilisé par les deux DTD, il y a donc conflit Exemple de problème avec les noms <! - Ce fn défini une fonction mathématique --> <! - Ce fn défini une note de bas de page --> Un commentaire de bas de page Le problème se pose aussi sans DTD (ici le document a été constitué en copiant-collant la fonction mathématique dans le document initial. Si une feuille de style doit mettre en forme les notes de bas de page, elle agira aussi sur la fonction mathématique. Principe des domaines nominaux Une ressource est identifiée de façon unique par un URI Ce peut être un URL (http://www.w3.org...) Ce peut être un FPI (identificateur public de la forme fpi:-/inria//dtd//fr Une DTD est identifiée par un URI Pour garantir l'unicité d'un nom de balise on préfixe ce nom par l'uri de sa DTD avec un ':' séparateur Ex: <http://www.w3.org/tr/mathml.html:fn> Résolution du problème version 1 <http://www.w3c.org/mathml.html:fn> < http://www.w3c.org/mathml.html:fn nom> f </http://www.w3c.org/mathml.html:nom> < http://www.w3c.org/mathml.html:fn arg> x </http://www.w3c.org/mathml.html:arg> < http://www.w3c.org/mathml.html:fn res> x * x </http://www.w3c.org/mathml.html:res> </http://www.w3c.org/mathml.html:fn> <http://www.w3c.org/basictext.html:fn> Un commentaire de bas de page </http://www.w3c.org/basictext.html:fn> Plus de conflits grâce au préfixe Inconvénient : Notation très lourde 1
Associer un URI à un préfixe court Pour alléger la notation on peut associer à un URI un mot qui sera utilisé à sa place dans le reste du document Cet association se fait dans l'élément racine du document en y ajoutant l'attribut xmlns:nomcourt = "URI" Où nom court est l'abbrévation sur l'on souhaite donner à l'uri. Résolution du problème version 2 <article xmlns:math="http://www.w3c.org/mathml.html" xmlns:texte="http://www.w3c.org/basictext.html" > <math:fn> <math:nom> f </math:nom> <math:arg> x </math:arg> <math:res> x * x </math:res> </math:fn> <text:fn> Un commentaire de bas de page </text:fn> On peut déclarer un domaine par défaut Un domaine par défaut s'applique à tous les éléments descendants de l'élément dans lequel il est déclaré Il se déclare en ne faisant pas figurer de nom après l'attribut xmlns Résolution du problème version 3 <article xmlns="http://www.w3c.org/mathml.html" xmlns:text="http://www.w3c.org/basictext.html" > <! - Ce fn vient de la DTD math.dtd (domaine par défaut) --> <text:fn> Un commentaire de bas de page </text:fn> XSLT? XSLT? Extensible Stylesheet Language : Pour transformer un document XML en un document dans un autre format Pour formatter un document Composé de deux langages : XSLT : langage de transformation de documents XSL-FO: langage de formatage de documents avec utilisation de XPath en complément 2
Principe de XSL Structure d'un document XSL XML Fichiers XSL Un document XSL est un document au format XML dont la racine est xsl:stylesheet Processeur XSL HTML WML RDF Navigateur Téléphone WAP Traitement de textes PDF Imprimante XSL est un langage de programmation Référence à un espace de noms pour XSL xmlns:xsl=http://www.w3.org/1999/xsl/transform Référence à un espace de noms pour le langage cible exemple: XHTML xmlns="http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd" Structure d'un document XSL Un programme XSL est composé d'un ensemble de règles Règle : condition action <xsl:template match="sélecteur"> action Le sélecteur est un chemin XPath qui sélectionne les nœuds sur lesquels doivent s'appliquer la transformation définie par action <xsl:value-of select="expression XPath" /> Cette commande signifie "insère ici le résultat de l'évaluation de l'expression spécifiée dans le select". <xls:apply-template select="expression XPath" /> Cette commande signifie "appliquer récursivement aux fils du nœud courant sélectionnés par l'expression XPath, toutes les règles possibles" La partie action peut comporter du texte (qui sera écrit dans le document de sortie) et aussi des commandes Et le fichier XSL (test.xsl) suivant : Soit le fichier XML suivant : <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="test.xsl" type="text/xsl"?> <biblio> <livre tomes="3"> <titre> Les Misérables </titre> <auteur> Victor Hugo </auteur> </biblio> <b> <xsl:value-of select="livre/titre" /> </b> par <i> <xsl:value-of select="livre/auteur" /> </i> Ce livre comporte <xsl:value-of select="livre/@tomes" /> tômes. 3
Le fichier produit est : <b> Les misérables </b> par <i> Victor Hugo </i> Ce livre comporte 3 tômes Si le fichier XML est à présent (plusieurs livres au lieu d'un seul) : <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="test.xsl" type="text/xsl"?> <biblio> <livre tomes="3"> <titre> Les Misérables </titre> <auteur> Victor Hugo </auteur> <livre tomes="1"> <titre> Candide </titre> <auteur> Voltaire </auteur> </biblio> Le fichier XSL devient : Il n'est pas envisageable d'utiliser un xsl:value-of pour chacun des libres Cela demanderait de connaître le nombre de libre présent dans le document XML On utilise donc une approche récursive On crée une règle qui s'occupe d'un livre et on appelle cette règle pour tous les livres présents au moyen de : <xls:apply-template select="expression XPath" /> Cette commande signifie "appliquer récursivement aux fils du nœud courant sélectionnés par l'expression XPath, toutes les règles possibles" <xsl:apply-templates select="livre"/> <-- règle s'occupant d'un livre --> <xsl:template match="livre"> <br /> Le livre <xsl:value-of select="titre" /> a été écrit par <xsl:value-of select="auteur" /> et comporte <xsl:value-of select="@tomes" /> tômes. Un exemple pour illustrer XSL Le fichier produit est : <br /> Le livre Les misérables a été écrit par Victor Hugo et comporte 3 tomes. <br /> Le livre Candide a été écrit par Voltaire et comporte 1 tomes. Un exemple plus complet Si on modifie le fichier XSL par : <h2>auteurs référencés</h2> <ul> <xsl:apply-templates select="//auteur" /> </ul> <h2>livres référencés</h2> <ul> <xsl:apply-templates select="//titre" /> </ul> <h2>description par livre </h2> <xsl:apply-templates select="livre" /> <xsl:template match="livre"> <br /> Le livre <xsl:value-of select="titre" /> a été écrit par <xsl:value-of select="auteur" /> et comporte <xsl:value-of select="@tomes" /> tômes. <-- règle s'occupant d'un auteur --> <xsl:template match="auteur"> <li> <xsl:value-of select="." /> </li> <-- règle s'occupant d'un titre de livre --> <xsl:template match="titre"> <li> <xsl:value-of select="." /> </li> 4
Un exemple pour illustrer XSL Le fichier produit est : <h2> Auteurs référencés</h2> <ul> <li> Victor Hugo </li> <li> Voltaire </li> </ul> <h2> Livres référencés</h2> <ul> <li> Les misérables </li> <li> Candide </li> </ul> <h2> Description par livre </h2> <br /> Le livre Les misérables a été écrit par Victor Hugo et comporte 3 tomes. <br /> Le livre Candide a été écrit par Voltaire et comporte 1 tomes. Un exemple pour illustrer XSL Ce qui donne graphiquement : 5