1 / 129

XSLT : XML Stylesheet Language Transformation

XSLT : XML Stylesheet Language Transformation. Une introduction à XSLT pour l'analyse de corpus. Sylvain Loiseau <sylvain.loiseau@u-paris10.fr>. Introduction. Note : pour apprendre ce langage il est indispensable de disposer d’un processeur et de tester et modifier les exemples du diaporama.

shayla
Download Presentation

XSLT : XML Stylesheet Language Transformation

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. XSLT : XML Stylesheet Language Transformation Une introduction à XSLT pour l'analyse de corpus Sylvain Loiseau <sylvain.loiseau@u-paris10.fr>

  2. Introduction

  3. Note : pour apprendre ce langage il est indispensable de disposer d’un processeur et de tester et modifier les exemples du diaporama.

  4. « Feuille de style »et « transformation » • Le programme XSLT est appelé une « feuille de style » • La feuille de style est fournie, avec un document XML, à un programme (un « processeur XSLT ») • Le processeur « transforme » le document en fonction des instructions de la feuille de style et produit en sortie un nouveau document. XSLT XML / HTML / texte XML Processeur XSLT

  5. La feuille de style décrit des règles de transformation que le processeur applique au document Pour cette transformation on peut sélectionner des données dans le document source Les requêtes peuvent utiliser les noms et ordre des balises, noms et valeurs des attributs, contenu du texte, position dans l’arborescence (contexte), etc. On peut également manipuler ces données (tri, décompte, etc.) et ajouter des éléments nouveaux. Principe de la transformation XSLT

  6. teiHeader fileDesc Text title Text Le processeur transforme le document en un autre Feuille de style XSLT : règles de la transformation Racine DocumentXML source DocumentXML produit truc machin Transformation Text Processeur

  7. Exemples d’utilisation • Rechercher des éléments du corpus • En utilisant toutes les propriétés du document • Composer des sous corpus • Texte sans les <note>, seulement les <note>… • Quantifications • Pourcentage des <foreign> dans les <note> • Convertir d'un format à l'autre • XML vers Hyperbase, Unitexte, sans balise, etc.; ou vers des formats de lecture : HTML, PDF, Word, etc. • Maintenance et enrichissement du corpus • Possibilité (limitée) d’ajouter de l’information

  8. Intérêt du couple XML/XSLT • On ne maintient pas différentes versions du corpus pour les différents formats ou les différents sous-corpus • On peut appliquer les mêmes feuilles de style à plusieurs corpus. • Pas de programmation

  9. Objectif du diaporama • Introduction aux principes et aux principales fonctions de XSLT • Application pour l’utilisation de corpus. • Proposer différentes approches pour les principales tâches : extraire des informations, calculer des valeurs numériques, convertir vers d’autres formats, lister des valeurs, et ajouter de l’information.

  10. Une première feuille de style <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html> <body> <p>Hello, world</p> </body> </html> </xsl:template> </xsl:stylesheet> Préfixé par « xsl: » = des instructions XSLT, ici d’organisation de la feuille de style Texte non-préfixé par « xsl: » : recopié littéralement en sortie

  11. Résultat : <html> <body> <p>Hello, world</p> </body> </html> • Le processeur lit la feuille, imprime ce qui est littéral (le texte ou les balises non préfixés par « xsl: ») et évalue/exécute les instructions (préfixées par « xsl: ») • Cette feuille de style ne contient que des éléments « littéraux » : elle n’extrait aucune information du document • Ici les balises rajoutées sont du HTML : à partir du document on génère une page HTML. Le résultat de la transformation peut être ouvert et affiché dans un navigateur. (Fichier->Ouvrir dans Internet Explorer) Ce n’est pas obligatoire : on peut aussi écrire des balises non-HTML, ou ne mettre aucune balise dans le résultat.

  12. Pour résumer • Une feuille de style est un document XML • L'élément racine est xsl:stylesheet avec deux attributs obligatoires • La feuille de style contient un élément xsl:template • Tout ce qui est "préfixé" par xsl: est une instruction XSLT, qui est exécutée par le processeur et remplacée par son résultat. • Tout ce qui n'est pas "préfixé" est reproduit littéralement

  13. Extraire des informations

  14. Extraire le texte contenu dans une balise <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <p>Titre du corpus : <xsl:value-of select = "/teiCorpus.2/teiHeader/fileDesc/titleStmt/title"/> </p> </body> </html> </xsl:template> </xsl:stylesheet>

  15. L'instruction xsl:value-of <xsl:value-of select="/TEI.2/.../title"/> Remplacer cette instruction par le texte… … trouvée à cet endroit La valeur de l'attribut select est une expression XPath : elle désigne un endroit du document où aller chercher le texte.

  16. Document / PI <?xml version=“1.0”?> Element TEI.2 Element teiHeader Element … Element … Element … Element fileDesc Text Text Text Element title Text Text "/TEI.2/teiHeader/fileDesc/titleStmt/title"

  17. Document / <xsl:value-of select="/corpus/text/p/name"/> PI <?xml version=“1.0”?> Element corpus Bien qu’il y ait plusieurs p, un seul chemin satisfait entièrement à l’expression (un seul p a un élément name) Element text Element p Element p Element p Element p Text Text Text Element name Text Text

  18. XPath • XPath est une autre recommandation, comprise dans XSLT • XPath remplit la fonction de "sélectionner", "pointer" sur des éléments du document, tandis que XSLT organise, trie, etc. • XPath retourne des nœuds de l'arborescence, par exemple des balises, des attributs, des nœuds textes. • XPath permet de désigner les propriétés XML (nom des balises et attribut, contexte, ordre…)

  19. xsl:value-of convertit le nœud en texte : supprime les balises incluses Instruction XSLT … <xsl:value-of select="p" /> … sur ce document XML <p>du texte et <hi rend="italics">d'autres</hi> éléments</p> XPath retourne un « nœud », XSLT converti en texte : du texte et d'autres éléments

  20. Si plusieurs éléments correspondent ? • Il y a sans doute beaucoup de p qui correspondent à ce chemin. • XPath les retourne tous, mais la fonction xsl:value-of ne sélectionne que le premier pour l'afficher. <xsl:value-of select="/TEI.2/text/body/p"/>

  21. xsl:for-each • Si on veut traiter tous les nœuds retournés par l'expression XPath, il faut utiliser xsl:for-each <xsl:for-each select="expression XPath"> On traite une à une les valeurs trouvées </xsl:for-each>

  22. <xsl:for-each select="/teiCorpus.2/TEI.2/text/p"> <para><i><xsl:value-of select="." /></i></para> </xsl:for-each> <p>Premier <hi rend="italics">paragraphe</hi> éléments</p><p>Second paragraphe</p><p>Troisième paragraphe</p> <para><i>Premier éléments</i></para><para><i>Second paragraphe</i></para><para><i>Troisième paragraphe</i></para>

  23. <xsl:for-each select="/teiCorpus.2/TEI.2/text/p"> <p><i><xsl:value-of select="." /></i></p> </xsl:for-each> Element TEI.2 Element text Element p Element p Element p Element p Text Text Text Element name Text Text

  24. xsl:for-each regroupe d’abord les nœuds avec select, ensuite exécute le contenu de la boucle autant de fois qu’il y a de nœuds • L'expression XPath de select trouve quatre nœuds. S'il n'y avait qu'un seul élément, ou zéro, la boucle serait exécutée une ou zéro fois. • À chaque passage on traite un des nœuds trouvés, qui devient le "nœud contexte" durant ce passage et peut être désigné par «.». • Dans le contenu de la boucle, on peut se déplacer à nouveau dans l'arborescence, mettre un élément littéral, etc.

  25. <?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <html><body> <p>Titre du corpus : <xsl:value-of select = "/teiCorpus.2/teiHeader/fileDesc/titleStmt/title"/> </p> <xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select="teiHeader/fileDesc/titleStmt"/> </p> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>

  26. <xsl:for-each select="/teiCorpus.2/TEI.2"> Element … Element TEI.2 Element TEI.2 Element TEI.2 Element TEI.2 … … … A chaque itération on applique une nouvelle recherche XPath Element … Element … Element … Element title Text <xsl:value-of select="teiHeader/fileDesc/titleStmt/title"/>

  27. Le contexte • Il y a toujours un nœud contexte quand une instruction est exécutée. • Ce nœud contexte peut être désigné explicitement avec "." • C'est à partir du nœud contexte que sont évaluées les expressions XPath qui ne commencent pas par "/" : select="teiHeader/fileDesc/titleStmt" On désigne, par rapport au nœud contexte, un endroit de la sous-arborescence. On aurait pu écrire aussi : select="./teiHeader/fileDesc/titleStmt"

  28. Une utilisation de xsl:for-each :faire une table des matières du corpus • On ne sait pas combien de textes ni de titres de niveau 1, 2, etc., il peut y avoir • Il faut traiter tous les textes, et dans chaque texte traiter les niveaux 1, dans chaque niveau 1 traiter les niveaux 2, etc. • On peut donc imbriquer des boucles xsl:for-each

  29. Une table des matières (1) • On extrait le titre de chaque texte dans le corpus : <xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select="teiHeader/fileDesc/titleStmt/title"/> </p> <hr /> </xsl:for-each> Cf. ci-joint le fichier TableDesMatieres.xsl

  30. Une table des matières (2) • A l'intérieur du for-each, à chaque itération, le nœud contexte est donc l'élément TEI.2 traité • On peut lancer une nouvelle boucle, dans la première, pour chercher les titres de niveaux 1 dans cet élément TEI.2 L’expression XPath ne commence pas par « / » : text est recherché parmi les enfants du nœud contexte (le TEI.2 traité) <xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select= "teiHeader/fileDesc/titleStmt/title"/> </p> <xsl:for-each select="text/body/div[@type = '1']"> <h1><xsl:value-of select="head"/></h1> </xsl:for-each> <hr /> </xsl:for-each> Par rapport au nouveau contexte (div), on désigne le premier enfant head

  31. Ce qui est entre crochets est un prédicat : permet de filtrer les éléments sélectionnés. • @ permet de désigner un attribut. • Respecter l’alternance guillemets / apostrophes select="text/body/div[@type = '1']" <xsl:value-of select="head"/> Sélectionne le premier élément head directement en dessous de div. On aurait pu écrire aussi : <xsl:value-of select="./head"/>

  32. Une table des matières (3) <xsl:for-each select="/teiCorpus.2/TEI.2"> <p>Titre : <xsl:value-of select="teiHeader/fileDesc/titleStmt/title"/></p> <xsl:for-each select="text/body/div[@type = '1']"> <h1><xsl:value-of select="./head"/></h1> <xsl:for-each select="div[@type = '2']"> <h2><xsl:value-of select="./head"/></h2> <xsl:for-each select="div[@type = '3']"> <h3><xsl:value-of select="./head"/></h3> </xsl:for-each> </xsl:for-each> </xsl:for-each> <hr /> </xsl:for-each>

  33. Classer avec xsl:sort <xsl:for-each select="/teiCorpus.2/TEI.2"> <xsl:sort select=“teiHeader/fileDesc/titleStmt/title" order="ascending"/> <!-- les textes sont classés par leur titre--> <xsl:value-of select="." /> </xsl:for-each> Les éléments sont extraits avec for-each; avant d’être traités un à un, ils sont classés par xsl:sort, ici par ordre alphanumérique (« ascending »), en fonction du contenu du select de sort (ici les textes sont donc classés par leur titre).

  34. Ajouter un index • xsl:number permet de retourner un nombre correspondant à l'index de l'élément dans le node set. <xsl:for-each select="/teiCorpus.2/TEI.2"> <xsl:number value="position()" format="1. "/> <xsl:value-of select="." /> </xsl:for-each> • Premier titre • Second Titre • Etc

  35. xsl:output • Indiquer le jeu de caractères de la sortie avec <output encoding='...'> • Indiquer le type de sortie (text, XML, HTML) avec mode (Permet d’ajouter le prologue XML ou HTML) <xsl:stylesheet version="1.0" xmlns:xsl= "http://www.w3.org/1999/XSL/Transform"> <xsl:output encoding="iso-8859-1" mode="html" />

  36. Résumé XPath XPath permet d’écrire des « chemins XML » mais également d’utiliser des fonctions et des opérateurs.

  37. XPath : les « chemins »en quatre points • XPath permet de pointer sur des éléments de l'arborescence du document. • Une expression XPath est constituée (1) d'étapes (steps), séparées par des slashs • Chaque étape contient (2) un nœud asserté (?) (node test) : le nom d’un élément, attribut, etc. • Optionnellement le node set peut avoir (3) un prédicat (à droite) et (4) un axe (à gauche) • L'expression retourne un sac de nœuds : les nœuds qui correspondent au dernier nœud asserté – si elle en trouve. "/TEI.2/text/body/div[@type='intro']/head"

  38. (1) les étapes • Le slash indique la relation parent / enfant • Un double slash indique la relation parent / descendants (à toute profondeur dans la hiérarchie)./TEI.2[1]/text/body//name[@type='np'] • Note : temps de calcul accru • Un slash en début fait partir l'expression de la racine du document : l'expression est donc indépendante du contexte.

  39. Exemples teiCorpus.2/TEI.2/teiHeader //TEI.2[1]//p • Note : "//" part de la racine : • "//p" : tous les p du document, à toute profondeur depuis la racine • ".//p" : tous les p sous le nœud contexte • Différences entre : • //TEI.2/text//div/pLes p directement en dessous de tous les div • //TEI.2/text/div//pTous les p en dessous de div directement en dessous de text • Avec //TEI.2/text//div//p chaque p est sélectionné une fois dans le sac de nœuds résultant, même si plusieurs div sont imbriqués et font différents chemins valides vers le même p : il n’y a jamais de doublon dans un sac de nœuds.

  40. (2) : les node tests • Chaque étape comprend un node test • Le nœud cherché peut être une balise, un attribut (@nom) ou un nœud texte (text()) • Existent également des valeurs génériques : * (tout élément), @* (tout attribut) , node() (tout nœud : texte, élément, attribut, PI, comment,…) • Le point "." indique le contexte actuel • Le double point ".." permet de remonter d'un niveau dans l'arborescence.

  41. Exemples • //*[@rend = 'italics']/text() • teiCorpus.2/TEI.2[1]/teiHeader • //p[../liste] • //p/@id : retourne la valeur de l’attribut • Ne pas confondre un nœud texte et le texte contenu : • /TEI.2/text/frontRetourne tout le texte contenu, sans les balises • /TEI.2/text/front/text()Retourne les nœuds texte directement enfants de front, avec value-of retourne uniquement le premier nœud : probablement un retour chariot… • TEI.2/text/front/@id/text()Ne retourne rien : il n'y a pas de nœud texte descendant d'un attribut. (@id retourne déjà la "valeur")

  42. (3) : les prédicats • Chaque étape peut comprendre un prédicat, qui est une expression XPath entre crochets placée après le node test. • Ex. //div[@type='intro'] sélectionne les div ayant un attribut @type avec la valeur 'intro' • Le prédicat permets de filtrer les nœuds en ajoutant des conditions. • L’expression XPath dans le prédicat peut avoir deux valeurs : vraie ou fausse. • L’expression XPath est convertie si besoin en valeur booléenne : est faux un sac de nœud vide, le nombre zéro ou la chaîne vide, est vrai tout le reste. • Dans le premier exemple, l’expression retourne déjà une valeur booléenne grâce à l’opérateur « = » • Ex. //p[name] sélectionne tous les p contenant un élément enfant « name ». p est le contexte de l’expression XPath « name ».

  43. Fonctions XPath utiles • Les conditions sur la position d’un nœud sont souvent utilisées dans les prédicats. • Les fonctions last() et position() renvoie respectivement le numéro du dernier nœud d’un sac de nœuds et le numéro du nœud courant. • Note : last() et position() s’écrivent toujours avec les parenthèses et sans argument. • Plutôt que [position() = 1], pour demander les nœuds qui sont le premier enfant de leur père, on peut utiliser une notation courte [1].

  44. Exemples <xsl:for-each select="/teiCorpus.2//hi[@rend = ‘italics’]"> <!-- tous les tags hi avec un attribut rend = italics --> </xsl:for-each> <xsl:for-each select="//TEI.2[1]/text/p[name/@id]"> <!-- tous les p qui ont un enfant name qui a un attribut id --> </xsl:for-each> <xsl:for-each select="//TEI.2[1]/text/p [not(position()=last())]"> <!– tous les p qui ne sont pas les derniers parmi les éléments ayant le même parent --> </xsl:for-each> <xsl:for-each select="//TEI.2[1]/text/p[position() != last())]"> <!-- autre notation --> </xsl:for-each> <xsl:for-each select="//TEI.2[1]/text/p[position() &gt; 1]"> <!-- tous les p sauf le premier --> </xsl:for-each>

  45. <xsl:value-of select="text/p[3]"/> <xsl:value-of select="text/p[name]"/> <xsl:value-of select="text/p/name"/> <xsl:value-of select="text[p/name]/p[3]"/> <xsl:value-of select="text/p[name/@n]"/> <xsl:value-of select="text/p[not(text())]"/> <xsl:value-of select="text/p[last()]"/> <xsl:value-of select="text/p[not(position() = last())]"/> Element text Element p Element p Element p Element p Text Text Text id='p5' Element name n='8' Text

  46. (4) : les axes • Dans la forme abrégée de la syntaxe XPath utilisée jusqu'ici, les node test sont cherchés parmi les enfants de l'étape précédente, ou parmi les descendants avec //. • Il est donc impossible dans cette notation d'indiquer un chemin qui remonte vers les autres directions : ancêtres, parents, descendants, ou frères du nœud contexte :

  47. XML, une histoirede famille Document / PI <?xml version=“1.0”?> Element corpus Ancêtres Parent Element text Frêres Element p Element p Element p Element p Text Text Text Element name Text Enfants Descendants Text

  48. Noter les axes • On peut désigner à chaque étape d'autres directions que l’axe parent / enfant grâce à une « notation longue » : le note test est précédé du nom de l'axe suivi de "::" • Exemple • select="./ancestor::div" • Select="./ancestor::TEI.2/teiHeader • Following-sibling::node() | preceding-sibling::node() Recherche le premier div parmi les ascendants Remonte au TEI.2 ascendant, puis descend à son enfant direct teiHeader Sélectionne n’importe quel type de nœud descendant du même père, soit à droite sinon à gauche

  49. Document / PI <?xml version=“1.0”?> Element FitnessCenter Ancêtres Element Member Parent Element Phone Element Name Element FavoriteColor Element Phone Frêres Suivants Frêre précédent Element Name Text 555-4321 Text Jeff Text lightgrey Enfant Descendants Text Jeff

  50. Document / PI <?xml version=“1.0”?> Element FitnessCenter Element Member ancêtre Element Phone Element Name Element FavoriteColor Element Phone Frêre précédent Frêres suivants Text 555-4321 Text Jeff Text lightgrey Text 555-1234 ancestor::* sélectionnera tous les ancêtres, c’est à dire : - Member - FitnessCenter preceding-sibling::* sélectionnera tous les frêres à gauche, c’est à dire : - Name following-sibling::* sélectionnera tous les frêres à droite, c’est à dire : - Phone - FavoriteColor

More Related