[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

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...

Plus en détail