Connaître la théorie du langage XML - Partie 2 Didier RICHARD (IGN) d'après un support de cours de Véronique LEMAIRE Janvier 2017
Table des matières I - Pourquoi le XSD? 3 1. Schémas XML (XSD)... 3 2. Les types simples... 4 3. Les types complexes... 8 4. Déclaration d'un schéma pour un XML... 11 5. Exercice : Exercice n 4... 12 6. XSL... 12 7. Les mots clés du langage XSLT... 15 8. Exercice : Exercice n 5... 17
Pourquoi le XSD? I Schémas XML (XSD) 3 Les types simples 4 Les types complexes 8 Déclaration d'un schéma pour un XML 11 Exercice : Exercice n 4 12 XSL 12 Les mots clés du langage XSLT 15 Exercice : Exercice n 5 17 1. Schémas XML (XSD) Cette partie est beaucoup plus complexe que les précédentes. Le lecteur doit avoir quelques connaissances en programmation... Définition : Pourquoi un modèle? La syntaxe des DTD est issue du langage SGML ( Standard Generalized Markup Language), beaucoup plus compliqué et lourd que ne l'est le langage XML. Le XML langage universel doit permettre un ensemble cohérent d'applications depuis la définition des modèles jusqu'à leur présentation en passant par leur structuration... Pour des soucis d'homogénéité, il fallait développer un langage de définition de documents basé sur XML. La définition de schémas XML (XML Schema Definition en anglais ou XSD) apporte une grande souplesse et une puissance inégalée dans la définition des documents XML. La fonctionnalité la plus remarquable des schémas XML est la prise en charge des types de données (contenu garanti et validation plus efficace). Le XSD permet aussi un modèle plus exhaustif car définissant les éléments et la structure, avec les occurrences, les contenus mixtes, les groupes d'attributs... Enfin, l'extensibilité des définitions des documents apportée par les schémas XML, facilite l'échange, la fusion ou la réutilisation de données provenant d'une ou plusieurs sources. Effectivement, à l'instar des documents XML, les schémas XML pourront désormais se combiner en se fusionnant complètement ou partiellement afin de créer un modèle de contenu composite. D'ailleurs, plusieurs schémas peuvent être référencés à l'intérieur d'un unique document XML et donc valider la structure et le contenu de ce dernier. La génération dynamique de documents XML et du modèle de contenu associé, devient alors beaucoup plus commode. Évidemment, cela demande une certaine compatibilité entre les schémas susceptibles d'être combinés en passant par une normalisation entre distributeurs des contenus ou en utilisant des XSD «standards». Ce langage de schéma constitue donc une pièce essentielle dans la sphère XML, assurant une évolutivité, un dynamisme et une souplesse que ne pouvait assumer le langage de DTD. Généralités Le schéma commence par un élément racine, xsd:schema est la racine de tout XSD, il est caractérisé par des attributs qu'il faut renseigner : attributeformdefault : permet de savoir si les attributs doivent être munis de l'espace de 3
noms ou pas ; blockdefault : empêche par défaut l'utilisation de types dérivés dans des éléments attendant un type de base : extension restriction substitution elementformdefault : permet de savoir si les éléments doivent être munis de l'espace de noms ou pas ; finaldefault empêche la dérivation de type par restriction, extension ou les deux ; id précise un identificateur unique pour le schéma ; targetnamespace indique un namespace cible pour tout élément étranger au schéma XML ; version indique un numéro de version du schéma ; xml:lang précise la langue dans laquelle est conçu le document. Et bien sûr on peut définir la liste de namespaces utilisés avec xmlns. Le préfixe de l'espace de noms des schémas est très souvent xsd ; la forme xs est aussi utilisée : L'élément include permet d'inclure un shéma XML d'un même espace de noms dans un autre schéma pour l'utiliser : L'élément import permet d'importer un schéma XML avec un espace de noms différent dans un autre schéma pour l'utiliser : 2. Les types simples Un type simple est une balise XML qui ne contient que du texte, donc pas d'attribut. La notion «que du texte» est trompeuse dans le sens où ce texte peut prendre plusieurs formes et recouvrir plusieurs types au sens informatique du terme. Il en existe une liste assez longue d'une quarantaine de possibilités parmi lesquelles on pourra retenir xsd:string, xsd:integer, xsd:decimal, xsd:time, xsd:boolean, xsd:date... 4
La définition d'un élément L'élément xsd:element permet de définir un élément du document XML et d'y associer des propriétés. Si on a un type simple (i.e. atomique et sans attributs), la définition se fait simplement, si on souhaite un type simple personnalisé on utilise la balise <xsd:simpletype> et si on souhaite un type complexe on utilise la balise <xsd:complextype> et enfin si on veut un groupe, on utilise la balise <xsd:group>! Les attributs associés à xsd:element sont répertoriés dans le tableau suivant : Définition : La définition d'un élément L'élément xsd:element permet de définir un élément du document XML et d'y associer des propriétés. Si on a un type simple (i.e. atomique et sans attributs), la définition se fait simplement, si on souhaite un type simple personnalisé on utilise la balise <xsd:simpletype> et si on souhaite un type complexe on utilise la balise <xsd:complextype> et enfin si on veut un groupe, on utilise la balise <xsd:group>! Les attributs associés à xsd:element sont répertoriés dans le tableau suivant : 5
Complément On peut donc couvrir la majorité des cas qu'on rencontrera pour les types simples. Il est également possible de dériver des types simples : en les restreignant ; en définissant un format à adopter ; en créant une énumération ; en créant une liste d'éléments d'un type donné. La restriction de type simple donnera par exemple : 6
Définition d'un format donnera par exemple : Énumération donnera par exemple Liste donnera par exemple : 7
3. Les types complexes Les types complexes sont définis de différentes manières : par une extension d'un type simple auquel on adjoint un attribut ; par une séquence, un choix ou une suite d'éléments simples ; par un groupe. On peut les dériver à partir des types simples en y ajoutant simplement un attribut par exemple de la manière suivante : donnera par exemple : On peut décider de réaliser une séquence d'éléments de types définis. Dans l'exemple suivant, on voit comment faire référence à un élément défini par ailleurs dans le XSD et comment on définit les attributs (déjà vu dans l'exemple précédent) : donnera par exemple : 8
On peut indiquer qu'un élément prend au choix une structure ou une autre comme dans l'exemple suivant : donnera par exemple : On peut enfin décrire une suite d'éléments simples sans ordre obligatoire : 9
donnera par exemple : De plus, on peut aussi définir, via la balise complexcontent, un type plus complexe encore : donnera par exemple : 10
4. Déclaration d'un schéma pour un XML Plusieurs notions entrent en jeu pour lier un document XML et son schéma, ainsi que les schémas nécessaires à la compréhension des données. Tout d'abord, le schéma qui décrit la structure des données appartient à un espace de nommage qu'il convient de déclarer : Il est possible aussi d'indiquer que cet espace de nommage est celui par défaut pour éviter d'avoir à préfixer toutes les balises dans le document : À l'instar des DTD où il est nécessaire d'indiquer si elle est locale (SYSTEM) ou externe (PUBLIC), il est conseillé d'indiquer où se trouve le schéma du document XML via l'un des attribut xsi:nonamespaceschemalocation quand le schéma est local ou xsi:schemalocation s'il est externe. Ce faisant, on introduit un nouvel espace de nommage qu'il convient de définir : On utilise ensuite l'un des attributs xsi:nonamespaceschemalocation ou xsi:schemalocation pour lier l'uri et la localisation du schéma. Plusieurs associations sont possibles : 11
Exemple d'une déclaration avec des espaces de nommage multiples : 5. Exercice : Exercice n 4 Consignes Écrire le schéma qui décrit le fichier XML ; Valider le schémas XML ; Modifier le fichier XML pour utiliser ce schéma XML L'exercice est à rendre au tuteur, le déposer dans l'espace "dépôt des devoirs" 6. XSL Définition : XSL, qu'est-ce que c'est? Le langage XSL est à XML ce que CSS/Javascript est à HTML : il permet d'effectuer une visualisation/modification du contenu décrit dans un fichier XML ; Le langage XSL se divise en deux parties principales : Le formatage : application de règles de style sur des éléments XML à l'instar du langage CSS ; La transformation : substitution d'un marquage XML en un balisage HTML ou un autre marquage XML ou autre texte... Remarque : XSL : la feuille de style du XML Tout comme pour XSD, cette partie du cours est encore plus complexe! 12
Fondamental : Généralités Le langage XSL est à XML ce que CSS est à HTML dans une première approche : il permet d'effectuer une visualisation du contenu décrit dans un fichier XML. Le langage XSL se divise en deux parties principales : Le formatage : application de règles de style sur des éléments XML à l'instar du langage CSS ; La transformation : substitution d'un marquage XML en un balisage HTML ou un autre marquage XML ou rien (texte)! La partie formatage du langage XSL (extensible Stylesheet Language) a une fonction semblable à celle du langage CSS (Cascading StyleSheet) en ce qu'elle applique des règles à des éléments ou attributs du XML. Le langage XSL, par une série de règles de transformation, remplace les éléments XML et leurs attributs en balisage HTML (HyperText Markup Language) ou en d'autres marqueurs XML ou en texte brut. Cette section du langage XSL s'appelle XSLT, soit Langage des feuilles de Style de Transformation dont les spécifications sont mises au point par le W3C (World Wide Web Consortium). Par exemple, un document XML qui contiendrait cet ordre est régi par XSLT : On peut appliquer du XSL de trois manières : 1. 2. 3. La première solution demande à l'ordinateur client de posséder impérativement un navigateur compatible avec les technologies (tous les navigateurs le sont désormais) ; La seconde solution demande un aménagement logiciel du serveur web avec, par exemple, un programme XML Enabler d'ibm, afin de le rendre compatible aux technologies XML/XSL ; Enfin, la dernière solution consiste à installer un moteur de transformation XML nommé XT (XML Transformer) associé à un analyseur (ou parser) conforme à SAX (Simple API for XML) ou DOM (Document Object Model). C'est la solution la plus technique (CGI, Node.js, etc... ) et indépendante des ordinateurs clients. De nombreux programmes permettent de mettre à niveau son serveur : JAXP édité par Sun Microsystems ; Xalan & Xerces édités par l'organisation Apache ; XP & XT édités par l'auteur des spécifications XSL, James Clark ; MSXML 4.0 édité par Microsoft ; XML Parser édité par IBM. L'entête d'un fichier XSL se compose : Du prologue d'un fichier XML (puisqu'un fichier XSL est un fichier XML!) ; Des espaces de noms correspondant (donc au moins xmlns:xsl); Du document de sortie (vers quoi on transforme le document XML). Globalement, on utilise html, xml (par défaut) ou text. Les espaces de noms associés à XSL sont : pour XSLT : http://www.w3.org/1999/xsl/transform ; 13
pour XSL-FO : http://www.w3.org/1999/xsl/format/1.0 (formatage du XML) Définition : Les motifs (patterns) Pourquoi le XSD? Les patterns sont les expressions utilisées pour sélectionner les nœuds d'un document XML et on les utilise dans les attributs select ou match des éléments du XSLT. Le tableau ci-après permet de présenter les motifs possibles ainsi que ce qu'ils représentent. Ils viennent en complément du langage XPATH que nous étudierons dans le paragraphe suivant. Le langage XPath On utilise les patterns pour pouvoir sélectionner les nœuds (on se rappelle qu'un document XML est un arbre... ). Un axe nodal ouvre des «directions de recherche» indiquées par le préfixe avant les patterns et les deux points. Un prédicat est une expression entre crochets permettant de cibler au mieux une partie de l'arborescence XML. Une fonction nodale peut être booléenne, calculatoire, etc. Le tableau suivant récapitule les principaux axes nodaux écrits de manière complète : Il existe une façon abrégée de présenter les axes nodaux et qui correspondent à des représentations des axes nodaux présentés ci-dessus avec des symboles simplificateurs. Le tableau ci-dessous présente tous les nœuds abrégés qui existent : 14
7. Les mots clés du langage XSLT Il existe un certain nombre de mots clés principaux en XSLT : template apply-templates value-of element attribute attribute-set choose associé à when et otherwise if L'élément template permet de définir une règle de modèle, c'est-à-dire, par l'intermédiaire de la valeur de l'attribut match, des éléments seront prêts pour l'application de règles de style : La construction suivante applique le modèle sur le motif pattern : Les règles de modèle permettent d'effectuer la même mise en forme pour tout élément identique (pour chaque pattern qui correspond). On peut aussi utiliser la forme nommée : et le template se comporte alors comme une fonction! Pour l'appeler on utilise la construction suivante avec éventuellement des paramètres : 15
Pour récupérer la valeur d'un nœud, on utilise : et on récupérera alors la partie textuelle contenue dans le motif (pattern) Attention : cette instruction XSL ne peut gérer qu'un élément à la fois contrairement à apply-templates qui permet d'assurer la récursivité d'une opération sur tous les patterns qui correspondent. On utilise element et attribute pour pouvoir créer des éléments et attributs en sortie. L'attribut name correspond au nom de l'élément ou de l'attribut : On génère ainsi un fragment XML qui vaut : L'élément choose combiné avec when et otherwise, permet de construire des tests conditionnels à l'instar des commandes switch de Java ou Javascript. L'élément if permet de construire un test simple (pas de sinon... ). Pour commencer un fichier XSL, on a deux possibilities en termes d'éléments racines : 16
l'instruction stylesheet est l'élément racine des feuilles de style : Un synonyme existe pour cet élément racine, il s'agit de transform. Ce dernier possède la même fonction et les mêmes attributs : Par convention, transform peut être utilisé pour les feuilles de style de transformation et stylesheet pour celles de formatage. Mais cela n'a aucun caractère obligatoire. 8. Exercice : Exercice n 5 Consignes Transformer le fichier XML des stagiaires en une page web : Écrire le fichier XSL ; Valider-le ; Trouver un service en ligne qui effectuera la transformation. L'exercice est à rendre au tuteur, le déposer dans l'espace "dépôt des devoirs" 17