26
Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Embed Size (px)

Citation preview

Page 1: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Domaines nominaux XSLT

Nicolas SingerMaître de conférence, université Champollion

Page 2: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Domaines nominaux ?

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

Page 3: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Exemple de problème avec les noms <!DOCTYPE article [

<!ENTITY % math SYSTEM ‘math.dtd’><!ENTITY % texte SYSTEM ‘texte.dtd’>%math;%texte;

]>

<article>

<!–- Ce fn vient de la DTD math.dtd --><fn>

<nom> f </nom><arg> x </arg><res> x * x </res>

</fn>

<!–- Ce fn vient de la DTD texte.dtd --><fn> Un commentaire de bas de page </fn>

</article>

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

Page 4: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Exemple de problème avec les noms <article>

<!–- Ce fn défini une fonction mathématique --><fn>

<nom> f </nom><arg> x </arg><res> x * x </res>

</fn>

<!–- Ce fn défini une note de bas de page --><fn> Un commentaire de bas de page </fn>

</article>

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.

Page 5: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

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>

Page 6: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Résolution du problème version 1 <!DOCTYPE article [<!ENTITY % math SYSTEM ‘math.dtd’><!ENTITY % texte SYSTEM ‘texte.dtd’>%math;%texte;

]><article><!–- Ce fn vient de la DTD math.dtd --><http://www.w3c.org/MathML.html:fn>

< http://www.w3c.org/MathML.html:nom> f </http://www.w3c.org/MathML.html:nom>< http://www.w3c.org/MathML.html:arg> x </http://www.w3c.org/MathML.html:arg>< http://www.w3c.org/MathML.html:res> x * x </http://www.w3c.org/MathML.html:res>

</http://www.w3c.org/MathML.html:fn>

<!–- Ce fn vient de la DTD texte.dtd --><http://www.w3c.org/BasicText.html:fn> Un commentaire de bas de page</http://www.w3c.org/BasicText.html:fn></article> Plus de conflits grâce au préfixe

Inconvénient : Notation très lourde

Page 7: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

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.

Page 8: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Résolution du problème version 2

<!DOCTYPE article [<!ENTITY % math SYSTEM ‘math.dtd’><!ENTITY % texte SYSTEM ‘texte.dtd’>%math;%texte;

]><article xmlns:math="http://www.w3c.org/MathML.html"

xmlns:texte="http://www.w3c.org/BasicText.html" ><!–- Ce fn vient de la DTD math.dtd --><math:fn>

<math:nom> f </math:nom><math:arg> x </math:arg><math:res> x * x </math:res>

</math:fn>

<!–- Ce fn vient de la DTD texte.dtd --><text:fn> Un commentaire de bas de page </text:fn></article>

Page 9: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

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

Page 10: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Résolution du problème version 3

<!DOCTYPE article [<!ENTITY % math SYSTEM ‘math.dtd’><!ENTITY % texte SYSTEM ‘texte.dtd’>%math;%texte;

]><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) --><fn>

<nom> f </nom><arg> x </arg><res> x * x </res>

</fn>

<!–- Ce fn vient de la DTD texte.dtd --><text:fn> Un commentaire de bas de page </text:fn></article>

Page 11: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

XSLT ?

Extensible Stylesheet Language :

Pour transformer un document XML en un document dans un autre format

Pour formatter un document

Page 12: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

XSLT ?

Composé de deux langages :

XSLT : langage de transformation de documents

XSL-FO: langage de formatage de documents

avec utilisation de XPath en complément

Page 13: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Principe de XSL

XML

HTML WML RDF

Processeur XSL

Navigateur TéléphoneWAP

Traitementde textes

PDF

Imprimante

Fichiers XSL

Page 14: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Structure d'un document XSL

Un document XSL est un document au format XML dont la racine est xsl:stylesheet

XSL est un langage de programmation

Référence à un espace de noms pour XSLxmlns:xsl=http://www.w3.org/1999/XSL/Transform

Référence à un espace de noms pour le langage cible

exemple: XHTMLxmlns="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"

Page 15: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

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 </xsl:template>

Le sélecteur est un chemin XPath qui sélectionne les nœuds sur lesquels doivent s'appliquer la transformation définie par action

La partie action peut comporter du texte (qui sera écrit dans le document de sortie) et aussi des commandes

Page 16: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:value-of

<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"

Page 17: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:value-of

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>

</livre>

</biblio>

Page 18: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:value-of

Et le fichier XSL (test.xsl) suivant :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/biblio">

<html><head></head><body><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.</body></html>

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

Page 19: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:value-of

Le fichier produit est :

<html><head></head><body>

<b> Les misérables </b>

par <i> Victor Hugo </i>

Ce livre comporte 3 tômes

</body></html>

Page 20: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:apply-template

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><livre tomes="1">

<titre> Candide </titre> <auteur> Voltaire </auteur>

</livre></biblio>

Page 21: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:apply-template

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"

Page 22: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

La commande xsl:apply-template Le fichier XSL devient :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/biblio"> <html><head></head><body>

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

</xsl:template>

<-- règle s'occupant d'un livre --><xsl:template match="livre">

<br /> Le livre <xsl:value-of select="titre" /> a été écritpar <xsl:value-of select="auteur" /> et comporte <xsl:value-of select="@tomes" /> tômes.

</xsl:template></xsl:stylesheet

Page 23: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Un exemple pour illustrer XSL

Le fichier produit est : <html><head></head><body>

<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.

</body></html>

Page 24: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Un exemple plus complet Si on modifie le fichier XSL par :

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/biblio">

<html><head></head><body><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" />

</body></html></xsl:template>

<xsl:template match="livre"> <br /> Le livre <xsl:value-of select="titre" /> a été écritpar <xsl:value-of select="auteur" /> et comporte <xsl:value-of select="@tomes" /> tômes.

</xsl:template>

<-- règle s'occupant d'un auteur --><xsl:template match="auteur">

<li> <xsl:value-of select="." /> </li></xsl:template><-- règle s'occupant d'un titre de livre --><xsl:template match="titre">

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

</xsl:stylesheet

Page 25: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Un exemple pour illustrer XSL

Le fichier produit est : <html><head></head><body>

<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.</body></html>

Page 26: Domaines nominaux XSLT Nicolas Singer Maître de conférence, université Champollion

Un exemple pour illustrer XSLCe qui donne graphiquement :