La spécification des chemins avec XPath XSLT avancé

Documents pareils
XML par la pratique Bases indispensables, concepts et cas pratiques (3ième édition)

<?xml version="1.0" encoding="iso " standalone="yes"?>

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

Thierry BOULANGER. par la pratique. Bases indispensables Concepts et cas pratiques XML. 3 ième édition. Nouvelle édition

Production de documents avec XSLT. Production de documents p.1/??

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Langage HTML (2 partie) <HyperText Markup Language> <tv>lt La Salle Avignon BTS IRIS</tv>

CRÉER, ROUTER ET GÉRER UNE NEWSLETTER, UN ING

PIVOT. Pivot/Querier Documentation technique XML/XSD/XSLT

Faculté de Génie Chaire industrielle en infrastructures de communication. La technologie XML. Wajdi Elleuch

BASE DE DONNÉES XML NATIVE

(Langage de commandes) Les commandes sont données par l'utilisateur grâce au clavier, à partir d'une "invite" ou "prompt" (par exemple "c:\>" )

Programmation Web. Madalina Croitoru IUT Montpellier

Formulaire pour envoyer un mail

Intégrateur Web HTML5 CSS3

Outils logiciels pour l'ingénierie documentaire

FileMaker Server 11. Publication Web personnalisée avec XML et XSLT

Evolution et architecture des systèmes d'information, de l'internet. Impact sur les IDS. IDS2014, Nailloux 26-28/05/2014

Formation : WEbMaster

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

L'API DOM : Document Object Model

SP1 : Intégration d'une vidéo dans une mardi 21/01/2014. page web, fonction du format vidéo et 3 mercredi 22/01/2014

ECR_DESCRIPTION CHAR(80), ECR_MONTANT NUMBER(10,2) NOT NULL, ECR_SENS CHAR(1) NOT NULL) ;

Master d Informatique Corrigé du partiel novembre 2010

Bureautique Initiation Excel-Powerpoint

Devenez un véritable développeur web en 3 mois!

BIRT (Business Intelligence and Reporting Tools)

Cours d algorithmique pour la classe de 2nde

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Projet 2. Gestion des services enseignants CENTRE D ENSEIGNEMENT ET DE RECHERCHE EN INFORMATIQUE. G r o u p e :

TD3 - Facturation avec archivage automatisé

BASE DE DONNÉES XML NATIVE

Cours 1 : Qu est-ce que la programmation?

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Gestion d identités PSL Exploitation IdP Authentic

Cours 1 : La compilation

3W Academy Programme de Formation Développeur Intégrateur web Total : 400 heures

OpenText StreamServe Cours Customer Communication Management L essentiel

Nuxeo 5.4 : les nouveautés

Générer du code à partir d une description de haut niveau

WordPress Référencement naturel (SEO) Optimiser. son référencement. Daniel Roch. Préface d Olivier Andrieu

Document Object Model (DOM)

INTRODUCTION AU CMS MODX

Introduction. PHP = Personal Home Pages ou PHP Hypertext Preprocessor. Langage de script interprété (non compilé)

Vulnérabilités et sécurisation des applications Web

arcopole Studio Version 3.1

JES Report Broker. Campus Technologies. SAE de CHALEMBERT 1 Rue Blaise PASCAL JAUNAY-CLAN info@campustec.

NFA016 : Introduction. Pour naviguer sur le Web, il faut : Naviguer: dialoguer avec un serveur web

Administration du site (Back Office)

Configuration du FTP Isolé Active Directory

arcopole Studio Annexe 7 Architectures Site du programme arcopole :

Gestion Électronique de Documents et XML. Master 2 TSM

ALGORITHMIQUE ET PROGRAMMATION En C

Adobe Technical Communication Suite 5

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Malgré son aspect spartiate, Freeplane offre de nombreuses fonctionnalités en particulier dans le domaine de la diffusion des cartes sur le Web.

Master Technologies numériques appliquées à l'histoire Deuxième année

HTML, CSS, JS et CGI. Elanore Elessar Dimar

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

