.
authorKim Nguyễn <kn@lri.fr>
Tue, 7 Oct 2014 09:01:19 +0000 (11:01 +0200)
committerKim Nguyễn <kn@lri.fr>
Tue, 7 Oct 2014 09:01:19 +0000 (11:01 +0200)
xpi/recette.xml [new file with mode: 0644]
xpi/test.xsl [new file with mode: 0644]
xpi/xpi_05.xhtml [new file with mode: 0644]

diff --git a/xpi/recette.xml b/xpi/recette.xml
new file mode 100644 (file)
index 0000000..ed5590f
--- /dev/null
@@ -0,0 +1,16 @@
+<recette difficulte="facile">
+<title>Tiramisú</title>
+<ingredients>
+  <ingredient>mascarpone</ingredient>
+  <ingredient>oeufs</ingredient>
+  <ingredient>sucre</ingredient>
+  <ingredient>café</ingredient>
+  <ingredient>biscuits</ingredient>
+</ingredients>
+<duree>2h</duree>
+<etapes>
+  <e num="1">Séparer les blancs des jaunes</e>
+  <e num="2">…</e>
+  …
+</etapes>
+</recette>
diff --git a/xpi/test.xsl b/xpi/test.xsl
new file mode 100644 (file)
index 0000000..33f0db0
--- /dev/null
@@ -0,0 +1,21 @@
+<xsl:stylesheet version="1.0"
+   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+   <xsl:template match="/">
+     <html>
+       <head>
+        <title>Foo</title>
+       </head>
+       <body>
+        <xsl:variable name="nombalise">
+          <xsl:choose>
+            <xsl:when test="count(descendant::ingredient) mod 2 = 0">b</xsl:when>
+            <xsl:otherwise>i</xsl:otherwise>
+          </xsl:choose>
+        </xsl:variable>
+         <xsl:element name="{$nombalise}">
+          Gras
+        </xsl:element>
+       </body>
+     </html>
+   </xsl:template>
+</xsl:stylesheet>
diff --git a/xpi/xpi_05.xhtml b/xpi/xpi_05.xhtml
new file mode 100644 (file)
index 0000000..aa49a92
--- /dev/null
@@ -0,0 +1,410 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
+>
+<html xmlns="http://www.w3.org/1999/xhtml" >
+  <head>
+    <title>XSLT (suite)</title>
+
+    <meta http-equiv="Content-Type"
+          content="text/html; charset=utf-8" />
+    <meta name="copyright"
+          content="Copyright &#169; 2013 Kim Nguyễn" />
+
+    <!-- Load jQuery -->
+    <script src="../jquery-1.9.1.min.js" type="text/javascript" ></script>
+    <!-- Load the library -->
+    <script src="../simpleWebSlides.js" type="text/javascript" ></script>
+
+    <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css"  media="all" />
+    <!-- Load a custom Theme, the class-element marks this style-sheet
+      a "theme" that can be swtiched dynamicaly -->
+    <link class="sws-theme" rel="stylesheet"  title="U-Psud style"  href="../themes/uPsud.css" type="text/css" />
+
+    <!-- Customize some templates and initialize -->
+    <style type="text/css">
+      .xml-tag { color: #00486c; }
+    </style>
+    <script type="text/javascript">
+      <![CDATA[
+      SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
+      SWS.Config['sws-object-deactivate'] =  SWS.Effects.objectDeactivateFadeOut;
+      SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
+
+      //Ensures that we load SWS at the very end, after MathJax has
+      //been initialized
+
+      $(window).load(function () {
+       $(".inline-xml").each(function(i, elem)
+      {
+      var jelem = $(elem);
+      var code = jelem.html();
+      code = code.replace ("<![CDATA" + "[", "").replace ("]" + "]>", "");
+      code = code.replace (/>/g, ">>>");
+      code = code.replace (/</g, "<span class='xml-tag'>&lt;");
+      code = code.replace (/>>>/g,"&gt;</span>");
+
+      jelem.html(code);
+      });
+  });
+
+      var checkSVG = function (o, i)
+      {
+            if (i >= 10 || SWS.Utils.isUndefined(o) || o == null) return;
+            var svg = o.getSVGDocument();
+            if (svg == null) {
+              setTimeout(function() { checkSVG(o, i+1); }, 200);
+            } else {
+         var alltext = $(svg).find("text");
+         alltext.css("font-family", "DIN");
+         alltext.css("font-size", "70%");
+
+            };
+      };
+      $(window).load(function() {
+      $("embed").ready(function() {
+         setTimeout(function() {
+         $("embed").each(function(i, o) { checkSVG(this,0);   });
+}, 1000);
+        });
+     });
+      $(window).load(SWS.Presentation.init);
+
+       ]]>
+
+    </script>
+
+  </head>
+  <body>
+    <a href="xpi_04.xhtml" class="sws-previous"/>
+    <div class="sws-slide sws-cover sws-option-nofooter">
+      <h1>XML et Programmation Internet</h1>
+      <h1>Cours 5</h1>
+      <a href="mailto:kn@lri.fr">kn@lri.fr</a>
+    </div>
+    <h1>Structures de contrôle</h1>
+    <div class="sws-slide">
+      <h1><tt>xsl:value-of</tt> </h1>
+      <p>On peut récupérer des nœuds texte dans le document source au
+      moyen de la balise <tt>&lt;xsl:value-of select="<a>xpath
+      expr</a>"/&gt;</tt>. L'expression <tt><a>xpath expr</a></tt> est
+      évaluée et <a>convertie en chaîne de caractères</a> en suivant
+      les conversions d'XPath (voir cours 3).
+      </p>
+    </div>
+    <div class="sws-slide">
+      <h1>Itération avec <tt>xsl:for-each</tt></h1>
+      <p>La balise <code>  &lt;xsl:for-each select="xpath expr"&gt;
+         <i>corp de boucle</i>
+  &lt;/xsl:for-each&gt;
+</code> évalue le corp de la boucle pour chaque nœud renvoyé par
+       l'expression <tt><a>xpath expr</a></tt>. À chaque itération
+       le nœud considéré devient le <a>nœud contexte</a> (i.e. celui
+       renvoyé par l'axe <tt>self::</tt>)</p>
+    </div>
+    <div class="sws-slide">
+      <h1>Itération ordonnée <tt>xsl:sort</tt></h1>
+      <p>On peut modifier l'ordre dans lequel les éléments sont
+      parcourus par une boucle <tt>xsl:for-each</tt> en utilisant
+      l'élément <code>  <![CDATA[<xsl:sort select="expression"
+   lang="language-code"
+   data-type="text|number|qname"
+   order="ascending|descending"
+   case-order="upper-first|lower-first"/>
+]]></code> qui n'est valide que comme fils d'un <tt>xsl:for-each</tt>
+      ou <tt>xsl:apply-templates</tt></p>
+      <ul>
+       <li><tt>select</tt> : expression XPath selon laquelle
+       trier</li>
+       <li><tt>lang</tt> : code de la <a>locale</a> selon laquelle
+       trier (par exemple en français, <tt>é</tt> est
+       avant <tt>f</tt>)</li>
+       <li><tt>data-type</tt> : types des données triées (text
+       (defaut), nombre ou élément XML (ordre du document utilisé
+       dans ce cas)</li>
+       <li><tt>order</tt> : s'il faut trier en ordre croissant ou
+       décroissant</li>
+       <li><tt>case-order</tt> : lors d'un tri <a>text</a> si les
+       majuscules sont avant les minuscules (defaut) ou inversement</li>
+      </ul>
+    </div>
+    <div class="sws-slide">
+      <h1>Conditionnelle simple avec <tt>xsl:if</tt></h1>
+      <p>On peut évaluer conditionnellement une portion de code XSLT
+      en la plaçant dans une balise:<code><![CDATA[      <xsl:if test="expression">
+      ...
+      </xsl:if>]]> </code> 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 <tt>xsl:if</tt> est exécuté.</p>
+    </div>
+    <div class="sws-slide">
+      <h1>Conditionnelle complexe avec <tt>xsl:choose</tt></h1>
+      <p>On peut écrire plusieurs portions de code, gardées par des
+      conditions distinctes
+      en les plaçant dans une balise:<code><![CDATA[      <xsl:choose >
+       <xsl:when test="cond 1"> code 1</xsl:when>
+       <xsl:when test="cond 2"> code 2</xsl:when>
+       <xsl:when test="cond 3"> code 3</xsl:when>
+       ...
+       <xsl:otherwise> code sinon </xsl:otherwise>
+      </xsl:choose>]]> </code>
+       Les conditions <tt>xsl:when</tt> 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 <tt>xsl:otherwise</tt> est exécuté.
+      </p>
+    </div>
+    <div class="sws-slide">
+      <h1>Exemple simple (génération d'une page Web)</h1>
+      <p>On réutilise (encore) le fichier de recette:</p>
+    <code style="color:black;font-size:80%;position:relative;left:10%;"><![CDATA[
+<!DOCTYPE recette SYSTEM "recette.dtd">
+<recette difficulte="facile">
+<title>Tiramisú</title>
+<ingredients>
+  <ingredient>mascarpone</ingredient>
+  <ingredient>oeufs</ingredient>
+  <ingredient>sucre</ingredient>
+  <ingredient>café</ingredient>
+  <ingredient>biscuits</ingredient>
+</ingredients>
+<duree>2h</duree>
+<etapes>
+  <e num="1">Séparer les blancs des jaunes</e>
+  <e num="2">…</e>
+  …
+</etapes>
+</recette>
+]]></code>
+    </div>
+    <div class="sws-slide">
+    <code style="color:black;font-size:80%;position:relative;left:10%;"><![CDATA[
+ <xsl:stylesheet version="1.0"
+   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+   <xsl:template match="/">
+     <html>
+       <head>
+          <title>Ingrédients du ]]><u>&lt;xsl:value-of select="descendant::title" /&gt;</u><![CDATA[ </title>
+       </head>
+       <body>
+        <h1>Ingrédients du ]]><u>&lt;xsl:value-of select="descendant::title" /&gt;</u><![CDATA[ </h1>
+        <ul>
+          ]]><u>&lt;xsl:for-each select="descendant::ingredient"&gt;</u>
+              <u>&lt;xsl:sort select="child::text()" /&gt;</u><![CDATA[
+            <li> ]]><u>&lt;xsl:value-of select="child::text()" /&gt;</u><![CDATA[ </li>
+          ]]><u>&lt;/xsl:for-each&gt;</u><![CDATA[
+        </ul>
+         <p>Étape]]><u>&lt;xsl:if test="count(descendant::e) &amp;gt;1"&gt;s&lt;/xsl:if&gt;</u><![CDATA[</p>
+         <ol>
+          ]]><u>&lt;xsl:apply-templates select="descendant::e"&gt;</u>
+              <u>&lt;xsl:sort select="@num" data-type="number"/&gt;</u>
+           <u>&lt;/xsl:apply-templates&gt;</u><![CDATA[
+        </ol>
+       </body>
+     </html>
+   </xsl:template>
+   <xsl:template match="e">
+     <li><xsl:value-of select="."/></li>
+   </xsl:template>
+  </xsl:stylesheet>
+]]></code>
+    </div>
+<h1>Utilisation avancée</h1>
+<div class="sws-slide">
+  <h1>Nom d'attributs ou d'éléments dynamiques</h1>
+  <p>Il est fréquent de vouloir choisir <a>dynamiquement</a> les noms
+  des éléments. Par exemple :</p>
+<code><![CDATA[
+  <xsl:choose>
+    <xsl:when test="condition"> <b> </xsl:when>
+    <xsl:otherwise>  <i> </xsl:otherwise>
+  </xsl:choose>
+
+    .... code complexe pour calculer le texte ....
+
+   <xsl:choose>
+    <xsl:when test="condition"> </b> </xsl:when>
+    <xsl:otherwise>  </i> </xsl:otherwise>
+  </xsl:choose>]]>
+</code>
+<p class="sws-pause"><s>code incorrect </s>: les balises <tt>&lt;b&gt;</tt>
+et <tt>&lt;i&gt;</tt> ne sont pas bien parenthésées</p>
+</div>
+<div class="sws-slide">
+<h1>Solution naïve</h1>
+<p>On peut dupliquer le code de manière à respecter les balises
+  ouvrantes/fermantes : </p>
+<code><![CDATA[
+  <xsl:choose>
+    <xsl:when test="condition">
+      <b>
+           .... code complexe pour calculer le texte ....
+      </b>
+    </xsl:when>
+    <xsl:otherwise>
+      <i>
+           .... code complexe pour calculer le texte ....
+      </i>
+      </xsl:otherwise>
+  </xsl:choose>]]>
+</code>
+<p><s>Inélégant et non-maintenable</s> : si on a 10 cas, on copie cole
+  10 fois le code complexe.</p>
+</div>
+<div class="sws-slide">
+<h1>Nom d'attributs ou d'éléments dynamiques</h1>
+<p>On a besoin : </p>
+<ul>
+  <li>de pouvoir stocker dans des « variables » le résultat d'une
+  expression XSLT</li>
+  <li>de pouvoir créer des éléments ou des attributs dont le nom est
+  une expression</li>
+</ul>
+<p><s>Problème</s> : XPath ne permet pas de définir des variables</p>
+</div>
+<div class="sws-slide">
+  <h1>Variables en XSLT (<tt>xsl:variable</tt>)</h1>
+  <p>Comme dans tout langage, on veut pouvoir évaluer <a>une
+  expression</a> et donner un <a>nom</a> au <a>résultat</a> pour
+  pouvoir le réutiliser plusieurs fois. En XSLT, on utilise la
+  balise <tt>xsl:variable</tt> :</p>
+<code><![CDATA[
+  <xsl:variable name="result" select="count(descendant::foo)" />
+
+  Le document contient <xsl:value-of select="$result" /> éléments foo.
+]]></code>
+<ul>
+  <li>L'attribut <tt>name</tt> est obligatoire et permet de définir le
+  nom de la variable</li>
+  <li>L'attribut <tt>select</tt> s'il est présent permet de définir le
+  contenu</li>
+  <li>Au sein d'une expression XPath, on peut utiliser la
+  notation <tt>$x</tt> pour référencer le contenu de la
+  variable <tt>x</tt></li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Définitions complexes de variables</h1>
+<p>On peut aussi donner du contenu à l'élément <tt>xsl:variable</tt>,
+  pour définir la valeur de la variable : </p>
+<code><![CDATA[
+  <xsl:variable name="result">
+    <xsl:choose>
+      <xsl:when test="…condition…">b</xsl:when>
+      <xsl:otherwise>i</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>]]>
+</code>
+</div>
+<div class="sws-slide">
+<h1>Portée des variables</h1>
+<p>Les variables sont <s>non-modifiables</s> une fois définies. Elles
+  sont visibles par tous les éléments suivant la balise
+  fermante <tt>&lt;/xsl:variable&gt;</tt> se trouvant avant la
+  fermeture de l'élément contenant la variable. Exemple : </p>
+<code style="background:white;"><![CDATA[
+<xsl:template match="x">
+  <xsl:variable name="total" select="count(descendant::text())" />
+  <!-- la variable total est visible à partir d'ici et
+       jusqu'au </xsl:template> -->
+
+
+  <xsl:for-each select="descendant::text()">
+    <p>texte <xsl:value-of select="position()" /> sur
+      <xsl:value-of select="$total" /> :
+      <xsl:value-of select="." />
+    </p>
+  </xsl:for-each>
+
+</xsl:template>]]>
+</code>
+</div>
+<div class="sws-slide">
+<h1>Création dynamique d'éléments ou d'attributs</h1>
+<p>On peut utiliser les instructions <tt>xsl:element</tt>
+  et <tt>xsl:attribute</tt> pour créer des éléments et des attributs
+  dont le nom est calculé dynamiquement :
+</p>
+<code><![CDATA[
+  <xsl:element name="foo">
+    <xsl:attribute name="bar">baz</xsl:attribute>
+    ...
+  </xsl:element>
+]]></code>
+<p>produira dans le document de sortie :</p>
+<code><![CDATA[  <foo bar='baz'>
+   ...
+  </foo>
+]]></code>
+</div>
+<div class="sws-slide">
+  <h1>Échappement d'expressions XPath dans les chaînes</h1>
+  <p>À part les attributs <tt>select</tt> et <tt>test</tt> de
+  certaines balises XSLT, les autres attributs sont <s>des chaines de
+  caractères</s>. On peut cependant intégrer des expressions XPath au
+  moyen d'accolades <tt>{ }</tt>
+  </p>
+  <code><![CDATA[
+    <a href="descendant::url/child::text()">Le site!</a>]]>
+  </code>
+  <p>Dans le code ci-dessus, <tt>href</tt> é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
+  :</p>
+  <code><![CDATA[
+    <a href="{descendant::url/child::text()}">Le site!</a>]]>
+  </code>
+</div>
+<div class="sws-slide">
+<h1>Retour sur notre exemple</h1>
+<code><![CDATA[
+  <xsl:variable name="nombalise">
+    <xsl:choose>
+     <xsl:when test="condition">b</xsl:when>
+     <xsl:otherwise>i</xsl:otherwise>
+    </xsl:choose>
+  </xsl:variable>
+
+  <xsl:element name="{$nombalise}">
+      .... code complexe pour calculer le texte ....
+  </xsl:element>
+]]></code>
+<p><s>Attention</s> : il faut écrire <tt>{$nombalise}</tt> sinon le
+  processeur XSLT essayera de créer un
+  élément <tt>&lt;$nombalise&gt;</tt> ce qui est illégal (et
+  provoquera une erreur)</p>
+</div>
+<h1>Autres fonctionalités</h1>
+<div class="sws-slide">
+<h1>Spécifier le type de sortie</h1>
+<p>On peut placer une balise <tt>xsl:output</tt> dans la balise racine
+  de la feuille de style (<tt>xsl:stylesheet</tt>)</p>
+<code ><![CDATA[   <xsl:output
+      method="xml|html|text"
+      cdata-section-elements="namelist"
+      indent="yes|no"
+   />
+]]></code>
+<ul><li><tt>method</tt> : décrit le type de fichier généré (XML
+    (defaut), HTML (plus permissif sur les balises non fermées),
+    texte)</li>
+  <li><tt>cdata-section-elements</tt> : liste de nom de balises
+  séparées par des espaces. Dans ces balises, le contenu du texte
+  n'est pas interprété (<tt>&gt;</tt>, <tt>&lt;</tt> peuvent êtres
+  écrits directement)</li>
+  <li><tt>indent</tt> : si la sortie est du XML, indenter les balises
+  de manière lisible</li>
+</ul>
+</div>
+<div class="sws-slide">
+  <h1>Copie de texte et de nœuds </h1>
+  <ul>
+    <li>La balise <tt>&lt;xsl:copy-of select='expression'&gt;</tt>
+    copie le résultat de l'expression XPath (qui peut être un nœud)
+    dans la sortie, avec ses attributs et son contenu</li>
+    <li>La balise <tt>&lt;xsl:text&gt; ... &lt;/xsl:text&gt;</tt>
+    copie le texte tel quel (sans toucher aux blancs) dans la sortie</li>
+  </ul>
+</div>
+  </body>
+</html>