22/09/2009 MIF13 Programmation Web TECHNOLOGIES CÔTÉ CLIENT ( LAN G AG E S D É D I É S AU W E B 2 ÈME PAR TI E ) LIONEL MÉDINI SEPTEMBRE-DÉCEMBRE 2009 Plan du cours Partie 1 Localisation et identification de ressources Introduction aux langages à balises et aux langages dédiés au Web XML (X)HTML Validation de documents MIF 18 Schémas XML Xpath Plan du cours Transformation d’arbres XML : XSL MIF 18 Schémas XML Xpath/Xquery Partie 2 XSL : transformation d’arbres Caractéristiques de XSL Officiellement : XML Stylesheet Language En pratique, ça ne sert à rien d’appliquer des éléments de style à un document XML Mais XSL fournit un mécanisme très puissant pour transformer un arbre XML Principe de fonctionnement XSLT CSS : caractéristiques de styles et outils disponibles sur le Web Autres types de technos côté client En un autre arbre XML (échange de données) En un arbre XHTML (visualisation des données XML) En un texte simple (fichier non destiné à une application utilisant un parser XML) En un document papier formatté (XSL-FO) Présentation générale et pointeurs JavaScript : principes de scripting/programmation côté client SVG, Flash, Silverlight Transformation d’arbres XML : XSL Utilisation la plus courante de XSL Niveau structuration Arbre XML source (données) Application : navigateur… Transformation d’arbres XML : XSL Les deux composants de XSL XPath Processeur XML DTD ou schéma XML (structure) XPath Données et métadonnées Niveau composition Description de l’arbre résultant (modèle de transformation XSL) Permet de pointer vers les données de l’arbre XML Ne respecte pas la syntaxe XML Processeur XSLT pour le parcours de documents XML pour le test de valeurs associées aux contenus ou aux attributs d’éléments pour ne pas « perturber » l’analyse des feuilles de style XSLT par le parser XML Mise en forme (feuilles de style CSS) Niveau visualisation Document XHTML 1 22/09/2009 Transformation d’arbres XML : XSL Les deux composants de XSL XPath Les deux composants de XSL XPath Nœud Tout type de données (élément, attribut, PI) Racine du document : '/‘ Les éléments sont identifiés par leurs noms Les attributs sont identifiés par '@' suivi du nom de l’attribut Nom d’axe Déplacements complexes dans l’arbre XPath Syntaxe : Nom_D_Axe::Nom_De_Noeud Recommandation : http://www.w3.org/TR/xpath20/#axes Absolu : à partir de la racine de l’arbre XPath Relatif : à partir du nœud contextuel Récursif : à partir du nœud contextuel, mais seulement « vers le bas » Description Exemple d’utilisation/ syntaxe abrégée self::node() ou Transformation d’arbres XML : XSL ./node() ou . Nœud contextuel child Enfants du nœud contextuel descendant Tout enfant, petit enfant etc. du nœud contextuel descendant::Etat_civil descendant-or-self:: Etat_civil ou .//Etat_civil parent Parent du nœud contextuel parent::Prenom ou ../Prenom ancestor Tout parent, grand parent etc. du nœud contextuel ancestor::Prenom ancestor-or-self Comme parent + le nœud contextuel lui-même ancestor-or-self::Prenom following-sibling Tous les frères suivants du nœud contextuel (vide si le nœud following-sibling::Nom est un attribut) preceding-sibling Tous les frères précédents du nœud contextuel (vide si le nœud est un attribut) preceding-sibling::Prenom following following–sibling + descendants de tous les nœuds frères suivants following::Nom preceding preceding–sibling + descendants de tous les nœuds frères précédents preceding::Prenom attribute Attributs du nœud contextuel attribute::id ou./@id namespace Tous les nœuds appartenant au même espace de noms que le nœud indiqué namespace::xhtml:div Transformation d’arbres XML : XSL Les deux composants de XSL XPath Opérateurs et fonctions Accesseurs Transformation d’arbres XML : XSL child::Etat_civil ou Etat_civil (défaut) descendant-or-self Comme descendant + le nœud contextuel lui-même Axes de navigation (poly p. 75) Chemin de localisation self Transformation d’arbres XML : XSL Les deux composants de XSL XPath Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : principes de base • Pour récupérer un élément d’un nœud • Exemples : node-name(), string(), base-uri() Génération d’erreurs Génération de traces Constructeurs • error() • trace() • Pour les types de données XML spécifiques • Exemple : MonType() Opérateurs et fonctions Expression de caractéristiques de sélection complexes Communs avec XQuery Recommandation à part entière : http://www.w3.org/TR/xquery-operators/ Description de l’arbre résultant (programmation déclarative) Application XML définissant des « éléments de transformation » ⇒ Référence à un espace de noms spécifique « xsl: » Éléments et attributs spécifiques interprétés par un processeur XSLT Structuration par modèles (« templates ») de contenus Définissant le traitement à appliquer à un élément repéré par une expression XPath Imbriqués grâce à des mécanismes d’application de templates parallèle avec les fonctions en programmation déclarative Casting entre types de données 2 22/09/2009 Transformation d’arbres XML : XSL Principe général de la transformation d’arbres Requête XPath Données et méta-données <CV xmlns="…"> <Etudiant> <Nom>Toto</Nom> <Rubrique> <Item> <Contenu>1</Contenu> <Contenu>2</Contenu> <Contenu>3</Contenu> </Item> </Rubrique> </Etudiant> </CV> Légende élément attribut texte Processeur XSLT Arbre XML source (données) Description de l’arbre résultant (feuille de style XSLT) • Modèles de contenus • Conditions à remplir pour ces modèles • Spécification des données à récupérer Éléments de premier niveau (cardinalité=0 ou 1) <xsl:strip-space> et <xsl:preserve-space> : gestion des espaces dans l’arbre résultant (resp. suppression et conservation) • Attribut elements : noms des éléments concernés séparés par des espaces <xsl:template> : modèle racine de l’arbre de sortie • Attribut match : désigne le nœud XPath concerné par le modèle (au premier niveau, toujours "/") • Contient la racine de la déclaration de l’arbre de sortie Autres éléments (key, variable, attribute-set, param) : voir la recommandation Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : les éléments Génération de contenus XML <xsl:element name="p" namespace="xhtml">Contenu de l’élément (ici: un paragraphe XHTML)</xsl:element> Remarque : <xsl:element> n’est nécessaire que lorsque le nom de l’élément à générer doit être calculé <xsl:attribute name="href" namespace="xhtml">Contenu de l’attribut (ici : référence XHTML)</xsl:attribute> Remarque : <xsl:attribute> se place dans l’élément auquel il se rapporte <xsl:text>Contenu textuel quelconque.</xsl:text> Remarque : <xsl:text> ne sert qu’au formatage du texte (gestion des espaces…) Tout autre élément XML bien formé est accepté Élément racine <xsl:stylesheet version="1.0" xmlns:xsl=”http://www.w3.org/1999/XSL/Transform”> <html xmlns="…"> <head> <title> Toto </title> </head> <body> <ul> <li> 1 </li> <li> 2 </li> <li> 3 </li> </ul> </body> </html> Les deux composants de XSL XSLT : syntaxe Les deux composants de XSL XSLT : syntaxe Arbre résultat (après transformation) Transformation d’arbres XML : XSL Transformation d’arbres XML : XSL Éléments de premier niveau (cardinalité=0 ou 1) <xsl:output> : définit le type d’arbre de sortie • Attribut method : 3 valeurs possibles (text, html, xml) • Autres attributs : version, encoding, standalone, indent… <xsl:include> et <xsl:import> : permettent d’inclure d’autres feuilles de style • Attribut href : URI de la ressource à inclure • Différence entre les deux : règles de priorités Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : les templates Définition Modèles simples : <xsl:template match="noeud_XPath"> • L’expression XPath qui définit le nœud peut inclure un filtre • Ce nœud devient le nœud contextuel dans le template Modèles nommés : <xsl:template name="nom_tmplate"> Appel Modèles simples : <xsl:apply-templates select="expr_XPath" /> • L’expression XPath est un chemin de localisation qui désigne le nœud Modèles nommés : <xsl:call-template name="nom_tmplate" /> Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : les éléments Traitement de contenus de l’arbre XML source <xsl:value-of select="expr_XPath" /> • Permet d’obtenir la valeur d’un nœud (élément ou attribut) • L’expression XPath est un chemin de localisation • Elle désigne un nœud à partir du nœud contextuel <xsl:copy-of select="expr_XPath" /> • Permet de recopier dans l’arbre destination toute une partie de l’arbre source • L’expression XPath fonctionne comme précédemment <xsl:copy /> • Permet de copier uniquement un élément sans ses sous-éléments 3 22/09/2009 Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : les éléments Structures de contrôle <xsl:if test="expr_XPath">Contenu conditionnel</xsl:if> • Le contenu conditionnel peut être composé d’autres éléments (<xsl:value-of select="expr_XPath" />) <xsl:for-each select="expr_XPath">Contenu répété</xsl:for-each> • Cet élément est redondant avec <xsl:apply-templates /> mais rend la feuille de style moins lisible <!-- enseignement.xml --> <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet type="text/xsl" href="enseignement.xsl"?> <enseignement> <auteur>Lionel Médini</auteur> <cours> <titre>TI1 - systèmes d'information distribués</titre> <niveau>Master 2</niveau> </cours> <cours> <titre>MIF13 - programmation Web</titre> <niveau>Master 1</niveau> </cours> </enseignement> XSLT Exemple <!-- enseignement.xsl --> <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <head><title>Liste des cours</title></head> <body> <ul> <xsl:for-each select="enseignement/cours"> <xsl:sort select="niveau"/> <li> <span style="font-style: italic;"><xsl:value-of select="titre"/></span> <span style="font-weight: bold;"> (cours de <xsl:value-of select="niveau"/>)</span> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> 21 MIF13 – 2008-2009 </xsl:stylesheet> Transformation d’arbres XML : XSL Quelques exemples d’outils Dans un navigateur IE : processeur XSLT incorporé à MSXML (contrôle ActiveX) Gecko, WebKit : objet window.XSLTProcessor En JavaScript : Google AJAXSLT Dans HTML-Kit (éditeur HTML WYSIWYG) : plugin ErgXSLT En Java, intégré à JAXP 2 (J2EE puis JEE5) : TrAX Transformation API for XML (javax.xml.transform, xsltc) En C / en PHP : libxslt (PHP 5) Transformation d’arbres XML : XSL Les deux composants de XSL XSLT : les éléments Structures de contrôle <xsl:choose> <xsl:when test="expr_XPath1"> Contenu conditionnel 1 </xsl:when> <xsl:when test="expr_XPath2"> Contenu conditionnel 2 </xsl:when> ... <xsl:otherwise> Contenu conditionnel n </xsl:otherwise> </xsl:choose> Transformation d’arbres XML : XSL Autre exemple Date de 2002 À ouvrir uniquement avec IE ou une application ad hoc http://www710.univlyon1.fr/~lmedini/LIA/LSI/Exam/Septembre/ Feuilles de style (X)HTML : CSS Buts : définir des caractéristiques de style Standardisées pour être reconnues par tous les navigateurs Dans un langage différent de HTML pour séparer la forme du fond Externalisables pour pouvoir les réutiliser Imbriquables pour pouvoir les appliquer à des sous-ensembles de documents 4 22/09/2009 Feuilles de style (X)HTML : CSS Trois niveaux d’application Niveau élément : feuilles de style intégrées Syntaxe du langage Définition des caractéristiques de style Élément nom_element {caract1:valeur1; caract2: valeur2;…} Classe de style .nom_classe {caract1:valeur1; caract2: valeur2;…} Sous-classe nom_element.nom_classe {caract1:valeur1;…} Pseudo-classes a:visited {caract1:valeur1;…} Remarque : on peut les combiner : a.rouge:visited Application de styles Syntaxe : caractéristiques de style dans la valeur de l’attribut style de la balise ouvrante Niveau document : feuilles de style incorporées Feuilles de style (X)HTML : CSS Syntaxe : élément <style type="text/css"> dans la balise <head> d’un document HTML Niveau site web : feuilles de style liées Syntaxe Caractéristiques de style dans un fichier à part Lien vers ce fichier par son URI dans un document HTML : <link rel="stylesheet" type="text/css" href="URI" /> éléments (X)HTML : pas besoin de demander l’application Classes, sous-classes et pseudo-classes de style : attribut class="nom_classe" Feuilles de style (X)HTML : CSS Autres technologies côté client À retenir en CSS On ne peut positionner que des éléments de type bloc Les caractéristiques de style sont héritées entre les nœuds de l’arbre (en cascade) Pour les liens, le changement est dynamique mais pas automatiquement réversible ordonner les déclarations : link, visited, hover, active (LoVe HAte) Position du problème Une page Web est statique (texte, images) Le traitement de données par le serveur peut prendre du temps Comment rendre les contenus plus dynamiques ? Détail des caractéristiques : voir références sur la page d’accueil du cours Il existe un validateur de feuilles de style CSS Animations, vidéo, contenus interactifs Plusieurs manières de le résoudre Rajouter des animations Rajouter des traitements au niveau du client Dans le navigateur Dans un plugin ou un autre programme Plusieurs types de technologies Autres technologies côté client Autres technologies côté client Scalable Vector Graphics (SVG) Application XML permettant de définir des images vectorielles et des animations Pris en charge par Mozilla mais pas par Internet Explorer Exemple d’utilisation : voir TP1 Adobe Flash Anciennement Macromedia Flash (rachat par Adobe en 2005) Permet de définir Des images (vectorielles ou bitmap) Des animations dynamiques De la vidéo Des contenus interactifs… Langage de programmation : ActionScript De plus en plus populaire Non supporté sur la majorité des téléphones et PDA Cousin lointain d’EcmaScript De nombreux sites complètement en Flash 5 22/09/2009 Autres technologies côté client Adobe Flash Côté client : nécessite un player (Adobe Flash Player) Plugin dans le navigateur Restrictions de sécurité Présent sur 97% des navigateurs (selon Adobe) Desktop application (aucune restriction) Autres technologies côté client SilverLight Concurrent Microsoft de Flash Environnement de développement propriétaire Lien avac le monde Java : Flex Format des fichiers : swf Type MIME : application/x-shockwave-flash Orienté prototype (permet l’héritage dynamique) Non typé / typage dynamique (types associés aux instances et non aux classes) Interprété Fonctionnel Autres technologies côté client JavaScript Référence ECMAScript : http://www.ecmascript.org/ Version actuelle : 3.1 (4.0 en préparation) Plusieurs versions découlant de la spécification générale EcmaScript Plugin dans Microsoft Internet Explorer (Windows et Mac) Player de type desktop application Sous Windows Il existe une version pour Linux : Moonlight Des versions pour Windows mobile 6 et Symbian OS sont prévues Autres technologies côté client JavaScript De loin le plus utilisé Caractéristiques Images, animations, vidéo, interactivité… Côté client Côté développeur Version 3 (2007) : adjonction d’un support XML : E4X Prise en charge par les navigateurs récents Firefox 3 : JavaScript 1.8 (ECMAScript 3.1) Safari 4 : JavaScript 1.9 Opera 9 : JavaScript 1.5 + JScript (ECMAScript 2) Internet Explorer 8 : JScript 5.8 / JavaScript 1.5 (ECMAScript 3) Chaque moteur implémente une version différente du langage : http://en.wikipedia.org/wiki/JavaScript#Versions Autres technologies côté client JavaScript Implémentations dans les navigateurs JavaScript : open source, englobe la spécification ECMAScript JavaScript 1.8 est totalement compatible avec ECMAScript 3.1 JavaScript 2.0 sera totalement compatible avec ECMAScript 4 Moteurs existants : SpiderMonkey (FireFox), V8 (Chrome), Nitro (Safari) JScript : propriétaire, implémenté dans IE Base de langages de scripting commune pour de nombreux outils Microsoft • Managed Jscript : Moteur IE, SilverLight, Windows Script Host • JScript .Net : Microsoft .Net Framework Conclusion Les technologies côté client sont vastes… Les plus utilisées : (X)HTML, XML, CSS, JavaScript, Flash …Et de plus en plus complexes Un navigateur ne sert pas qu’à afficher des pages Web Il contient de nombreux autres modules permettant de rendre les contenus dynamiques Malheureusement, ils ne fonctionnement pas tous de la même façon La partie cliente de votre application doit donc être conçue en respectant les bonnes pratiques (et bien entendu, en cohérence avec la partie serveur) La prochaine version (5.8) satisfera ECMAScript 3.1 6