X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=xpi%2Fxpi_04.xhtml;fp=xpi%2Fxpi_04.xhtml;h=b4365822cf50b92d6ab99bd7b80ee2db1d18b7d2;hb=00a1f062a9f255b188f15b1d5373b5d73901c675;hp=0000000000000000000000000000000000000000;hpb=db35e40feec7ef37f162d4771e9523ab33843565;p=hacks%2FsimpleWebSlides.git diff --git a/xpi/xpi_04.xhtml b/xpi/xpi_04.xhtml new file mode 100644 index 0000000..b436582 --- /dev/null +++ b/xpi/xpi_04.xhtml @@ -0,0 +1,425 @@ + + + + + XSLT + + + + + + + + + + + + + + + + + + + + +
+

XML et Programmation Internet

+

Cours 4

+
kn@lri.fr +
+

Namespaces

+
+

Utilisation des namespaces

+

Problème : comment mélanger au sein d'un même document des + balises venant de deux DTDs (ou schémas) différentes + ?
Exemple : mettre du SVG (images vectorielles) dans + du XHTML (page web)

+ + + + ]]> + + + Mon image + + +

Une image

+ + + + + ]]> +
+

Comment spécifier que certains éléments doivent êtres + interprétés ? (par exemple par le navigateur web) et que + d'autres font parties des données ?

+
+
+

L'attribut xmlns

+

On peut utiliser un attribut spécial, xmlns + qui est autorisé dans tous les documents XML + sur n'importe quel élément. La valeur de ce dernier est + un lien identifiant la DTD et indique tous les descendants de + l'élément en question sont valides par rapport à la + DTD.
Exemple: +

+ xmlns="http://www.w3.org/1999/xhtml" + Mon image + +

Mon image

+ xmlns="http://www.w3.org/2000/svg" + + + + + ]]> +
+ +
+
+

L'attribut xmlns

+

On peut aussi donner un nom à un namespace particulier + et réutiliser ce nom dans les balises:

+ xmlns="http://www.w3.org/1999/xhtml" + xmlns:svg="http://www.w3.org/2000/svg" + Mon image + +

Mon image

+ + + + ]]>
+

en utilisant l'attribut xmlns:toto="..." alors toutes la + balises de la forme <toto:nombalise> appartiennent au + namespace toto. Il ne faut pas oublier le namespace sur la + balise fermante !

+
+
+

Digression

+

L'exemple précédent ressemble à ça :

+
+

Mon image

+ + + +
+
+

XSLT, principes

+
+

XSLT

+

eXtensible Stylesheet Language Transformations : est + un langage de transformation de documents XML. Il permet + d'extraire (au moyen d'XPath) des nœuds d'un document d'entrée + et de les ré-organiser et de les copier dans un document de + sortie. + Le document de sortie est souvent du XML lui-même mais peut + être aussi du texte, du PDF, … +

+ +
+
+

Un exemple simple

+

On réutilise un document de recette de cuisine + du cours 01. La DTD est:

+ + + + + + + + + +]]> +
+
+

Un exemple simple (suite)

+

Un document valide par rapport à la DTD est le suivant

+ + +Tiramisú + + mascarpone + oeufs + sucre + café + biscuits + +2h + + Séparer les blancs des jaunes + … + … + + +]]> +
+
+

Un exemple simple (suite)

+

On va extraire des informations du document et en faire une + page web :

+ + + + + Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ + + +

Ingrédients du ]]><xsl:value-of select="descendant::title" /> +

+
+

Comment exécuter un programme XSLT

+ +
+
+

Structure d'un programme XSLT

+

Un programme XSLT commence par la balise :]]> +et fini par la balise : ]]> +Le texte ainsi que les éléments qui ne sont pas dans + le namespace « xsl: » sont copiés à + l'identique dans la sortie.
+ Dans la balise principale <xsl:stylesheet> on trouve + un certain nombre de balises <xsl:template match="…" + >.
+ Les templates vont jouer le rôle de fonctions et vont être + appelées pour transformer des nœuds du document en nœuds de sortie. +

+
+

Les templates XSLT

+
+

Templates

+

Un template est délimité par une balise <xsl:template match="…" + > où le « â€¦ Â» est une expression XPath. Il peut y avoir + plusieurs templates dans un fichier XSLT.
+ Un template est appliqué à un ensemble de nœuds. Parmi cet + ensemble, tous les nœuds qui vérifient l'expression XPath de + l'attribut match sont passés en argument au template.
+ Initialement, tous les templates existants sont appliqués au nœud + fictif document. +

+
+
+

Retour sur l'exemple

+ + + + + Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ + + +

Ingrédients du ]]><xsl:value-of select="descendant::title" /> +

+
+

Deuxième exemple, 2 templates

+

+ + + + + Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ + + +

Ingrédients du ]]><xsl:value-of select="descendant::title" /> +

+
+

Priorité des templates

+

Que se passe-t-il si deux templates peuvent s'appliquer à un même + élément ? On applique les règles de priorité suivantes + (simplifiées) : +

+
    +
  1. Si le match d'un template contient un | entre + plusieurs chemins, la priorité la plus élevée de ces chemins est choisie +
  2. +
  3. si le match est de la forme : child::foo + ou attribute:foo, sa priorité est 0
  4. +
  5. si le match est de la forme : child::* ou + ou attribute:*, sa priorité est -0.25
  6. +
  7. si le match est de la form : child::text() + ou child::node() (idem avec attribute), sa + priorité est -0.5
  8. +
  9. sinon (test complexe, par exemple foo[ count(child::bar) < + 4]), la priorité est 0.5
  10. +
+

Le template ayant la priorité la plus élevée est choisi. On peut + donner explicitement à un template une priorité avec + l'attribut priority="…"
Le moteur XSLT lève une + erreur d'exécution si deux templates ont exactement la même + priorité.

+
+
+

Templates par défaut

+

Il existe 3 templates par défaut qui sont toujours + définis :

+ + + + + + + + + +]]> + +

Ils ont des priorités inférieures aux templates présents dans le + fichier donc ne sont appliqués + que si aucun templates ne fonctionne. Ils permettent de « descendre + dans l'arbre » (jusqu'aux textes), si aucun template ne s'applique à + la racine. +

+
+ +