les outils de base : xpath, xsl, xlink, xforms 1. xpath 2. xslt 3. xslfo 4. xlink 5. xforms 6....
TRANSCRIPT
Les outils de base : XPath, XSL, XLink, XForms
1. XPATH2. XSLT3. XSLFO4. XLink5. XForms6. Conclusion
G. GardarinIII.2
1. XPath : l'adressage XML
XPath Expressions de chemins dans un arbre XML Permet de sélectionner des nœuds par
navigation
XPath
Document XML
?
G. GardarinIII.3
XPath
XML Path Language recommandation W3C pour expressions de
chemins acceptée le 16 novembre 1999 version 2 en cours d'élaboration
Expressions de chemins communes à : XSL Xpointer (liens) XQuery (queries)
Xpath permet de rechercher un élément dans un document d'adresser toute sous partie d'un document
XPath
G. GardarinIII.4
XPath - Parcours d'arbre
XPath opère sur l'arbre d'un document<livre auteur = "Hugo"> <titre>Les chatiments</titre> <chapitre> <section>Buonaparte </section> <section>Neige</section> </chapitre> …</livre>
racine
section
Auteur = "Hugo"
livre
Buonaparte
chapitre
Neige
chapitre
sectionLes chatiments
titre
XPath
G. GardarinIII.5
XPath - Expression de chemins
Une expression de chemins spécifie une traversée de l'arbre du document : depuis un nœud de départ vers un ensemble de nœuds cibles les cibles constituent la valeur du
cheminement Un chemin peut être :
absolu commence à la racine /étape1/…/étapeN
relatif commence à un nœud courant étape1/…/étapeN
XPath
G. GardarinIII.6
Syntaxe et sémantique
Cheminement élémentaire direction::sélecteur[predicat]
Directions parent, ancestor, ancestor-or-self child, descendant, descendant-or-self preceding, preceding-sibling following, following-sibling self, attribute, namespace
Sélecteur nom de nœud sélectionné (élément ou @attribut)
Prédicat [Fonction(nœud) = valeur]
XPath
G. GardarinIII.7
XPath - Exemples
Sections d'un chapitre /child::livre/child::chapitre/child::section /livre/chapitre/section
Texte du chapitre 1 section 2 /descendant::chapitre[position() = 1]
/child::section[position() = 2]/child::text() //chapitre[1]/section[2]/text()
XPath
G. GardarinIII.8
XPath - Synthèse
Pattern Exemple Signification Nom section Sélectionne les éléments de nom donné Nom[0] section[0] Sélectionne le premier élément ayant le nom donné Nom[end()] section[end()] Sélectionne le dernier élément ayant un nom donné | Droite|Gauche Indique une alternative (un nœud OU bien l'autre (ou les deux)) / / Sélectionne le nœud racine d'une arborescence /arbre/Nom /livre/chapitre Sélectionne les nœuds descendants par la balise de nom donné de l'arbre * * Motif "joker" désignant n'importe quel élément // //personne Indique tous les descendants d'un nœud . . Caractérise le nœud courant
.. .. Désigne le nœud parent. Permet de remonter d'un niveau dans l'arborescence
@ @nom Indique un attribut caractéristique (@nom désigne la valeur de l'attribut). La notation @* désigne tous les attributs d'un élément
text() text() Désigne le contenu d'un élément (le texte contenu entre ses balises)
ID() ID('a2546') Sélectionne l'élément dont l'identifiant (la valeur de l'attribut ID) est celui spécifié en paramètre
Comment() Comment() Désigne tous les nœuds commentaires Node() Node() Désigne tous les noeuds
XPath
G. GardarinIII.9
2. XSLT : la présentation
Permet de transformer un document régulier ou irrégulier de XML à XML, XHTML est un cas particulier De XML à présentation (HTML, texte, rtf, pdf,
etc.)
Un document est un arbre Le processeur XSL parcourt l'arbre et
applique les règles de transformations vérifiées (à condition vraie) aux nœuds sélectionnés
Un autre arbre est produit en sortie
XSLT
G. GardarinIII.10
Publications avec XSL
Plusieurs formats de publication d’un même jeu de données
Il permet la présentation sur des terminaux variés
XSLProcessor
XMLDocument
Format ( PDF)
Format (XML) application
e.Commerce
format (WML)
Browser Netscape/IE
(XHTML, DHTML, HTML)
Format (XML) pour Word,
Excel
XSLStylesheet
XSL
G. GardarinIII.11
Architectures
Fichier
Base de données
Affichage
•Affichage•Traitement
SERVEUR
XML
XML
Programme
XMLASPouJSP
XSL
Processeur XSL
Affichage
HTML
HTML
XML
Processeur XSL
G. GardarinIII.12
Les feuilles de style
Une feuille de style XSL est un document XML de racine <xsl:stylesheet> contient une liste de règles de transformation
<xsl:template>
Chaque règle (<xsl:template>) est définie par: Une condition spécifiant le sous-arbre du
document d’entrée auquel elle s’applique Une production spécifiant le résultat de
l’application de la règle
Utilisation d'un nom de domaine spécifique Le préfixe généralement utilisé est xsl:
XSLT
G. GardarinIII.13
Exemple de document<?xml version="1.0" ?>
<Guide><Restaurant Categorie="**">
<Nom>Le Romantique</Nom><Adresse>
<Ville>Cabourg</Ville> <Dept>Calvados</Dept>
</Adresse> </Restaurant><Restaurant Categorie="***">
<Nom>Les TroisGros</Nom><Adresse>
<Ville>Roanne</Ville> <Dept>Loire</Dept>
</Adresse></Restaurant>
</Guide>
XSLT
G. GardarinIII.14
Exemple de feuille de style XSL<?xml version="1.0" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/xsl"> <xsl:template match="/">
<html><head><B>ESSAI XSL</B></head> <body><xsl:apply-templates/></body></html>
</xsl:template> <xsl:template match="Guide"> <H1>BONJOUR LE GROUPE XML</H1> <H2>SUIVEZ LE GUIDE</H2> <xsl:apply-templates /> </xsl:template><xsl:template match="Restaurant">
<P> <I>Restaurant :</I> <xsl:value-of select="Nom"/></P>
</xsl:template> </xsl:stylesheet>
XSLT
G. GardarinIII.15
Les règles de production
Définition des règles par <xsl:template …> Attributs
match: condition de sélection des nœuds sur lesquels la règle s'applique (XPath)
name: nom de la règle, pour invocation explicite (en conjonction avec <call-template>)
mode: permet d'appliquer à un même élément des règles différentes en fonction du contexte
priority: priorité, utilisé en cas de conflit entre deux règles ayant la même condition
Exemples <xsl: template match="/"> <xsl: template match="auteur">
XSLT
G. GardarinIII.16
La génération du résultat
Le contenu de l'élément <xsl:template> est la production de la règle Les éléments du namespace xsl sont des instructions qui
copient des données du document source dans le résultat Les autres éléments sont inclus tels quels dans le résultat
Instructions pour: Parcourir l'arbre du document source Copier le contenu du document source dans le résultat
Parcours de l'arbre: <xsl:apply-templates> <xsl:for-each>
Copie du contenu du nœud sélectionné <xsl:value-of select= … >
XSLT
G. GardarinIII.17
Résumé des commandes <xsl:template>, définir une règle et son contexte
<xsl:apply-templates />, appliquer les transformations aux
enfants du nœud courant
<xsl:value-of select … />, extrait la valeur d'un élément sélectionné à partir du nœud courant
<xsl:for-each>, définir un traitement itératif
<xsl:pi>, générer une processing instruction
<xsl:element>, générer un élément
<xsl:attribute>, générer un attribut
<xsl:if>, définir un traitement conditionnel
XSLT
G. GardarinIII.18
Quelques éditeurs- IBM XSL Ed i to r -
version: 1.0 preview release 2 platforms: J ava
license: Free developer: Alphaworks, IBM
revised: 21 jan 2000
Editeur multi-frame et outils de mise au point – Alphawork d'IBM - S tylus S tudio -
version: 4.6 platforms: Windows NT/2000
license: Commercial; 30 day evaluation available. developer: Excelon Corporation
revised: 06 mar 2003
Editeur de Excelon (Progress); creation XSL et mise au point - XMLTransfo rm -
version: 1.1.0 platforms: J ava
license: Commercial; free evaluation version available developer: TIBCO Software Inc.
revised: 22 feb 2002
Editeur de Tibco pour les transformations XSL à XSL
XSLT
G. GardarinIII.19
IBM XSL Editor
XML XSLT Rendu
XSLT
G. GardarinIII.20
Bilan XSLT
XSLT est un langage très puissant de transformation d'un arbre XML en un autre
XSLT permet en particulier de publier des données XML sur le Web par transformation en un document HTML standard
XSLT est utilisé : Pour publier des contenus XML Pour transformer des données (EAI, B2B)
XSLT
G. GardarinIII.21
3. XSLFO : le formatage
Les Objets de mise en forme sont multiples :
<fo:block> utilisé pour les paragraphes, les titres…
<fo:display-rule> ligne de séparation
<fo:display-graphic> zone rectangulaire contenant graphisme
Ils possèdent de nombreuses propriétés
Pour un block on peut définir la marge gauche et droite l’espace avant et après le paragraphe la couleur du texte ………...
XSLFO
G. GardarinIII.22
XSLFO : principes
Ils sont appliqués à un nœud de l ’arbre résultat
Ils sont appelés par l ’espace nominale fo
Syntaxe :<xsl:template match="[motif xpath]" >
<fo :[objet-de mise en forme]
([propriété-style]="[valeur]")+>
[instructions-de-traitement]
</fo:[objet de mise-en-forme]>
</xsl:template>
XSLFO
G. GardarinIII.23
XSLFO : Exemple
Définition de propriétés pour la racine <xsl:template match=‘/’>
<fo-display-sequencefont-style=‘italic’
start-indent=‘4pt’end-indent=‘4pt’
font-size=‘18pt’<xsl:apply-templates/></fo-display-sequence>
</xsl:template
La définition d’une propriété en locale est prioritaire devant l’héritage
XSLFO
G. GardarinIII.24
Les outils XSL
Processeurs XSLT conformes à la spécification: Apache Group (www.apache.org): Xalan 1.0.1 Oracle XDK (www.oracle.com): XML Parser 2.0.2 James Clark (www.jclark.com): XT Microsoft Internet Explorer 5.0 et plus Netscape 6 supporte XSLT
Processeur XSLFO Apache Group : FOP (Formating Object Processor)
Génère du PDF http://www.apache.org JFOR (Open Source) Génère du RTF http://www.jfor.org
XSL
G. GardarinIII.25
Bilan XSL
XML = SGML léger pour la production de publications web importantes :
production d’une source unique en XML ;
XSLT = génération automatique de présentations web multiples ;
XSLFO = génération automatique sur d’autres supports.
Questions ?
XSL
G. GardarinIII.26
4. Autres spécifications
XLink = liens externes entre documents
XPointer = pointeurs internes à un document
XForms = saisie de formulaires avec XML
XLink et plus
G. GardarinIII.27
Xlink et les liens
Exprimer des liens entre documents XML pointe sur une URL l'URL peut inclure une partie Xpointer tout élément peut être un lien
Différents types de liens simple xlink:type = "simple" étendu xlink:type = "extended" De véritables associations 1-1 en simple, k-n en étendu avec rôles possibles avec comportements possibles
XLink et plus
G. GardarinIII.28
Exemples simples
<Annotation xlink:type="simple" href="note1.xml"> 1 </Annotation>
<Auteur xlink:type="simple" inline="true" href="http://www.e-xmlmedia.com/~georges/"> Georges Gardarin </Auteur>
<Image xlink:type="simple" href="logo.gif"/>
Les attributs doivent être définis dans la DTD si le document en possède une
XLink et plus
G. GardarinIII.29
Les liens étendus
Associations orientées de M vers N Permettent de relier des
éléments entre eux par des arcs étiquetés et ainsi de composer des graphes étiquetés orientés
Éléments ressource et locator définissant les nœuds
Éléments arc définissant les liens
Ressource <xxx
xlink:type="resource" label="..." title="..." role="...">contenu de l'élément</xxx>
Locator <xxx xlink:type="locator"
label="…" title="…" role="…" href="…" />
Arc <xxx xlink:type="arc"
from="…" to="…" show="…" actuate="…" title="…" arcrole="…">contenu</xxx>
XLink et plus
G. GardarinIII.30
Les attributs de XLink
xlink:type type de lien
href référence de l'URL
title titre du document cible
role rôle du document cible
show en place, interne ou
nouveau document
actuate manuel ou automatique
label étiquette des arcs
from source de l'arc
to cible de l'arc
XLink et plus
G. GardarinIII.31
XPointer
Permet de référencer un élément particulier d'un document le document est spécifié par Xlink le Xpointer est ajouté à l'URI séparée par # ou |
Pointeur absolue id() : référence un élément d'identifiant donné root() : pointe sur la racine d'un document html() : référence un document HTML
Pointeur relatif = XPath child, descendant, ancestor, preceding, following, … Exemple : <vin2 xlink:type="simple"
href="http://www.site.fr/ degustation#xptr(/child::degustation/child::vin[2])"
XLink et plus
G. GardarinIII.32
XForms
Nouvelle génération de formulaires Web Assemblage de formulaires à partir de
schéma Schéma = structure + type Contraintes = Dépendances, expressions et
calculs
XForms User Interfaces est la partie apparente pour l’utilisateur (présentation) XForms User Interfaces intègre toutes les
commandes de XHTML Ajoute en plus des contrôles (tags) spécifiques
au niveau présentation.
XForms
G. GardarinIII.33
Saisie des formulaires
Génération et contrôle du message XML Contrôle sur le client ou le serveur
XForms Model
XFormsUser
Interface
<XML>Instance
data
XForms Submit Protocol
XForms
G. GardarinIII.34
5. Conclusion
XSL pour transformer et présenter puissant mais complexe problème de performance des processeurs ?
Recommandation XSL version 1.0 http://www.w3.org/TR/xsl/
Recommandation XPath version 1.0 http://www.w3.org/TR/xpath
Recommandation Xlink version 1.0 http://www.w3.org/TR/xlink
Références
G. GardarinIII.35
G. GardarinIII.36
EXERCICES ET COMPLEMENTS
Modèle des documents en entrée Modèle des documents en sortie Structure d’une feuille de style Mise en œuvre des transformations
G. GardarinIII.37
Modèle de document en entrée
Le document transformé doit être un document XML bien formé Document XML: arbre dont les nœuds sont les éléments
et leur contenu (texte) Pour XSL, la racine du document, les attributs, les
namespaces, les instructions de traitement et les commentaires sont aussi vus comme des nœuds
Types de nœuds traités par XSL: Racine du document (différent de l’élément racine!) Éléments Texte Attributs Namespaces Instructions de traitement Commentaires
G. GardarinIII.38
Exemple de document XML
<?xml version="1.0" encoding="iso-8859-1"?><?xml-stylesheet href="style1.xsl" type="text/xsl"?>
<CATALOGUE> <ARTICLE> <REFERENCE>JT3006</REFERENCE> <PRIX UNIT="FFR" TAX="TTC">1874</PRIX> </ARTICLE> <ARTICLE> … </ARTICLE></CATALOGUE>
G. GardarinIII.39
Arbre correspondant
Les attributs apparaissent comme des fils de l’élément auquel ils s’appliquent
Racine
Catalogue
Article
ReferencePrix
Tax="TTC"
Prix="FFR" 1874 JT3006
Article
<?xml-stylesheet href="style1.xsl" type="text/xsl"?>
G. GardarinIII.40
Modèle de document en sortie
En général, le document produit est un document XML Document complet Fragment de document bien formé
La norme prévoit deux autres types de documents produits: Un type HTML, qui permet de transformer le HTML bien
formé (ex: <BR/>) en HTML standard (ex: <BR>) Un type texte, qui permet de générer des formats non
balisés de type RTF, Postscript, TeX.
Le type de format de sortie est contrôlé par l’élément xsl:output
G. GardarinIII.41
Structure d’une feuille XSL
Une feuille de style XSL contient une liste de règles de transformation
Chaque règle (template) est définie par: Une condition spécifiant le sous-arbre du document
d’entrée auquel elle s’applique Une production spécifiant le résultat de l’application de
la règle
XSL utilise XML pour décrire les règles de transformation: <xsl:stylesheet> est l’élément racine d’une feuille de
style XSL Toutes les instructions XSL sont des éléments du
namespace "http://www.w3.org/1999/XSL/Transform" Le préfixe généralement utilisé est xsl
G. GardarinIII.42
Exemple de feuille de style
<?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="CATALOGUE"> <html> <xsl:apply-templates/>
</html> </xsl:template>
<xsl:template match="ARTICLE"> <P> <xsl:apply-templates/> </P> </xsl:template>
</xsl:stylesheet>
Style1.xsl
G. GardarinIII.43
Que fait l'exemple?
La première règle: Remplace l'élément racine <CATALOGUE> par
l'élément <html> Le contenu de <html> est le résultat de la
transformation du contenu de <CATALOGUE> par les autres règles de la feuille de style
La seconde règle: Remplace chaque élément <ARTICLE> par un
élément <P> Le contenu de <P> est le texte (sans les
balises) contenu dans les descendants de l'élément <ARTICLE> (règle par défaut)
G. GardarinIII.44
Mise en œuvre
Trois types de mise en œuvre possible: Transformation statique Transformation dynamique sur le serveur Web Transformation dynamique sur le client
Le choix de l'approche dépend: De l'utilisation des documents produits
(impression papier, publication Web) Du type de données XML manipulées (statique
ou dynamique) Des capacités du serveur Web utilisé Des capacités du client Web utilisé
G. GardarinIII.45
Architectures
Fichier
Base de données
Affichage
•Traitement•Affichage
SERVEUR
XML
XML
Programme XMLASPouJSP
Processeur XSL
Affichage
HTML
HTML
XMLProcesseur
XSL
WMLPSPDF
Processeur XSL
XML HTML
G. GardarinIII.46
Transformation statique
Les documents XML sont transformés à l'avance: Impression papier Stockage HTML sur un site Web standard
Avantages: Pas de problèmes de performance Serveur et client Web standards
Inconvénients Impossibilité de gérer des données XML
dynamiques Cohérence entre source et résultat
G. GardarinIII.47
Transformation sur le serveur
Les documents XML sont transformés à la demande par le serveur: Publication Web en HTML Échanges inter-application
Avantages: Permet de gérer des données XML dynamiques Client Web standard (HTML)
Inconvénients: Nécessite un serveur compatible XSL Problèmes de performances sur le serveur
G. GardarinIII.48
Transformation sur le client
Le document XML et la feuille XSL sont transmises par le serveur avant transformation: Publication Web
Avantages: Permet de gérer des données dynamiques Serveur Web standard Pas de problèmes de performances sur le
serveur
Inconvénients: Nécessite un client Web compatible XSL Les données XML ne sont pas filtrées avant envoi
G. GardarinIII.49
Association document-feuille XSL
Transformation statique: Le document XML et la feuille XSL sont deux
paramètres du programme de transformation
Transformation dynamique: L'association est gérée par une instruction de
traitement dans le fichier XML <?xml-stylesheet href="style1.xsl" type="text/xsl"?>
G. GardarinIII.50
LES RÈGLES XSL
Définition d'une règle La génération du résultat L'élément <xsl:apply-template> L'élément <xsl:value-of> L'élément <xsl:for-each>
G. GardarinIII.51
Définition d'une règle
Définition des règles avec <xsl:template>, avec les attributs: match: condition de sélection des nœuds sur lesquels la règle
s'applique name: nom de la règle, pour invocation explicite (en
conjonction avec <call-template>) mode: permet d'appliquer à un même élément des règles
différentes en fonction du contexte priority: priorité, utilisé en cas de conflit entre deux règles
ayant la même condition
Au moins un des attributs match ou name doit être présent
L'attribut match permet de spécifier des expressions complexes XPath pour sélectionner les nœuds
G. GardarinIII.52
La génération du résultat
Le contenu de l'élément <xsl:template> est la production de la règle Les éléments du namespace xsl sont des instructions qui
copient des données du document source dans le résultat Les autres éléments sont inclus tels quels dans le résultat
Instructions pour: Parcourir l'arbre du document source Copier le contenu du document source dans le résultat
Parcours de l'arbre: <xsl:apply-templates> <xsl:for-each>
Copie du contenu <xsl:value-of>
G. GardarinIII.53
L'élément <xsl:apply-templates>
L'élément <xsl:apply-templates> permet d'appliquer récursivement les règles aux fils de l'élément sélectionné par la règle courante
Il a deux attributs optionnels: select: permet de sélectionner les descendants à
traiter mode: permet de sélectionner les règles à
appliquer L'attribut select permet de définir des
expressions complexes pour sélectionner des nœuds Similaire à l'attribut match de <xsl:template> Expressions XPath
G. GardarinIII.54
Utilisation du select<?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template>
<xsl:template match="CATALOGUE"> <body> <xsl:apply-templates/> </body> </xsl:template>
<xsl:template match="ARTICLE"> <xsl:apply-templates select="LIBELLE"/> </xsl:template></xsl:stylesheet>
Style2.xsl
G. GardarinIII.55
L'élément <xsl:value-of>
L'élément <xsl:value-of> calcule la valeur d'une expression et la copie dans le résultat L'expression est évaluée dans le contexte de l'élément
courant
Il a deux attributs: select: attribut obligatoire spécifiant l'expression XPath à
évaluer disable-output-escaping: attribut optionnel gérant la
copie des caractères spéciaux (valeur: yes ou no)
La valeur d'un nœud est une string, sa valeur exacte dépend du type de nœud: Pour un élément, c'est tout le texte compris entre les
balises de début et de fin
G. GardarinIII.56
Utilisation de <xsl:value-of><?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template>
<xsl:template match="CATALOGUE"> <body> <xsl:apply-templates/> </body> </xsl:template>
<xsl:template match="ARTICLE"> <xsl:value-of select="LIBELLE"/> </xsl:template></xsl:stylesheet>
G. GardarinIII.57
L'élément <xsl:for-each>
L'élément <xsl:value-of> ne devrait être appliqué qu'à des expressions retournant un nœud unique: Dans le cas contraire, seule la valeur du premier nœud
est retournée
L'élément <xsl:for-each> permet d'itérer sur un ensemble d'éléments défini par l'attribut: select: attribut obligatoire permettant de sélectionner
les nœuds à traiter
Le contenu de l'élément <xsl:for-each> est copié n fois dans le résultat: Les instructions xsl sont traitées comme dans une règle
<xsl:for-each> permet de réduire le nombre de règles, dans le cas de documents réguliers
G. GardarinIII.58
Utilisation de <xsl:for-each><?xml version="1.0"?><xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/"> <html> <xsl:apply-templates/> </html> </xsl:template>
<xsl:template match="CATALOGUE"> <body> <xsl:for-each select="ARTICLE"/> < xsl:value-of select="LIBELLE"/> </xsl:for-each> </body> </xsl:template>
</xsl:stylesheet>
Style3.xsl
G. GardarinIII.59
La sélection des éléments
L'attribut match des éléments <xsl:template> permet de spécifier des conditions complexes pour sélectionner les éléments auxquels appliquer une règle
La syntaxe de l'attribut select, utilisée par plusieurs instructions, permet de sélectionner des éléments parmi les descendants de l’élément courant auquel s’applique la règle
G. GardarinIII.60
Exemples d'expressions para: tout élément para *: tout élément chapter|appendix: tout élément chapter ou appendix olist/item: tout élément item avec un père olist appendix/*/para: tout élément para avec un grand-père
appendix appendix//para: tout élément para avec un ancêtre
appendix /: le nœud racine text(): tout nœud texte processing-instruction(): toute instruction de traitement node(): tout nœud id("W11"): élément d'ID W11
G. GardarinIII.61
Exemples avec tests
para[1]: tout élément para qui est le premier fils para de son père
*[position()=1 and self::para]: idem para[last()=1]: tout élément para qui est le seul fils
para de son père items/item[position()>1]: tout élément item qui à un
père items et qui n'est pas le premier fils item de son père
item[position() mod 2 = 1]: tout élément item qui est un fils item impair
@class: tout attribut class @*: tout attribut div[@class="appendix"]//p: tout élément p avec un
ancêtre div dont l'attribut class vaut appendix