1 <?xml version="1.0" encoding="utf-8" ?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
3 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
5 <html xmlns="http://www.w3.org/1999/xhtml" >
9 <meta http-equiv="Content-Type"
10 content="text/html; charset=utf-8" />
11 <meta name="copyright"
12 content="Copyright © 2013 Kim Nguyễn" />
15 <script src="../jquery-1.9.1.min.js" type="text/javascript" ></script>
16 <!-- Load the library -->
17 <script src="../simpleWebSlides.js" type="text/javascript" ></script>
19 <link rel="stylesheet" href="../simpleWebSlides.css" type="text/css" media="all" />
20 <!-- Load a custom Theme, the class-element marks this style-sheet
21 a "theme" that can be swtiched dynamicaly -->
22 <link class="sws-theme" rel="stylesheet" title="U-Psud style" href="../themes/uPsud.css" type="text/css" />
24 <!-- Customize some templates and initialize -->
25 <style type="text/css">
26 .xml-tag { color: #00486c; }
28 <script type="text/javascript">
30 SWS.Config['sws-slide-change'] = SWS.Effects.slideChangeFadeOutIn;
31 SWS.Config['sws-object-deactivate'] = SWS.Effects.objectDeactivateFadeOut;
32 SWS.Config['sws-object-activate'] = SWS.Effects.objectActivateFadeIn;
34 //Ensures that we load SWS at the very end, after MathJax has
37 $(window).load(function () {
38 $(".inline-xml").each(function(i, elem)
41 var code = jelem.html();
42 code = code.replace ("<![CDATA" + "[", "").replace ("]" + "]>", "");
43 code = code.replace (/>/g, ">>>");
44 code = code.replace (/</g, "<span class='xml-tag'><");
45 code = code.replace (/>>>/g,"></span>");
51 var checkSVG = function (o, i)
53 if (i >= 10 || SWS.Utils.isUndefined(o) || o == null) return;
54 var svg = o.getSVGDocument();
56 setTimeout(function() { checkSVG(o, i+1); }, 200);
58 var alltext = $(svg).find("text");
59 alltext.css("font-family", "DIN");
60 alltext.css("font-size", "70%");
64 $(window).load(function() {
65 $("embed").ready(function() {
66 setTimeout(function() {
67 $("embed").each(function(i, o) { checkSVG(this,0); });
71 $(window).load(SWS.Presentation.init);
79 <a href="xpi_03.xhtml" class="sws-previous"/>
80 <div class="sws-slide sws-cover sws-option-nofooter">
81 <h1>XML et Programmation Internet</h1>
83 <a href="mailto:kn@lri.fr">kn@lri.fr</a>
86 <div class="sws-slide">
87 <h1>Utilisation des <i>namespaces</i></h1>
88 <p><a>Problème</a> : comment mélanger au sein d'un même document des
89 balises venant de deux DTDs (ou schémas) <a>différentes</a>
90 ?<br/>Exemple : mettre du SVG (images vectorielles) dans
91 du XHTML (page web)</p>
92 <code style="font-size:80%;width:50%;float:left"><![CDATA[
93 <svg width="400" height="180">
98 width="150" height="150"
99 style="fill:red;stroke:black;
100 stroke-width:5;opacity:0.5" />
104 <code style="font-size:80%;width:50%;float:left"><![CDATA[
106 <head><title>Mon image</title></head>
110 <!-- contenu de l'image -->
116 <p>Comment spécifier que certains éléments doivent êtres
117 <a>interprétés</a> ? (par exemple par le navigateur web) et que
118 d'autres font parties des données ?</p>
120 <div class="sws-slide">
121 <h1>L'attribut <tt>xmlns</tt></h1>
122 <p>On peut utiliser un <a>attribut</a> spécial, <tt>xmlns</tt>
123 qui est autorisé dans <a>tous les documents XML</a>
124 sur <a>n'importe quel élément</a>. La valeur de ce dernier est
125 un lien identifiant la DTD et indique tous les descendants de
126 l'élément en question sont valides par rapport à la
129 <code style="font-size:80%;background:white;"><![CDATA[
130 <html ]]><s>xmlns="http://www.w3.org/1999/xhtml"</s><![CDATA[>
131 <head><title>Mon image</title></head>
134 <svg width="400" height="180" ]]><s>xmlns="http://www.w3.org/2000/svg"</s><![CDATA[>
139 width="150" height="150"
140 style="fill:red;stroke:black;
141 stroke-width:5;opacity:0.5" />
149 <div class="sws-slide">
150 <h1>L'attribut <tt>xmlns</tt></h1>
151 <p>On peut aussi donner <a>un nom</a> à un namespace particulier
152 et réutiliser ce nom dans les balises:</p>
153 <code style="font-size:80%;background:white;"><![CDATA[
154 <html ]]><s>xmlns="http://www.w3.org/1999/xhtml"</s>
155 <a>xmlns:svg="http://www.w3.org/2000/svg"</a><![CDATA[>
156 <head><title>Mon image</title></head>
159 <svg:svg width="400" height="180"
164 width="150" height="150"
165 style="fill:red;stroke:black;
166 stroke-width:5;opacity:0.5" />
170 <p style="background:white;">en utilisant l'attribut <tt>xmlns:toto="..."</tt> alors toutes la
171 balises de la forme <tt><toto:nombalise></tt> appartiennent au
172 namespace <tt>toto</tt>. Il ne faut pas oublier le namespace sur la
173 balise fermante !</p>
175 <div class="sws-slide">
177 <p>L'exemple précédent ressemble à ça :</p>
178 <div style="border: 1pt solid gray;margin: 10pt">
179 <h1 style="font-family:Serif;color:black;text-align:left">Mon image</h1>
180 <svg width="400" height="180" xmlns="http://www.w3.org/2000/svg">
185 width="150" height="150"
186 style="fill:red;stroke:black;
187 stroke-width:5;opacity:0.5" />
191 <h1>XSLT, principes</h1>
192 <div class="sws-slide">
194 <p><a>eXtensible Stylesheet Language Transformations</a> : est
195 un langage de transformation de documents XML. Il permet
196 d'extraire (au moyen d'XPath) des nœuds d'un <a>document d'entrée</a>
197 et de les ré-organiser et de les copier dans un <a>document de
199 Le document de sortie est souvent du XML lui-même mais peut
200 être aussi du texte, du PDF, …
203 <li>XSLT est standardisé par le W3C</li>
204 <li>Les programmes XSLT sont écrit eux-même en XML</li>
205 <li>Il existe plusieurs versions du standard (1.0, 2.0,
206 3.0). Ce cours fait juste une introduction aux fonctionalités
207 les plus simples (1.0)</li>
210 <div class="sws-slide">
211 <h1>Un exemple simple</h1>
212 <p>On réutilise un document de recette de cuisine
213 du <a href="xpi_01.xhtml">cours 01</a>. La DTD est:</p>
214 <code style="color:black;position:relative;left:10%;"><![CDATA[<!ELEMENT recette (title,ingredients,duree,etapes)>
215 <!ATTLIST recette difficulte (facile|normal|difficile) #REQUIRED>
216 <!ELEMENT title #PCDATA >
217 <!ELEMENT ingredients (ingredient+) >
218 <!ELEMENT duree #PCDATA >
219 <!ELEMENT etapes (e*) >
220 <!ELEMENT ingredient #PCDATA>
222 <!ATTLIST e num CDATA>
225 <div class="sws-slide">
226 <h1>Un exemple simple (suite)</h1>
227 <p>Un document valide par rapport à la DTD est le suivant</p>
228 <code style="color:black;font-size:80%;position:relative;left:10%;"><![CDATA[
229 <!DOCTYPE recette SYSTEM "recette.dtd">
230 <recette difficulte="facile">
231 <title>Tiramisú</title>
233 <ingredient>mascarpone</ingredient>
234 <ingredient>oeufs</ingredient>
235 <ingredient>sucre</ingredient>
236 <ingredient>café</ingredient>
237 <ingredient>biscuits</ingredient>
241 <e num="1">Séparer les blancs des jaunes</e>
248 <div class="sws-slide">
249 <h1>Un exemple simple (suite)</h1>
250 <p>On va extraire des informations du document et en faire une
252 <code style="color:black;font-size:80%;position:relative;"><![CDATA[ <xsl:stylesheet version="1.0"
253 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
254 <xsl:template match="/">
257 <title>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </title>
260 <h1>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </h1>
262 ]]><u><xsl:for-each select="descendant::ingredient"></u><![CDATA[
263 <li> ]]><u><xsl:value-of select="child::text()" /></u><![CDATA[ </li>
264 ]]><u></xsl:for-each></u><![CDATA[
272 <div class="sws-slide">
273 <h1>Comment exécuter un programme XSLT</h1>
275 <li>En utilisant un moteur XSLT comment le
276 programme <tt>xsltproc</tt> </li>
277 <li>En référençant la feuille de style et en ouvrant le document XML
280 <![CDATA[<!-- fichier recette.xml -->]]>
281 <u><?xml-stylesheet type="text/xsl" href="prog.xsl"?></u><![CDATA[
282 <recette difficulte="facile">
283 <title>Tiramisú</title>
287 <li>En Java grace à la classe <tt>Transformer</tt> du package <tt>javax</tt></li>
290 <div class="sws-slide">
291 <h1>Structure d'un programme XSLT</h1>
292 <p>Un programme XSLT commence par la balise :<code><u><![CDATA[ <xsl:stylesheet version="1.0"
293 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">]]></u></code>
294 et fini par la balise : <code><u><![CDATA[ </xsl:stylesheet>]]></u></code>
295 Le texte ainsi que les éléments qui ne sont pas dans
296 le <i>namespace</i> « <tt><a>xsl:</a></tt> » sont copiés à
297 l'identique dans la sortie.<br/>
298 Dans la balise principale <tt><xsl:stylesheet></tt> on trouve
299 un certain nombre de balises <u><tt><xsl:template match="…"
301 Les <i>templates</i> vont jouer le rôle de fonctions et vont être
302 appelées pour transformer des nœuds du document en nœuds de sortie.
305 <h1>Les templates XSLT</h1>
306 <div class="sws-slide">
308 <p>Un template est délimité par une balise <u><tt><xsl:template match="…"
309 ></tt></u> où le « … » est une expression XPath. Il peut y avoir
310 plusieurs templates dans un fichier XSLT. <br/>
311 Un template est appliqué à un ensemble de nœuds. Parmi cet
312 ensemble, tous les nœuds qui vérifient l'expression XPath de
313 l'attribut <tt>match</tt> sont passés en argument au template.<br/>
314 Initialement, tous les templates existants sont appliqués au nœud
318 <div class="sws-slide">
319 <h1>Retour sur l'exemple</h1>
320 <code style="color:black;font-size:80%;position:relative;"><![CDATA[ <xsl:stylesheet version="1.0"
321 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
322 <xsl:template match="/">
325 <title>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </title>
328 <h1>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </h1>
330 ]]><u><xsl:for-each select="descendant::ingredient"></u><![CDATA[
331 <li> ]]><u><xsl:value-of select="child::text()" /></u><![CDATA[ </li>
332 ]]><u></xsl:for-each></u><![CDATA[
339 <ol><li>Initialement tous les templates (il n'y en a qu'un ici) sont
340 appliqués à la racine du document</li>
341 <li>Pour chacun d'entre eux, l'expression XPath dans
342 le <tt>match</tt> est contrôlée. Si elle réussit, alors le template
343 est appliqué au nœud</li>
346 <div class="sws-slide">
347 <h1>Deuxième exemple, 2 templates</h1>
349 <code style="color:black;font-size:80%;position:relative;"><![CDATA[ <xsl:stylesheet version="1.0"
350 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
351 <xsl:template match="/">
354 <title>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </title>
357 <h1>Ingrédients du ]]><u><xsl:value-of select="descendant::title" /></u><![CDATA[ </h1>
359 ]]><u><xsl:apply-templates select="descendant::ingredient" /></u><![CDATA[
364 <xsl:template match="ingredient">
365 <li> ]]><u><xsl:value-of select="child::text()" /></u><![CDATA[ </li>
367 </xsl:stylesheet>]]></code></p>
368 <ol style="background:white;"><li>On applique tous les templates à la racine. Le
369 template <tt>match="/"</tt> réussit, le
370 template <tt>match="ingredient"</tt> échoue.</li>
372 <tt><![CDATA[<xsl:apply-templates select="…" />]]></tt>
373 réapplique <a>tous</a> les templates à tous les nœuds sélectionnés
374 par l'expression XPath.</li>
376 <div class="sws-slide">
377 <h1>Priorité des templates</h1>
378 <p>Que se passe-t-il si deux templates peuvent s'appliquer à un même
379 élément ? On applique les règles de priorité suivantes
383 <li>Si le <tt>match</tt> d'un template contient un <tt>|</tt> entre
384 plusieurs chemins, la priorité la plus élevée de ces chemins est choisie
386 <li>si le <tt>match</tt> est de la forme : <tt>child::foo</tt>
387 ou <tt>attribute:foo</tt>, sa priorité est 0 </li>
388 <li>si le <tt>match</tt> est de la forme : <tt>child::*</tt> ou
389 ou <tt>attribute:*</tt>, sa priorité est -0.25 </li>
390 <li>si le <tt>match</tt> est de la form : <tt>child::text()</tt>
391 ou <tt>child::node()</tt> (idem avec <tt>attribute</tt>), sa
392 priorité est -0.5</li>
393 <li>sinon (test complexe, par exemple <tt>foo[ count(child::bar) <
394 4]</tt>), la priorité est 0.5</li>
396 <p>Le template ayant la priorité la plus élevée est choisi. On peut
397 donner explicitement à un template une priorité avec
398 l'attribut <tt>priority="…"</tt><br/>Le moteur XSLT <s>lève une
399 erreur</s> d'exécution si deux templates ont exactement la même
402 <div class="sws-slide">
403 <h1>Templates par défaut</h1>
404 <p>Il existe 3 templates <a>par défaut</a> qui sont toujours
406 <code><![CDATA[ <xsl:template match="*|/">
407 <xsl:apply-templates/>
410 <xsl:template match="text()|@*">
411 <xsl:value-of select="."/>
414 <xsl:template match="processing-instruction()|comment()"/>
417 <p>Ils ont des priorités inférieures aux templates présents dans le
418 fichier donc ne sont appliqués
419 que si aucun templates ne fonctionne. Ils permettent de « descendre
420 dans l'arbre » (jusqu'aux textes), si aucun template ne s'applique à