STID 2ème année : TP Web/PHP

Introduction à MATLAB R

Server-side XML. PAS FINI... mais ok pour un début. Originaux. Auteurs et version. Prérequis: Java de base, servlets, GUI et XML

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

HTML. Notions générales

TP JAVASCRIPT OMI4 TP5 SRC

Module : programmation site Web dynamique Naviguer entre les pages via site map

Annexe C Spécification pour les fichiers importés en format XML

Programmation Internet Cours 4

Notes de cours : bases de données distribuées et repliquées

Formation Webmaster : Création de site Web Initiation + Approfondissement

DMP1 DSFT des Interfaces DMP des LPS Annexe : complément de spécification sur l impression des documents à remettre au patient

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Drupal Développeur. Theming et développement pour Drupal. Une formation Formateur : Fabien Crépin. Drupal Développeur.

L exclusion mutuelle distribuée

TD3: tableaux avancées, première classe et chaînes

Introduction au développement SharePoint. Version 1.0

Dans nos locaux au 98 Route de Sauve NÎMES. Un ordinateur PC par stagiaire, scanner, imprimante/copieur laser couleur

Serveur d Applications Web : WebObjects

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

SECTION 5 BANQUE DE PROJETS

Programmation Web. Introduction

Partie publique / Partie privée. Site statique site dynamique. Base de données.

TP1. Outils Java Eléments de correction

Initiation à la Programmation en Logique avec SISCtus Prolog

SYSTÈMES D INFORMATIONS

as Architecture des Systèmes d Information

Création et développement d une base de données sur le VIH

Démonstration d utilisation De NesmaCom

Bases de programmation. Cours 5. Structurer les données

Les bases de données

Système de Gestion Informatisée des. Exploitations Agricoles Irriguées avec Contrôle de l Eau

S LICENCE INFORMATIQUE Non Alt Alt SS1 S2 S3 S4 S5 S6 Parcours : IL (Ingénierie Logicielle) SRI (Systèmes et Réseaux Informatiques)

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

4. SERVICES WEB REST 46

TP1 - Prise en main de l environnement Unix.

Playzilla - Chargement par clé usb

Transcription:

La spécification des chemins avec BDISE XML Mathieu Sassolas IUT de Sénart Fontainebleau Département Informatique Année 2016-2017

Plan de la séance & 1 La spécification des chemins avec général Les axes Les filtres Les expressions pour les tests et prédicats 2 Quelques fonctionalités avancées de XSLT Tri Variables et paramètres Petites astuces 2 / 26

But de & Spécification des nœuds sélectionnés pour appliquer des templates ou récupérer une valeur lors des select (ou des match dans la définition des templates). Langage pour les conditions des test (xsl:when, xsl:if...). 3 / 26

But de & Spécification des nœuds sélectionnés pour appliquer des templates ou récupérer une valeur lors des select (ou des match dans la définition des templates). Langage pour les conditions des test (xsl:when, xsl:if...). Parcours dans l arbre avec des tests sur le chemin. 3 / 26

de base & Un chemin est une suite d étapes : Syntaxe d un chemin [/]etape1/etape2/.../etapen Dans chaque étape, on navigue dans l arbre selon des axes : père, fils, frère... On peut également filtrer selon le type de nœud. On peut enfin demander que des prédicats soient vérifiés. Syntaxe d une étape axe::filtre[predicat1][predicat2]... 4 / 26

Les axes Partie I & C est juste de l anglais! self Le nœud courant. attribute Les attributs du nœud courant. child Les fils. descendant Les descendants (fils, petit-fils,...). descendant-or-self Les descendants ou le nœud courant. parent Le père. ancestor Les ancêtres (père, grand-père,...) ; en particulier la racine est toujours un tel nœud. ancestor-or-self Les ancêtres ou le nœud courant. 5 / 26

Les axes Partie II & following-sibling Les frères suivants. preceding-sibling Les frères précédents. following Les nœuds suivants, frères ou non (suivant dans la lecture XML). preceding Les nœuds précédents, frères ou non (précédant dans la lecture XML). namespace Les nœuds ayant le même espace de nom que le nœud courant. 6 / 26

