.
[hacks/simpleWebSlides.git] / xpi / xpi_04.xhtml
diff --git a/xpi/xpi_04.xhtml b/xpi/xpi_04.xhtml
new file mode 100644 (file)
index 0000000..b436582
--- /dev/null
@@ -0,0 +1,425 @@
+<?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</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_03.xhtml" class="sws-previous"/>
+    <div class="sws-slide sws-cover sws-option-nofooter">
+      <h1>XML et Programmation Internet</h1>
+      <h1>Cours 4</h1>
+      <a href="mailto:kn@lri.fr">kn@lri.fr</a>
+    </div>
+    <h1>Namespaces</h1>
+    <div class="sws-slide">
+      <h1>Utilisation des <i>namespaces</i></h1>
+      <p><a>Problème</a> : comment mélanger au sein d'un même document des
+      balises venant de deux DTDs (ou schémas) <a>différentes</a>
+      ?<br/>Exemple : mettre du SVG (images vectorielles) dans
+      du XHTML (page web)</p>
+      <code style="font-size:80%;width:50%;float:left"><![CDATA[
+      <svg width="400" height="180">
+         <rect x="50"
+              y="20"
+              rx="20"
+              ry="20"
+              width="150" height="150"
+               style="fill:red;stroke:black;
+                      stroke-width:5;opacity:0.5" />
+      </svg> 
+ ]]>
+      </code>
+      <code style="font-size:80%;width:50%;float:left"><![CDATA[
+      <html>
+       <head><title>Mon image</title></head>
+       <body>
+
+         <h1>Une image</h1>
+         <!-- contenu de l'image -->
+
+       </body>
+      </html>
+ ]]>
+      </code>
+      <p>Comment spécifier que certains éléments doivent êtres
+      <a>interprétés</a> ? (par exemple par le navigateur web) et que
+      d'autres font parties des données ?</p>
+    </div>
+    <div class="sws-slide">
+      <h1>L'attribut <tt>xmlns</tt></h1>
+      <p>On peut utiliser un <a>attribut</a> spécial, <tt>xmlns</tt>
+      qui est autorisé dans <a>tous les documents XML</a>
+      sur <a>n'importe quel élément</a>. 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.<br/>Exemple:
+      </p>
+      <code style="font-size:80%;background:white;"><![CDATA[
+      <html ]]><s>xmlns="http://www.w3.org/1999/xhtml"</s><![CDATA[>
+       <head><title>Mon image</title></head>
+       <body>
+       <h1>Mon image</h1>
+           <svg width="400" height="180" ]]><s>xmlns="http://www.w3.org/2000/svg"</s><![CDATA[>
+             <rect x="50"
+                  y="20"
+                  rx="20"
+                  ry="20"
+                  width="150" height="150"
+                  style="fill:red;stroke:black;
+                         stroke-width:5;opacity:0.5" />
+          </svg>
+     </body>
+     </html>
+ ]]>
+      </code>
+
+    </div>
+    <div class="sws-slide">
+      <h1>L'attribut <tt>xmlns</tt></h1>
+      <p>On peut aussi donner <a>un nom</a> à un namespace particulier
+      et réutiliser ce nom dans les balises:</p>
+      <code style="font-size:80%;background:white;"><![CDATA[
+      <html ]]><s>xmlns="http://www.w3.org/1999/xhtml"</s>
+            <a>xmlns:svg="http://www.w3.org/2000/svg"</a><![CDATA[>
+       <head><title>Mon image</title></head>
+       <body>
+       <h1>Mon image</h1>
+           <svg:svg width="400" height="180" 
+             <svg:rect x="50"
+                  y="20"
+                  rx="20"
+                  ry="20"
+                  width="150" height="150"
+                  style="fill:red;stroke:black;
+                         stroke-width:5;opacity:0.5" />
+          </svg:svg>
+     </body>
+     </html>]]> </code>
+<p style="background:white;">en utilisant l'attribut <tt>xmlns:toto="..."</tt> alors toutes la
+  balises de la forme <tt>&lt;toto:nombalise&gt;</tt> appartiennent au
+  namespace <tt>toto</tt>. Il ne faut pas oublier le namespace sur la
+  balise fermante !</p>
+    </div>
+    <div class="sws-slide">
+      <h1>Digression</h1>
+      <p>L'exemple précédent ressemble à ça :</p>
+      <div style="border: 1pt solid gray;margin: 10pt">
+       <h1 style="font-family:Serif;color:black;text-align:left">Mon image</h1>
+             <svg width="400" height="180" xmlns="http://www.w3.org/2000/svg">
+         <rect x="50"
+              y="20"
+              rx="20"
+              ry="20"
+              width="150" height="150"
+               style="fill:red;stroke:black;
+                      stroke-width:5;opacity:0.5" />
+      </svg> 
+      </div>
+    </div>
+    <h1>XSLT, principes</h1>
+    <div class="sws-slide">
+      <h1>XSLT</h1>
+      <p><a>eXtensible Stylesheet Language Transformations</a> : est
+       un langage de transformation de documents XML. Il permet
+       d'extraire (au moyen d'XPath) des nœuds d'un <a>document d'entrée</a>
+       et de les ré-organiser et de les copier dans un <a>document de
+       sortie</a>.
+       Le document de sortie est souvent du XML lui-même mais peut
+       être aussi du texte, du PDF, …
+      </p>
+      <ul>
+       <li>XSLT est standardisé par le W3C</li>
+       <li>Les programmes XSLT sont écrit eux-même en XML</li>
+       <li>Il existe plusieurs versions du standard (1.0, 2.0,
+       3.0). Ce cours fait juste une introduction aux fonctionalités
+       les plus simples (1.0)</li>
+      </ul>
+    </div>
+    <div class="sws-slide">
+      <h1>Un exemple simple</h1>
+      <p>On réutilise un document de recette de cuisine
+      du <a href="xpi_01.xhtml">cours 01</a>. La DTD est:</p>
+<code style="color:black;position:relative;left:10%;"><![CDATA[<!ELEMENT recette (title,ingredients,duree,etapes)>
+<!ATTLIST recette difficulte (facile|normal|difficile) #REQUIRED>
+<!ELEMENT title #PCDATA >
+<!ELEMENT ingredients (ingredient+) >
+<!ELEMENT duree #PCDATA >
+<!ELEMENT etapes (e*) >
+<!ELEMENT ingredient #PCDATA>
+<!ELEMENT e #PCDATA>
+<!ATTLIST e num CDATA>
+]]></code>
+    </div>
+    <div class="sws-slide">
+      <h1>Un exemple simple (suite)</h1>
+      <p>Un document valide par rapport à la DTD est le suivant</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">
+      <h1>Un exemple simple (suite)</h1>
+      <p>On va extraire des informations du document et en faire une
+      page web :</p>
+<code style="color:black;font-size:80%;position:relative;"><![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><![CDATA[
+            <li> ]]><u>&lt;xsl:value-of select="child::text()" /&gt;</u><![CDATA[ </li>
+          ]]><u>&lt;/xsl:for-each&gt;</u><![CDATA[
+        </ul>
+       </body>
+     </html>
+   </xsl:template>
+  </xsl:stylesheet>
+]]></code>
+</div>
+<div class="sws-slide">
+<h1>Comment exécuter un programme XSLT</h1>
+<ul>
+  <li>En utilisant un moteur XSLT comment le
+  programme <tt>xsltproc</tt> </li>
+  <li>En référençant la feuille de style et en ouvrant le document XML
+  avec Firefox :
+    <code>
+    <![CDATA[<!-- fichier recette.xml -->]]>
+    <u>&lt;?xml-stylesheet type="text/xsl" href="prog.xsl"?&gt;</u><![CDATA[
+    <recette difficulte="facile">
+       <title>Tiramisú</title>
+        <ingredients>
+        ...]]></code>
+  </li>
+  <li>En Java grace à la classe <tt>Transformer</tt> du package <tt>javax</tt></li>
+</ul>
+</div>
+<div class="sws-slide">
+<h1>Structure d'un programme XSLT</h1>
+<p>Un programme XSLT commence par la balise :<code><u><![CDATA[  <xsl:stylesheet version="1.0"
+   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">]]></u></code>
+et fini par la balise : <code><u><![CDATA[  </xsl:stylesheet>]]></u></code>
+Le texte ainsi que les éléments qui ne sont pas dans
+   le <i>namespace</i> « <tt><a>xsl:</a></tt> » sont copiés à
+   l'identique dans la sortie.<br/>
+   Dans la balise principale <tt>&lt;xsl:stylesheet&gt;</tt> on trouve
+   un certain nombre de balises <u><tt>&lt;xsl:template match="…"
+   &gt;</tt></u>.<br/>
+   Les <i>templates</i> vont jouer le rôle de fonctions et vont être
+   appelées pour transformer des nœuds du document en nœuds de sortie.
+</p>
+</div>
+<h1>Les templates XSLT</h1>
+<div class="sws-slide">
+  <h1>Templates</h1>
+<p>Un template est délimité par une balise <u><tt>&lt;xsl:template match="…"
+   &gt;</tt></u> où le «&nbsp;…&nbsp;» est une expression XPath. Il peut y avoir
+   plusieurs templates dans un fichier XSLT. <br/>
+   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 <tt>match</tt> sont passés en argument au template.<br/>
+   Initialement, tous les templates existants sont appliqués au nœud
+   fictif document.
+  </p>
+</div>
+<div class="sws-slide">
+  <h1>Retour sur l'exemple</h1>
+  <code style="color:black;font-size:80%;position:relative;"><![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><![CDATA[
+            <li> ]]><u>&lt;xsl:value-of select="child::text()" /&gt;</u><![CDATA[ </li>
+          ]]><u>&lt;/xsl:for-each&gt;</u><![CDATA[
+        </ul>
+       </body>
+     </html>
+   </xsl:template>
+  </xsl:stylesheet>
+]]></code>
+<ol><li>Initialement tous les templates (il n'y en a qu'un ici) sont
+    appliqués à la racine du document</li>
+<li>Pour chacun d'entre eux, l'expression XPath dans
+  le <tt>match</tt> est contrôlée. Si elle réussit, alors le template
+  est appliqué au nœud</li>
+</ol>
+</div>
+<div class="sws-slide">
+<h1>Deuxième exemple, 2 templates</h1>
+<p>
+  <code style="color:black;font-size:80%;position:relative;"><![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:apply-templates select="descendant::ingredient" /&gt;</u><![CDATA[
+        </ul>
+       </body>
+     </html>
+   </xsl:template>
+   <xsl:template match="ingredient">
+     <li> ]]><u>&lt;xsl:value-of select="child::text()" /&gt;</u><![CDATA[ </li>
+   </xsl:template>
+  </xsl:stylesheet>]]></code></p>
+<ol style="background:white;"><li>On applique tous les templates à la racine. Le
+    template <tt>match="/"</tt> réussit, le
+    template <tt>match="ingredient"</tt> échoue.</li>
+<li>L'expression
+  <tt><![CDATA[<xsl:apply-templates select="…" />]]></tt>
+  réapplique <a>tous</a> les templates à tous les nœuds sélectionnés
+  par l'expression XPath.</li>
+</ol></div>
+<div class="sws-slide">
+<h1>Priorité des templates</h1>
+<p>Que se passe-t-il si deux templates peuvent s'appliquer à un même
+  élément&nbsp;? On applique les règles de priorité suivantes
+  (simplifiées) :
+</p>
+<ol>
+<li>Si le <tt>match</tt> d'un template contient un <tt>|</tt> entre
+  plusieurs chemins, la priorité la plus élevée de ces chemins est choisie
+</li>
+<li>si le <tt>match</tt> est de la forme : <tt>child::foo</tt>
+  ou <tt>attribute:foo</tt>, sa priorité est 0 </li>
+<li>si le <tt>match</tt> est de la forme : <tt>child::*</tt> ou
+  ou <tt>attribute:*</tt>, sa priorité est -0.25 </li>
+<li>si le <tt>match</tt> est de la form : <tt>child::text()</tt>
+  ou <tt>child::node()</tt> (idem avec <tt>attribute</tt>), sa
+  priorité est -0.5</li>
+<li>sinon (test complexe, par exemple <tt>foo[ count(child::bar) &lt;
+    4]</tt>), la priorité est 0.5</li>
+</ol>
+<p>Le template ayant la priorité la plus élevée est choisi. On peut
+  donner explicitement à un template une priorité avec
+  l'attribut <tt>priority="…"</tt><br/>Le moteur XSLT <s>lève une
+  erreur</s> d'exécution si deux templates ont exactement la même
+  priorité.</p>
+</div>
+<div class="sws-slide">
+<h1>Templates par défaut</h1>
+<p>Il existe 3 templates <a>par défaut</a> qui sont toujours
+  définis :</p>
+<code><![CDATA[  <xsl:template match="*|/">
+     <xsl:apply-templates/>
+  </xsl:template>
+
+  <xsl:template match="text()|@*">
+    <xsl:value-of select="."/>
+  </xsl:template>
+
+  <xsl:template match="processing-instruction()|comment()"/>
+]]>
+</code>
+<p>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.
+</p>
+</div>
+  </body>
+</html>