From 47e64ee866a36ca1b6c5c51ea020d1aff8e3aa5f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Kim=20Nguy=E1=BB=85n?= Date: Tue, 7 Oct 2014 11:01:19 +0200 Subject: [PATCH] . --- xpi/recette.xml | 16 ++ xpi/test.xsl | 21 +++ xpi/xpi_05.xhtml | 410 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 447 insertions(+) create mode 100644 xpi/recette.xml create mode 100644 xpi/test.xsl create mode 100644 xpi/xpi_05.xhtml diff --git a/xpi/recette.xml b/xpi/recette.xml new file mode 100644 index 0000000..ed5590f --- /dev/null +++ b/xpi/recette.xml @@ -0,0 +1,16 @@ + +Tiramisú + + mascarpone + oeufs + sucre + café + biscuits + +2h + + Séparer les blancs des jaunes + … + … + + diff --git a/xpi/test.xsl b/xpi/test.xsl new file mode 100644 index 0000000..33f0db0 --- /dev/null +++ b/xpi/test.xsl @@ -0,0 +1,21 @@ + + + + + Foo + + + + + b + i + + + + Gras + + + + + diff --git a/xpi/xpi_05.xhtml b/xpi/xpi_05.xhtml new file mode 100644 index 0000000..aa49a92 --- /dev/null +++ b/xpi/xpi_05.xhtml @@ -0,0 +1,410 @@ + + + + + XSLT (suite) + + + + + + + + + + + + + + + + + + + + +
+

XML et Programmation Internet

+

Cours 5

+
kn@lri.fr +
+

Structures de contrôle

+
+

xsl:value-of

+

On peut récupérer des nœuds texte dans le document source au + moyen de la balise <xsl:value-of select="xpath + expr"/>. L'expression xpath expr est + évaluée et convertie en chaîne de caractères en suivant + les conversions d'XPath (voir cours 3). +

+
+
+

Itération avec xsl:for-each

+

La balise <xsl:for-each select="xpath expr"> + corp de boucle + </xsl:for-each> + évalue le corp de la boucle pour chaque nœud renvoyé par + l'expression xpath expr. À chaque itération + le nœud considéré devient le nœud contexte (i.e. celui + renvoyé par l'axe self::)

+
+
+

Itération ordonnée xsl:sort

+

On peut modifier l'ordre dans lequel les éléments sont + parcourus par une boucle xsl:for-each en utilisant + l'élément +]]> qui n'est valide que comme fils d'un xsl:for-each + ou xsl:apply-templates

+ +
+
+

Conditionnelle simple avec xsl:if

+

On peut évaluer conditionnellement une portion de code XSLT + en la plaçant dans une balise: + ... + ]]> Le résultat de l'expression est interprété + comme un booléen (selon les règles de conversion d'XPath). S'il + vaut vrai, le corp du xsl:if est exécuté.

+
+
+

Conditionnelle complexe avec xsl:choose

+

On peut écrire plusieurs portions de code, gardées par des + conditions distinctes + en les plaçant dans une balise: + code 1 + code 2 + code 3 + ... + code sinon + ]]> + Les conditions xsl:when sont évaluées dans l'ordre et + le corp de la première valant vrai est exécuté. Si aucune + condition n'est vérifiée, le corp de + l'instruction xsl:otherwise est exécuté. +

+
+
+

Exemple simple (génération d'une page Web)

+

On réutilise (encore) le fichier de recette:

+ + +Tiramisú + + mascarpone + oeufs + sucre + café + biscuits + +2h + + Séparer les blancs des jaunes + … + … + + +]]> +
+
+ + + + + Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ + + +

Ingrédients du ]]><xsl:value-of select="descendant::title" /> +
    + ]]><xsl:for-each select="descendant::ingredient"> + <xsl:sort select="child::text()" /> ]]><xsl:value-of select="child::text()" /> + ]]></xsl:for-each> +

    Étape]]><xsl:if test="count(descendant::e) &gt;1">s</xsl:if> +

      + ]]><xsl:apply-templates select="descendant::e"> + <xsl:sort select="@num" data-type="number"/> + </xsl:apply-templates> + + + + +
    1. +
      + +]]>
      +

+

Utilisation avancée

+
+

Nom d'attributs ou d'éléments dynamiques

+

Il est fréquent de vouloir choisir dynamiquement les noms + des éléments. Par exemple :

+ + + + + + .... code complexe pour calculer le texte .... + + + + + ]]> + +

code incorrect : les balises <b> +et <i> ne sont pas bien parenthésées

+
+
+

Solution naïve

+

On peut dupliquer le code de manière à respecter les balises + ouvrantes/fermantes :

+ + + + .... code complexe pour calculer le texte .... + + + + + .... code complexe pour calculer le texte .... + + + ]]> + +

Inélégant et non-maintenable : si on a 10 cas, on copie cole + 10 fois le code complexe.

+
+
+

Nom d'attributs ou d'éléments dynamiques

+

On a besoin :

+ +

Problème : XPath ne permet pas de définir des variables

+
+
+

Variables en XSLT (xsl:variable)

+

Comme dans tout langage, on veut pouvoir évaluer une + expression et donner un nom au résultat pour + pouvoir le réutiliser plusieurs fois. En XSLT, on utilise la + balise xsl:variable :

+ + + Le document contient éléments foo. +]]> + +
+
+

Définitions complexes de variables

+

On peut aussi donner du contenu à l'élément xsl:variable, + pour définir la valeur de la variable :

+ + + b + i + + ]]> + +
+
+

Portée des variables

+

Les variables sont non-modifiables une fois définies. Elles + sont visibles par tous les éléments suivant la balise + fermante </xsl:variable> se trouvant avant la + fermeture de l'élément contenant la variable. Exemple :

+ + + + + + +

texte sur + : + +

+
+ +]]> +
+
+
+

Création dynamique d'éléments ou d'attributs

+

On peut utiliser les instructions xsl:element + et xsl:attribute pour créer des éléments et des attributs + dont le nom est calculé dynamiquement : +

+ + baz + ... + +]]> +

produira dans le document de sortie :

+ + ... + +]]> +
+
+

Échappement d'expressions XPath dans les chaînes

+

À part les attributs select et test de + certaines balises XSLT, les autres attributs sont des chaines de + caractères. On peut cependant intégrer des expressions XPath au + moyen d'accolades { } +

+ Le site!]]> + +

Dans le code ci-dessus, href étant un attribut non + interprété (ce n'est pas une balise XSLT), le chemin XPath + apparaîtra dans le résultat (ce qu'on ne veut pas). On peut écrire + :

+ Le site!]]> + +
+
+

Retour sur notre exemple

+ + + b + i + + + + + .... code complexe pour calculer le texte .... + +]]> +

Attention : il faut écrire {$nombalise} sinon le + processeur XSLT essayera de créer un + élément <$nombalise> ce qui est illégal (et + provoquera une erreur)

+
+

Autres fonctionalités

+
+

Spécifier le type de sortie

+

On peut placer une balise xsl:output dans la balise racine + de la feuille de style (xsl:stylesheet)

+ +]]> + +
+
+

Copie de texte et de nœuds

+ +
+ + -- 2.17.1