Les types de nœuds & Pour, tout est un nœud (node), mais il y en a plusieurs types : attributs, éléments, texte, commentaire (principalement). Tous les nœuds : node(). Tous les types d attributs : * (lorsque l on navigue dans l axe attribut) Tous les types d éléments : * (sinon) Un type d élément particulier : MonElement. Les nœuds de type texte : text(). Les nœuds de type commentaire : comment(). 7 / 26

Exemples & child::monelement Tous les fils de type monelement (équivalent abrégé : monelement). parent::node()/attribute::* Tous les attributs du nœud père (équivalent abrégé :../@*). descendant-or-self::comment() Tous les commentaires se trouvant dans les descendants au sens large (équivalent abrégé : //comment()). descendant::text() Tous le texte (càd #PCDATA) dans les descendants stricts (équivalent abrégé : *//text()). 8 / 26

Les expressions Partie I & 9 / 26 Servent dans les test="... " et dans les prédicats : axe::filtre[prédicat]. elt Présence d un élément fils de type elt (peut être un chemin plus complexe...). @attribut Présence d un attribut de type attribut. @attribut = texte Teste si la valeur de l attribut attribut est égale à au texte texte. @attribut!= texte Teste si la valeur de l attribut attribut est différente du texte texte. @attribut <op> valeur où <op> {<, <=, >, >=, =,!=} et valeur est un entier. Remarque On peut tester également la valeur d un élément, mais ça ne prend pas que la partie texte : il faut utiliser element/texte().

Les expressions Partie II & 10 / 26 On peut manipuler un peu plus les valeurs d attribut (et d éléments) via des fonctions. Opérations arithmétiques (valeurs numériques) : +, -, *, div (division flottante), mod (reste de la division euclidienne). Opérations bouléennes : and, or, not(...). Opérations de traduction : translate(texte, caractère_à_remplacer,remplacer_par) Le remplacement fonctionne caractère par caractère et est sensible à la casse! Exemple translate( Abracadabra, ba, zo ) Azrocodozro translate( Abracadabra, ba, z ) Azrcdzr

Les expressions Partie III & Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! 11 / 26

Les expressions Partie III & Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! <xsl:template match="pere"> Current: <xsl:value-of select="fils[current()/@prefere = @code]/@nom"/> Self ou équivalents: self::node() <xsl:value-of select="fils[self::node()/@prefere = @code]/@nom"/>. <xsl:value-of select="fils[./@prefere = @code]/@nom"/> &apos;rien&apos; <xsl:value-of select="fils[@prefere = @code]/@nom"/> </xsl:template> 11 / 26

& <pere prefere="gg" code="pp"> <fils code="dd" nom="dédé" prefere="pp"/> <fils code="gg" nom="gégé" prefere="dd"/> <fils code="tt" nom="toto" prefere="tt"/> </pere> Les expressions Partie III Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! <xsl:template match="pere"> Current: <xsl:value-of select="fils[current()/@prefere = @code]/@nom"/> Self ou équivalents: self::node() <xsl:value-of select="fils[self::node()/@prefere = @code]/@nom"/>. <xsl:value-of select="fils[./@prefere = @code]/@nom"/> &apos;rien&apos; <xsl:value-of select="fils[@prefere = @code]/@nom"/> </xsl:template> 11 / 26

& 11 / 26 <pere prefere="gg" code="pp"> <fils code="dd" nom="dédé" prefere="pp"/> <fils code="gg" nom="gégé" prefere="dd"/> <fils code="tt" nom="toto" prefere="tt"/> </pere> Les expressions Partie III Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! <xsl:template match="pere"> Current: <xsl:value-of select="fils[current()/@prefere = @code]/@nom"/> Self ou équivalents: self::node() <xsl:value-of select="fils[self::node()/@prefere = @code]/@nom"/>. <xsl:value-of select="fils[./@prefere = @code]/@nom"/> &apos;rien&apos; <xsl:value-of select="fils[@prefere = @code]/@nom"/> </xsl:template> Current: Gégé Self ou équivalents: self::node() Toto. Toto rien Toto

Les expressions Partie III & Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! Union d un ensemble de nœuds :, par exemple elt[fils1 fils2]/petitfils. 11 / 26

Les expressions Partie III & 11 / 26 Le nœud courant : current(). Attention! N est pas relatif au chemin Xpath en cours d évaluation! Union d un ensemble de nœuds :, par exemple elt[fils1 fils2]/petitfils. Tests sur la position du nœud parmis ses frères : position() = last(), position() = 1, position() mod 2 = 0. Remarque Attention, les nœuds de texte, de commentaires, etc sont aussi comptés. À n utiliser que dans un ensemble de nœud que l on connaît : elt[position()=last()] choisit le dernier parmi les éléments elt.

Quelques autres fonctions utiles & 12 / 26 Sur les chaînes de caractères : contains(contenant,contenu) Si le contenant contient le contenu. Sensible à la casse! concat(chaine1,chaine2,...) Concaténation de chaînes. substring(chaine,pos,longueur) Sous-chaîne de longueur long à partir de la position pos. Fonctions numériques : count(chemin/xpath) Compte le nombre de nœuds désignés par le chemin. sum(chemin/xpath) Fait la somme des valeurs des nœuds désignés par le chemin (n a du sens que si le contenu du chemin sont des nombres).

Remarques & Il existe d autres fonctions que celles présentées. Attention On utilise XSLT 1.0, des fonctions trouvées dans des docs pourraient ne fonctionner que dans XSLT 2.0. 13 / 26

Remarques & Il existe d autres fonctions que celles présentées. Attention On utilise XSLT 1.0, des fonctions trouvées dans des docs pourraient ne fonctionner que dans XSLT 2.0. Les prédicats s évaluent dans le contexte local : pere/fils[@attr="42"] teste la valeur de l attribut attr du fils. Les enchaînement de prédicats ne fonctionnent pas exactement comme des conjonction : elt[pred1][pred2] teste pred2 sur les nœuds désignés par elt[pred1] Attention en particulier lors de tests avec position(). 13 / 26

Remarques & Il existe d autres fonctions que celles présentées. Encha^ınement: <xsl:value-of select="viande[@gras = no ][position() = 1]/@id"/> [end] Conjonction: <xsl:value-of select="viande[@gras = no and position() = 1]/@id"/> [end] Attention On utilise XSLT 1.0, des fonctions trouvées dans des docs pourraient ne fonctionner que dans XSLT 2.0. Les prédicats s évaluent dans le contexte local : pere/fils[@attr="42"] teste la valeur de l attribut attr du fils. Les enchaînement de prédicats ne fonctionnent pas exactement comme des conjonction : elt[pred1][pred2] teste pred2 sur les nœuds désignés par elt[pred1] Attention en particulier lors de tests avec position(). 13 / 26

& 13 / 26 Remarques <viande gras="yes" id="1"/> <viande gras="no" id="2"/> <viande gras="no" id="3"/> <viande gras="yes" id="4"/> Il existe d autres fonctions que celles présentées. Encha^ınement: <xsl:value-of select="viande[@gras = no ][position() = 1]/@id"/> [end] Conjonction: <xsl:value-of select="viande[@gras = no and position() = 1]/@id"/> [end] Attention On utilise XSLT 1.0, des fonctions trouvées dans des docs pourraient ne fonctionner que dans XSLT 2.0. Les prédicats s évaluent dans le contexte local : pere/fils[@attr="42"] teste la valeur de l attribut attr du fils. Les enchaînement de prédicats ne fonctionnent pas exactement Enchaînement: comme des conjonction : elt[pred1][pred2] teste pred2 2 [end] sur les nœuds désignés par elt[pred1] Attention Conjonction: en particulier lors de tests avec position(). [end]

Fin du cours sur & ë C est l heure du TD sur ê 14 / 26

& 15 / 26

Tri des éléments & Tri Variables et paramètres Petites astuces Syntaxe (abrégée) <xsl:sort select="champ_pour_trier" [order="ascending descending"] [data-type="text number"]/> Au sein d une boucle for-each ou d un apply-templates. Le champ pour trier est un chemin relatif aux nœuds sélectionnés par le for-each ou l apply-templates. On peut les enchaîner : on trie d abord selon le premier critère puis selon le second en cas d égalité, etc. 16 / 26

Tri des éléments & Tri Variables et paramètres Petites astuces Syntaxe (abrégée) <xsl:apply-templates> <xsl:sort select="@gras"/> <xsl:sort select="@note" data-type="number"/> </xsl:apply-templates>... <xsl:template match="viande"> <xsl:value-of select="@id"/>; </xsl:template> <xsl:sort select="champ_pour_trier" [order="ascending descending"] [data-type="text number"]/> Au sein d une boucle for-each ou d un apply-templates. Le champ pour trier est un chemin relatif aux nœuds sélectionnés par le for-each ou l apply-templates. On peut les enchaîner : on trie d abord selon le premier critère puis selon le second en cas d égalité, etc. 16 / 26

& Tri Variables et paramètres Petites astuces Tri des éléments <viande gras="yes" id="1" note="c"/> <viande gras="no" id="2" note="b"/> <viande gras="no" id="3" note="a"/> <viande gras="yes" id="4" note="b"/> <viande gras="maybe" id="5" note="a"/> Syntaxe (abrégée) <xsl:apply-templates> <xsl:sort select="@gras"/> <xsl:sort select="@note" data-type="number"/> </xsl:apply-templates>... <xsl:template match="viande"> <xsl:value-of select="@id"/>; </xsl:template> <xsl:sort select="champ_pour_trier" [order="ascending descending"] [data-type="text number"]/> Au sein d une boucle for-each ou d un apply-templates. Le champ pour trier est un chemin relatif aux nœuds sélectionnés par le for-each ou l apply-templates. On peut les enchaîner : on trie d abord selon le premier critère puis selon le second en cas d égalité, etc. 16 / 26

& Tri Variables et paramètres Petites astuces 16 / 26 Tri des éléments <viande gras="yes" id="1" note="c"/> <viande gras="no" id="2" note="b"/> <viande gras="no" id="3" note="a"/> <viande gras="yes" id="4" note="b"/> <viande gras="maybe" id="5" note="a"/> Syntaxe (abrégée) <xsl:apply-templates> <xsl:sort select="@gras"/> <xsl:sort select="@note" data-type="number"/> </xsl:apply-templates>... <xsl:template match="viande"> <xsl:value-of select="@id"/>; </xsl:template> <xsl:sort select="champ_pour_trier" [order="ascending descending"] [data-type="text number"]/> Au sein d une boucle for-each ou d un apply-templates. Le champ pour trier est un chemin relatif aux nœuds sélectionnés 5; par le for-each ou l apply-templates. 3; On peut les enchaîner 2; : on trie d abord selon le premier critère puis selon 4; le second en cas d égalité, etc. 1;

Utilisation de variables Version simple & Tri Variables et paramètres Petites astuces Syntaxe <xsl:variable name="nomvariable"> Du contenu <tag>potentiellement</tag> XML </xsl:variable>... <xsl:value-of select="$nomvariable"/> <xsl:copy-of select="$nomvariable"/> On ne peut pas réaffecter ni redéfinir une variable. value-of prend la valeur textuelle de la variable. copy-of prend la valeur tout le contenu de la variable, y compris le XML. 17 / 26

Utilisation de variables Version simple & Tri Variables et paramètres Petites astuces Syntaxe <xsl:variable name="nomvariable"> Du contenu <tag>potentiellement</tag> XML </xsl:variable>... <xsl:value-of select="$nomvariable"/> <xsl:copy-of select="$nomvariable"/> On ne peut pas réaffecter ni redéfinir une variable. value-of prend la valeur textuelle de la variable. copy-of prend la valeur tout le contenu de la variable, y compris le XML. Du contenu potentiellement XML Du contenu <tag>potentiellement</tag> XML 17 / 26

Utilisation de variables Version simple & Tri Variables et paramètres Petites astuces Syntaxe <xsl:variable name="nomvariable"> Du contenu <tag>potentiellement</tag> XML </xsl:variable>... <xsl:value-of select="$nomvariable"/> <xsl:copy-of select="$nomvariable"/> On ne peut pas réaffecter ni redéfinir une variable. value-of prend la valeur textuelle de la variable. copy-of prend la valeur tout le contenu de la variable, y compris le XML. 17 / 26 La portée de la variable est tout son parent xsl:..., après sa déclaration. Cela comprend donc les descendants de ses frères.

Utilisation de variables Version avancée & Tri Variables et paramètres Petites astuces Le contenu des variables peut aussi provenir du document via XSLT. Exemple <xsl:variable name="sexe"> <xsl:choose> <xsl:when test="@genre = M "> C est un homme</xsl:when> <xsl:when test="@genre = F "> C est une femme</xsl:when> <xsl:otherwise>on ne sait pas: "<xsl:value-of select="@genre"/>"</xsl:otherwise> </xsl:choose> </xsl:variable> 18 / 26

Utilisation de paramètres & Les variables sont locales, elles ne peuvent être passées en paramètre dans d autres templates. Les paramètres, au contraire, sont faits pour ça. Tri Variables et paramètres Petites astuces 19 / 26 Syntaxe <xsl:template name="nomtemplate"> <xsl:param name="nomparametre" select=" valeurpardefaut "/>... </xsl:template>... <xsl:call-template name="nomtemplate"> <xsl:with-param name="nomparametre" select="valeur/qui[peut/etre]/unchemin/@xpath"/> <xsl:call-template/>

Commentaires dans la sortie & Tri Variables et paramètres Petites astuces 20 / 26 Syntaxe <xsl:comment> Du commentaire </xsl:comment> Exemple <xsl:template match="comment()"> <xsl:comment> Commentaire repris du XML original: """ <xsl:value-of select="."/> """ </xsl:comment> </xsl:template>

Copier des éléments du XML source Idée & Tri Variables et paramètres Petites astuces Syntaxe <xsl:variable name="nomvariable"> Du contenu <tag>potentiellement</tag> XML </xsl:variable>... <xsl:copy>nouveau contenu</xsl:copy> <xsl:copy-of select="element/ou/chemin"/> Deux manières de copier. Copie de l élément sans copie des fils (ni des attributs). Copie profonde, avec les descendants. xsl:copy-of doit toujours être un élément vide. 21 / 26

Copier des éléments du XML source Exemple & Tri Variables et paramètres Petites astuces Document XML <elem attr="intro">bonjour</elem> Feuille XSLT Shallow: <xsl:copy>au revoir</xsl:copy> Deep: <xsl:copy-of select="."/> Résultat Shallow: <elem>au revoir</elem> Deep: <elem attr="intro">bonjour</elem> 22 / 26

Formater du texte comme tel & Tri Variables et paramètres Petites astuces Syntaxe <xsl:text> Du texte sans balises! </xsl:comment> Exemple (XSLT) <xsl:text>avant un truc: </xsl:text> <xsl:value-of select="@note"/> <xsl:text>. Après le truc.</xsl:text> Exemple (Résultat) Avant un truc: A. Après le truc. 23 / 26 Remarque Les espaces autour de la valeur sont corrects!

Astuce & Utiliser le navigateur comme processeur XSLT. Tri Variables et paramètres Petites astuces Fortement déconseillé lors de la phase d écriture de la feuille XSL : débuggage impossible. Plutôt utile pour rendre facile la lecture de XML (transformation en HTML plutôt qu ajout de CSS). Demande d avoir la main sur le XML. Commande <?xml-stylesheet type="text/xsl" href="feuillexslt.xsl"?> 24 / 26

Fin du cours & Tri Variables et paramètres Petites astuces ë C est l heure du TP ê 25 / 26

& Tri Variables et paramètres Petites astuces 26 / 26