[width=1.5cm]logoPSUDnew
Transcription
[width=1.5cm]logoPSUDnew
Cours 2 : XPath et XSLT. D’après les cours de François Goasdoué et Dario Colazzo. Cours de Web Sémantique. J-B. Hoock ([email protected]) Mercredi 16 octobre 2013 Plan du cours 2/67 1 XML 2 DTD 3 XPath 4 Namespace 5 XSLT 6 Conclusion Plan du cours 3/67 1 XML 2 DTD 3 XPath 4 Namespace 5 XSLT 6 Conclusion Arbre XML Interrogation XML : XPath XPath est un langage de requêtes pour l’interrogation de document XML. XPath propose un ensemble de fonctions prédéfinies pour naviguer dans les documents XML. XPath est un standard du W3C. XPath est utilisé pour la présentation des données via XSLT. 5/67 XPath : Interrogation par chemin (1/6) Élément racine / Éléments au bout d’un chemin /library/document/title N’importe quels éléments atteignables par un chemin /library/document/* Un élément donné au bout d’un chemin de longueur 2 /*/*/ISBN Tous les éléments //* XPath : /library/document/title XPath : //ISBN XPath : /library/document/* XPath : /*/*/ISBN XPath : Interrogation par chemin (2/6) Interrogation par chemin Élément courant . Élément courant dans un chemin /library/document/ISBN/. = /library/document/ISBN Éléments qui ont au moins un sous-élément et un sur-élément //*/*/*/.. Chaque nieme sous-éléments d’éléments /library/document/author[2] Chaque dernier sous-éléments d’éléments /library/document/author[last()] Interrogation par chemins : chemin1 | ... | cheminN //*/*/*/.. | /library/document/author[last()] XPath : //*/*/*/.. XPath : /library/document/author[2] XPath : //*/*/*/.. | /library/document/author[last()] XPath : Interrogation par chemin (3/6) On peut associer des contraintes aux chemins Des contraintes booléennes peuvent être exprimées à chacun des pas d’un chemin à l’aide de [ ] Une contrainte booléenne est une combinaison logique (à l’aide de and, or et not) de contraintes booléennes simples Comparaisons arithmétiques : =, ! =, <, >, >=, <= Les opérandes peuvent utiliser : des fonctions mathématiques +, −, ∗, div, mod, ceiling, floor, round, ... des fonctions retournant des nombres count(nodeset) , last(), string-length(string), sum(nodeset) Comparaisons de chaînes : contains, starts-with, ... Les opérandes peuvent utiliser des fonctions retournant des chaînes des fonctions retournant des chaînes name(node), concat(val1, val2, ...), string(value), ... XPath : Interrogation par chemin (4/6) Tous les éléments qui ont un sous-élément donné /library/document[date] Tous les éléments qui ont un sous-élément donné avec une valeur donnée /library/document[ISBN!=’0-262-01210-3’ and date] Tous les sous-éléments d’éléments qui ont un sous-élément donné avec une valeur donnée /library/document[ISBN=’0-262-01210-3’ or date]/title XPath : /library/document[date] XPath : /library/document[ISBN!=’0-262-01210-3’ and date] XPath : /library/document[ISBN=’0-262-01210-3’ or date]/title XPath : Interrogation par chemin (5/6) Éléments qui possèdent des attributs //*[@*] Éléments ayant un attribut donné //document[@related] Éléments ayant des attributs donnés //document[@related and @language] Éléments ayant des attributs donnés avec une valeur donnée //document[@publishedby=’AW’ or @status=’new’] Nièmes éléments ayant une valeur donnée /library/document[@language=’english’][2] Nièmes éléments s’ils ont la valeur donnée /library/document[2][@language=’english’] XPath : //*[@*] XPath : //document[@related] XPath : //document[@related and @language] XPath : //document[@publishedby=’AW’ or @status=’new’] XPath : /library/document[@language=’english’][2] XPath : /library/document[2][@language=’english’] XPath : /library/document[1][@language=’english’] XPath : Rappels sur les clés et les clés étrangères (1/2) Exercice - Trouvez les erreurs dans le document XML suivant : <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Groupe [ <!ELEMENT Groupe (Personne)*> <!ATTLIST Groupe num ID #REQUIRED> <!ELEMENT Personne (Nom, Prenom)> <!ATTLIST Personne id ID #REQUIRED> <!ATTLIST Personne voisin IDREF #REQUIRED> <!ELEMENT Nom (#PCDATA)> <!ATTLIST Nom label ID #REQUIRED> <!ATTLIST Nom ref CDATA #IMPLIED> <!ELEMENT Prenom (#PCDATA)> <!ATTLIST Prenom label ID #REQUIRED> ]> <Groupe num="group0"> <Personne id="p1" voisin="p2" > <Nom label="dupont" ref="dup">Dupont</Nom> <Prenom label="claude">Claude</Prenom> </Personne> <Personne id="p2" voisin="claude"> <Nom label="martin" ref="mar">martin</Nom> <Prenom label="group0">Lucie</Prenom> </Personne> <Personne id="p3" voisin="hoock"> <Nom label="Doe" ref="doe">Doe</Nom> <Prenom label="john">John</Prenom> </Personne> <Personne id="p4" voisin="mar"> <Nom label="poirot" ref="p1">Poirot</Nom> <Prenom label="hercule">Hercule</Prenom> </Personne> </Groupe> XPath : Rappels sur les clés et les clés étrangères (2/2) XPath : Interrogation par chemin (6/6) Éléments via IDREF(S) /library/document/id(@publishedby) Les requêtes XPath permettent aussi d’obtenir des valeurs comme réponses. Pour les PCDATA et CDATA des DTD, mais aussi pour des types simples de XML Schema /library/document/ISBN/text() /library/publisher/@id XPath : /library/document/id(@publishedby) XPath : /library/document/ISBN/text() XPath : /library/publisher/@id XPath : Exercice Soit le document XML suivant : <?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <!- - a bookstore database - -> <book isbn="111111" cat="fiction"> <!- - a particular book - -> <title lang="chn">Harry Potter</title> <price unit="us">79.99</price> </book> <book isbn="222222" cat="textbook"> <title lang="eng">Learning XML</title> <price unit="us">69.95</price> </book> <book isbn="333333" cat="textbook"> <title lang="eng">Intro. to Databases</title> <price unit="usd">39.00</price> </book> </bookstore> Énoncé 1 Trouver le titre et le prix des bouquins qui ne sont pas des fictions avec un prix strictement supérieur à 50 USD. 2 Trouver le prix moyen des manuels scolaires (i.e. textbook ). 3 Trouver les titres des manuels scolaires sur XML. Plan du cours 35/67 1 XML 2 DTD 3 XPath 4 Namespace 5 XSLT 6 Conclusion Namespace Recommandation du W3C Les namespaces ou espace de nom XML servent à mettre une signature sur des noms d’éléments et d’attributs. Ceci est particulièrement intéressant lorsqu’une application est censée réagir à certains noms d’éléments et d’attributs : XHTML XML Schema XSLT ... Namespace : Definitions (1/2) Namespace ou espace de noms Un namespace se déclare dans un élément grâce à l’attribut xmlns (attribut réservé de XML/Namespace). Une déclaration est de la forme xmlns[: nom_ns]=“URI” où : nom_ns est optionnel S’il est donné alors : est un séparateur nom_ns est le nom du namespace créé. Sinon, le namespace créé sera le namespace par défaut. URI est la signature ou clé du namespace. Les URI sont de bonnes signatures car chaque URI est unique! Namespace : Une instance XML et une instance XML vue comme du XHTML Une instance XML <?xml version=“1.0” encoding=“UTF-8”?> <html> <head> <title>XML versus HTML</title> </head> <body> <h2>Ceci est une instance XML utilisant des noms d’éléments de HTML</h2> Ce n’est qu’une <i>instance XML</i> pour un navigateur tel que <b>Safari</b> ou <b>Firefox</b>... <br/> Faisons le test... </body> </html> Une instance XML vue comme du XHTML <?xml version=“1.0” encoding=“UTF-8”?> <html xmlns=“http://www.w3.org/1999/xhtml”> <head> <title>XML versus HTML</title> </head> <body> <h2>Ceci est une instance XML utilisant des noms d’éléments de HTML</h2> C’est une <i>instance XHTML</i> pour un navigateur tel que <b>Safari</b> ou <b>Firefox</b>... <br/> Faisons le test... </body> </html> Namespace : Une instance XML et une instance XML vue comme du XHTML Une instance XML Une instance XML vue comme du XHTML Namespace : Definitions (2/2) Portée d’un namespace Un namespace a pour portée l’élément (nom, attributs, sous-éléments, ...) où il est défini. Namespace d’un élément ou d’un attribut Soit elt_ou_att = [ns :]nom un nom d’élément ou d’attribut d’un document XML. Si elt_ou_att = ns : nom et qu’il se trouve dans la portée d’un namespace ns alors nom est dans le namespace ns. Si elt_ou_att = nom alors elt_ou_att est dans la portée du namespace par défaut s’il a été défini, sinon il est dans la portée du namespace implicite correspondant à l’URI du document XML. Exemple - Portée d’un namespace Exemple 1 : Les namespace dans RSS 1.0 Exemple 2 : Les namespace dans la publication XSLT de RSS 1.0 Namespace : Conclusion Namespace offre un mécanisme pour le traitement de document XML par des applications externes. Quelques namespaces usuels... XHTML http://www.w3.org/1999/xhtml XML Schema http://www.w3.org/2001/XMLSchema XSLT http://www.w3.org/1999/XSL/Transform Plan du cours 45/67 1 XML 2 DTD 3 XPath 4 Namespace 5 XSLT 6 Conclusion XSLT eXtensible Stylesheet Language Transformation ou XSLT est un langage de transformation d’une instance XML en une nouvelle instance XML. XSLT peut être utilisé pour : transformer une instance en une nouvelle instance respectant un autre schéma, répliquer un sous-ensemble d’une instance, publier (faire un rendu visuel) une instance (XML vers XHTML); ... XSLT est un standard du W3C. XSLT est un document XML Pour que ce document soit interprété comme une feuille de style, on utilise un ensemble d’éléments et d’attributs du namespace normalisé : http//www.w3.org/1999/XSL/Transform. Document XSLT Comme tout doc. XML, un doc. XSLT est constitué de : 1 un prologue <?xml version=“1.x”?> 2 un corps <xsl:transform version “1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> ... </xsl:transform> ou ce qui est équivalent <xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> ... </xsl:stylesheet> 3 un épilogue (facultatif). Corps d’un document XSLT Le corps d’un document XSLT est constitué de templates. Chaque template correspond à une règle de transformation à appliquer à un sous-arbre XML désigné par une requête XPath. Forme d’un template <xsl:template match=“requete XPath”> ... </xsl:template> XSLT : Exécution des templates templates 1 Le premier template exécuté est le plus prioritaire parmi ceux dont la requête XPath commence par /, cad la racine du document (règle de priorité définie dans la norme XSLT). 2 Au sein d’un template, on n’a accès qu’à l’arbre désigné par sa requête XPath (un sous-arbre du document). On peut naviguer dans cet arbre à partir de sa racine, grâce à XPath. 3 Un template peut faire appel à d’autres templates pour transformer des sous-arbres de l’arbre auquel il s’applique. 4 Si plusieurs templates peuvent s’appliquer, seul l’un d’eux s’applique (règle de priorité définie dans la norme XSLT). XSLT - xsl:template Un template contient du texte libre que l’on veut voir afficher en sortie de la transformation XSLT et/ou des actions de transformation XSLT. Feuille de style pour la bibliothèque... <?xml version=“1.0”?> <xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> <xsl:template match=“/”> <html> <head> <title>Liste des livres de la bibliothèque</title> </head> <body> <h2>Les livres</h2> ... </body> <html> </xsl:template> </xsl:stylesheet> XSLT - Actions de transformation (xsl:value-of) Affichage de valeurs Pour afficher une chaîne de caractères (cad. la valeur d’un élément feuille ou d’un attribut) issue du document XML à transformer, utiliser : xsl:value-of select=“requête XPath”/>. Le résultat de la requête doit être une chaîne de caractères ! XSLT - Transformation appliquée plusieurs fois (xsl:for-each) Boucle : xsl:for-each Pour effectuer une même transformation plusieurs fois (par ex. sur plusieurs éléments), il faut effectuer une boucle : <xsl:for-each select=“requête XPath”> ... </xsl:for-each> xsl:for-each permet d’itérer sur les résultats de la requête. À chaque itération, les transformations effectuées dans le corps de la boucle sont relatives au sous-arbre XML désigné par le résultat de la requête. XSLT : Exemple - feuille de style pour la bibliothèque... <?xml version=“1.0”?> <xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> <xsl:template match=“/”> <html> <head> <title>Liste des livres de la bibliothèque</title> </head> <body> <h2>Les livres</h2> <ul> <xsl:for-each select=“document”> <li> <xsl:for-each select=“author”> <xsl:value-of select=“.” />, </xsl:for-each> <b><xsl:value-of select=“title” /></b>, publié par <i><xsl:value-of select=“id(@publishedby)/@name” /></i> </li> </xsl:for-each> </ul> </body> </html> </xsl:template> </xsl:stylesheet> XSLT : Tri de valeurs (xsl:sort) Tri de valeurs dans une boucle : xsl:sort xsl:sort permet de trier les résultats d’une requête d’un <xsl:for-each select=“requête XPath”> selon un critère défini par une requête XPath (cad. la valeur d’un élément feuille, la valeur d’un attribut, le nombre de fils d’un élément d’un élément, ...). XSLT : Appliquer d’autres templates (xsl:apply-templates) Utilisation d’autres templates de transformation : xsl:apply-templates xsl:apply-templates permet d’utiliser un template du document XSLT pour effectuer la transformation d’un sous-arbre de l’arbre auquel le template courant s’applique. Il y a 2 façons d’utiliser xsl:apply-templates : <xsl:apply-templates /> s’applique à l’élément courant (cad. racine du template, de la boucle, ...) <xsl:apply-templates select=“requête XPath”/> s’applique à l’élément résultat de la requête (cad. résultat unique, sinon seul le premier résultat est pris en compte). XSLT : Exemple - feuille de style pour la bibliothèque... <?xml version=“1.0”?> <xsl:stylesheet version=“1.0” xmlns:xsl=“http://www.w3.org/1999/XSL/Transform”> <xsl:template match=“/”> <html> <head> <title>Liste des livres de la bibliothèque</title> </head> <body> <h2>Les livres</h2> <xsl:apply-templates/> </body> </html> </xsl:template> <xsl:template match=“library”> <ul> <xsl:for-each select=“document”> <xsl:sort select=“title” /> <li> <xsl:for-each select=“author”> <xsl:value-of select=“.” />, </xsl:for-each> <b><xsl:value-of select=“title” /></b>, publié par <i><xsl:value-of select=“id(@publishedby)/@name” /></i> </li> </xsl:for-each> </ul> </xsl:template> </xsl:stylesheet> </li> </xsl:for-each> </ul> </xsl:stylesheet> XSLT : Conditions (xsl:if et xsl:choose) La condition : xsl:if xsl:if permet d’effectuer une transformation si une condition est satisfaite. Pour cela, il faut utiliser : <xsl:if test=“condition XPath”>...</xsl:if> La condition est fournie dans le langage des conditions de XPath. La condition multiple : xsl:choose xsl:choose permet d’effectuer une transformation en fonction de plusieurs conditions possibles. Pour cela, il faut utiliser : <xsl:choose> <xsl:when test=“condition XPath”>...</xsl:when> ... <xsl:otherwise>...</xsl:otherwise> </xsl:choose> XSLT : Feuille de style pour la bibliothèque - un peu plus d’infos ... <xsl:template match=“library”> <ul> <xsl:for-each select=“document”> <xsl:sort select=“title” /> <li> <xsl:for-each select=“author”> <xsl:value-of select=“.” />, </xsl:for-each> <b><xsl:value-of select=“title” /></b>, publié par <i><xsl:value-of select=“id(@publishedby)/@name” /></i> <br /> <u>Informations de la bibliothèque :</u> <ul> <li>Cote : <xsl:value-of select=“@callnumber” /></li> <li>ISBN : <xsl:value-of select=“ISBN” /></li> <li>Langue : <xsl:choose> <xsl:when test=“@language=’english’ ”>Anglais</xsl:when> <xsl:when test=“@language=’french’ ”>Français</xsl:when> <xsl:otherwise>Version étrangère (<xsl:value-of select=“@language” />)</xsl:otherwise> </xsl:choose> </li> <li>Voir aussi : <ul> <xsl:for-each select=“id(@related)”> <xsl:sort select=“title” /> <li><xsl:value-of select=“title” /> (cote : <xsl:value-of select=“@callnumber” />) </li> </xsl:for-each> </ul> </li> </ul> </li> </xsl:for-each> </ul> </xsl:template> XSLT : Affichage de la bibliothèque dans un navigateur XSLT - Exemple 2 : XML vers XML avec la création d’éléments et d’attributs (1/4) Exemple de référence : <ANNUAIRE> <PERSONNE> <NOM>Amann</NOM> <PRENOM>Bernd</PRENOM> <EMAIL>[email protected]</EMAIL> </PERSONNE> <PERSONNE> <NOM>Rigaux</NOM> <PRENOM>Philippe</PRENOM> <EMAIL>[email protected]</EMAIL> </PERSONNE> </ANNUAIRE> XSLT - Exemple 2 : XML vers XML avec la création d’éléments et d’attributs (2/4) Exemple de template : <xsl:template match=“PERSONNE”> <PERSONNE> <xsl:attribute name=’id’> <xsl:value-of select=’EMAIL’/> </xsl:attribute> <!- - Copie de tous les éléments fils - -> <xsl:for-each select=“*”> <xsl:copy-of select=“.”/> </xsl:for-each> </PERSONNE> </xsl:template> XSLT - Exemple 2 : XML vers XML avec la création d’éléments et d’attributs (3/4) Template initial: <xsl:template match=“/”> <?xml version=“1.0” encoding=“ISO-8859-1”?> <ANNUAIRE> <xsl:apply-templates select=’ANNUAIRE/PERSONNE’/> </ANNUAIRE> </xsl:template> XSLT - Exemple 2 : XML vers XML avec la création d’éléments et d’attributs (4/4) Fichier XML original Fichier XSL Fichier XML généré utilisation de l’outil xalan (un framework Open Source développé par Apache) Exercices Considérez le document XML suivant : <?xml version=“1.0” encoding=“UTF-8”?> <book> <title>Web</title> <authors> <name>Serge</name> <name>Loana</name> </authors> <content> <chapter id=“1”> XML data model </chapter> <chapter id=“2”> XPath </chapter> </content> </book> Énoncés 64/67 1 Produire un document équivalent en traduisant les balises en français. 2 Produire une page HTML pour l’affichage via browser. Plan du cours 65/67 1 XML 2 DTD 3 XPath 4 Namespace 5 XSLT 6 Conclusion Conclusion : XPath Expressions de chemins Selector Selected nodes / Document root // Any sub-path * Any element name Element of tag name @* Any attribute @name Attribute of name name text() Any text node comment() Any comment node node() Any node id(’value’) Element of id value processing-instruction(’name’) Processing instruction of given name Conclusion : XSLT XSL Racine du fichier xsl (au choix) <xsl:stylesheet version=”1.0” xmlns=“http://www.w3.org/1999/XSL/Transform”>...</xsl:stylesheet> <xsl:transform version=”1.0” xmlns=“http://www.w3.org/1999/XSL/Transform”>...</xsl:transform> Sortie e.g. <xsl:output method=“xml” encoding=“UTF-8” indent=“yes”/> Règle ou template : <xsl:template match=“...”>...</xsl:template> Appliquer un template sur une donnée XML : <xsl:apply-templates select=“...” /> Appel d’un template comme une fonction : <xsl:call-template name=“...” /> Condition simple : <xsl:if test=“...” >...</xsl:if> Condition multiple : <xsl:choose> <xsl:when test=“...“>...</xsl:when> ... <xsl:otherwise>...</xsl:otherwise> </xsl:choose> Boucle : <xsl:for-each select=“...”>...</xsl:for-each> Tri : <xsl:sort select=“...”/> Valeur : <xsl:value-of select=“...”/> Attribut : <xsl:attribute name=“...”>...</xsl:attribute> Copie : <xsl:copy-of select=“...” />
Documents pareils
Résumé XSL
permettre de transformer un document XML source en un document résultat.
Les noms des éléments XSL sont les instructions du langage et seront interprétées par le
moteur XSL.
Les éléments du documen...