SELFHTML/Aides à la navigation XML/DTD Représentation de données XML |
XPath est tout comme XML, XSL et XSLT un projet de langage du consortium W3. Pour XPath il y a un groupe de travail distinct au W3C qui travaille à la spécification du langage XPath. En Novembre 1999, a été publiée la version 1.0 de la recommandation (Recommendation) pour XPath. Vous pouvez suivre la spécification actuelle et l'évolution du langage XPath à l'adresse Page d'accueil du W3 à XPath.
XPath est en fin de compte une espèce de langage complémentaire, indispensable pour que XSLT puisse réaliser ses tâches. Xpath a ici trois tâches importantes:
Lors de la transcription d'une structure de documents XML en une autre structure de documents XML, donc par exemple la transcription d'un document avec une DTD XML personnelle en un document HTML, il est important que chaque partie constituante de la structure de données puisse être adressée avec précision. Si par exemple vous avez dans l'arborescence de sortie (XML): <yeux couleur="gris bleu">
, et que vous voulez en faire dans l'arbre de transformation (HTML): <th>couleur des yeux</th><td>gris bleu</td>
, alors, il vous faut accéder à l'attribut couleur
de l'élément yeux
. Supposons plus loin que l'élément yeux
est aussi bien un élément-enfant d'un élément nommé personne
, qu'il est aussi un élément-enfant d'un élément nommé portraitrobot
dans une autre branche du même document XML. Cela vous laisse entrevoir qu'une syntaxe d'adressage utilisable est nécessaire pour un adressage sans ambiguïté des parties constitutives du document. Les cas typiques dans lesquels l'adressage XPath est utilisé sont par exemple l'attribut select
de l'instruction xsl:value-of ou bien l'attribut match
de l'instruction xsl:template.
L'adressage de données avec XPath est décrit plus bas sur cette page.
On veut dire ici les expressions logiques qui sont traitées par le processeur XSLT et qui sont importantes pour la fonctionnalité de certains éléments XSLT. Les expressions logiques contiennent des opérateurs et peuvent ainsi par exemple comparer deux valeurs. Similaire à l'adressage de données, la définition d'expressions est placée dans certaines affectations de valeurs à des attributs d'éléments XSLT. Un exemple typique est l'attribut test
de l'instruction xsl:if. Y est formulée une condition qui peut être vraie ou fausse. Ce n'est que lorsqu'elle est vraie que les instructions subordonnées sont exécutées. Une condition telle que test="age >= 18"
(est-ce que l'élément age
a une valeur supérieure ou égale à 18?) est une telle expression logique. Sa syntaxe est fondée sur XPath.
La définition d'expressions logiques avec XPath est décrite sur cette page dans la partie sur les opérateurs XPath .
La panoplie de fonctions supplémentaires de XSLT qui réalisent certaines tâches ne sont pas le moindre du grand éventail de prestations assurées par XLST. Ainsi par exemple il y a une fonction position()
, qui lors du traitement de plusieurs éléments renvoie dans l'ordre, le rang de l'élément en cours de traitement. Cette information peut être par exemple utilisée pour numéroter les éléments dans l'arbre de transformation. Une autre fonction typique nommée starts-with()
vérifie si une chaîne de caractères commence avec une certaine sous-chaîne de caractères. Quand cette fonction est notée par exemple comme condition dans une instruction xsl:if
, La création de l'arbre de transformation peut être influencée par la requête pour savoir si la valeur d'un élément commence par un certain signe ou une certaine chaîne de caractères. Ainsi, une condition telle que test="starts-with(codepostal,'13')"
pourrait par exemple demander si la valeur d'un code postal commence par 13
, et n'accepter dans l'arbre de transformation que les éléments qui remplissent cette condition.
Les fonctions supplémentaires sont décrites à la pages sur les fonctions XPath .
Les documents conformes à XML sont construits comme la structure de fichiers et de répertoires sur un support de données. Il y a là un répertoire racine qui peut contenir des répertoires (classeurs) et des fichiers. Chaque répertoire subordonné peut à son tour contenir d'autres sous-répertoires et fichiers etc... On parle aussi ici d'arborescence. À la page sur l' Arborescence et nœuds d'un fichier XML il y a un début d'explication de ce modèle.
De la même façon que l'on parle, pour la structure de fichiers sur un support de données, de répertoires ou classeurs, de fichiers et de mentions de chemin, on a besoin pour l'adressage des parties constitutives d'un document XML d'une terminologie appropriée. Dans ce but, il y a dans XPath différents types de nœuds, axes et chemins. Les termes que l'on trouve ici sont présentés ci après. Les termes semblent tout d'abord un peu académiques, mais ils sont importants pour la compréhension de XPath. Les termes originaux en anglais sont déterminants et sont (écrits en italique).
Chaque partie constitutive d'une structure arborescente de fichier XML est désignée comme étant un nœud . Étant donné qu'il y a en XML pourtant tout à fait renommé, autant de parties constitutives à faire que d'éléments d'attributs etc..., on parle de types de nœuds correspondants. Les types de nœuds ne font pas partie à proprement parler de la syntaxe d'adressage de XPath, il est pourtant avisé de connaître les termes. XPath distingue 7 types de nœuds:
|
Il résulte de l'arborescence d'un document XML pour les différents nœuds que ceux-ci ont diverses relations les uns avec les autres. Ainsi il y a des nœuds qui dépendent d'autres nœuds qui se trouvent sur un même niveau. À cet effet XPath dispose de différents termes qui viennent de la terminologie de la généalogie et qui sont désignés comme étant des axes (axes). Les termes anglais (représentés en italique dans le tableau ci-après) sont aussi utilisés pour l' adressage complet. XPath distingue 13 Axes:
|
Xpath tient à disposition deux moyens syntaxiques pour noter le chemin à un ou plusieurs nœuds:
|
Pour l'adressage des nœuds d'une structure de données XML, il y a des expressions comme /child::personne/child::yeux/attribute::couleur
. De telles expressions sont désignées comme notation complète, parce qu'elles comportent les désignations d'axes complètes. L'expression /child::personne/child::yeux/attribute::couleur
peut tout aussi bien s'écrire sous la forme /personne/yeux/@couleur
. C'est la notation abrégée qui renonce à la désignation des axes child::
et permet quelques autres "économies". Dans les exemples plus bas, les deux variantes de notation seront montrées chaque fois en parallèle.
Chaque document XML a une racine qui peut également être adressée.
<xsl:template match="/"> <html><head><title>Exemple</title></head> <body> <xsl:apply-templates /> </body></html> </xsl:template> |
Le nœud racine du document XML est adressé avec une simple barre oblique (/
). Dans l'exemple un modèle est défini avec xsl:template pour la racine du document XML. Dans l'attribut match
la racine du document est adressée.
Les nœuds d'un document XML peuvent être adressés à l'aide d'une mention de chemin absolue.
<xsl:template match="/child::adresse/child::prenom"> <b><xsl:value-of select="/child::adresse/child::prenom"></b> </xsl:template> |
<xsl:template match="/adresse/prenom"> <b><xsl:value-of select="/adresse/prenom"></b> </xsl:template> |
Les mentions de chemin absolues commencent par une barre oblique (/
), qui représente la racine du document. Les autres niveaux de la hiérarchie sont marqués par d'autres barres obliques. Les nœuds par lesquels passe le chemin sont, comme dans l'exemple 1, indiqués par leur axe et leur nom de nœud séparés par deux fois deux points (::
). De la même façon est permise et malgré tout utilisée plus souvent, la notation abrégée sans désignation d'axes montrée dans l'exemple 2. Dans l'exemple un modèle est défini pour un élément nommé prenom
grâce à l'instruction xsl:template
; cet élément est un élément enfant de l'élément adresse
qui est lui-même un élément enfant de la racine du document. La syntaxe est même employée dans l'attribut select
de l'instruction xsl:value-of.
Les nœuds d'un document XML peuvent être adressés à l'aide d'une mention de chemin relative.
<ligue> <element_ligue> <joueur>...</joueur> <resultat> <points>...</points> </resultat> </element_ligue> </ligue> |
<xsl:template match="./child::element_ligue/child::resultat"> <span class="normal"><xsl:value-of select="parent::joueur"></span> <span class="accent"><xsl:value-of select="./child::points"></span> </xsl:template> |
<xsl:template match="element_ligue/resultat"> <span class="normal"><xsl:value-of select="../joueur"></span> <span class="accent"><xsl:value-of select="points"></span> </xsl:template> |
L'exemple suppose une structure d'éléments imbriqués typiques. Il suppose qu'il y a une définition de modèle pour l'élément ligue
dans laquelle les modèles subordonnés sont appelés avec l'instruction xsl:apply-templates. De plus l'exemple suppose que pour l'élément element_ligue
aucune définition de modèle n'existe, mais qu'il y en a une pour son élément enfant resultat
. Pour adresser cet élément par rapport à l'élément grand-père ligue
, une mention de chemin relative dans l'attribut match
de l'instruction xsl:template est nécessaire. Dans la notation complète, cette mention de chemin s'énonce ./child::element_ligue/child::resultat
, dans la notation abrégée, plus facilement lisible element_ligue/resultat
. La chaîne de caractères ./
(point et barre oblique) figure pour "nœud actuel". Cette chaîne de caractères peut aussi être omise. Autrement la mention de chemin relative consiste simplement dans la suite les noms de nœuds déterminant la hiérarchie. Pour la notation complète la désignation d'axe child::
est ici encore utilisée, tandis que pour la notation abrégée suffisent les simples noms de nœuds (Dans l'exemple les noms d'éléments element_ligue
et resultat
). Le signe de séparation des niveaux de la hiérarchie est la simple barre oblique (/
).
À l'intérieur de la définition de modèle pour l'élément resultat
est noté entre autre du code HTML pour un autre élément des données de sortie, à savoir pour l'élément joueur
. Cet élément se trouve cependant sur le même niveau hiérarchique que l'élément actuel resultat
(nœuds frères). Pour l'adresser par rapport à resultat
, il doit être adressé par le biais de l'élément parent commun. Dans la notation complète la désignation d'axe parent::
est disponible, suivie du nom de l'autre nœud enfant. Dans la notation abrégée, la mention de deux points suivie d'une barre oblique suffit (../
), pour décrire le chemin par l'élément parent.
Pour la sortie HTML de l'élément points
est utilisé de la même façon un adressage relatif. Étant donné que l'élément points
est par rapport à l'élément actuel resultat
simplement un élément enfant, les mentions ./child::points
(notation complète) ou bien points
(notation abrégée) suffisent pour l'adressage.
Les attributs d'éléments sont traités en XPath comme des nœuds d'attributs et adressés comme tels.
<xsl:template match="./child::yeux/attribute::couleur"> <tr><td><b><xsl:text>couleur des yeux:</xsl:text></b></td> <td><xsl:value-of select="." /></td></tr> </xsl:template> |
<xsl:template match="yeux/@couleur"> <tr><td><b><xsl:text>couleur des yeux:</xsl:text></b></td> <td><xsl:value-of select="." /></td></tr> </xsl:template> |
L'exemple suppose qu'il y a une notation XML <yeux couleur="...">
. Un modèle distinct est défini pour l'attribut. Pour cela une rangée de tableau sur deux colonnes est créée dans l'arbre de transformation HTML dans lequel l'expression statique couleur des yeux:
figure dans la colonne de gauche tandis que dans la colonne de droite est sortie la valeur de l'attribut couleur=
. L'attribut match
de la définition de modèle est adressé de telle façon que le modèle puisse être appelé par un élément parent de yeux
- par exemple de personne
-. Le chemin s'intitule alors dans la notation complète ./child::yeux/attribute::couleur
et dans la notation abrégée plus courante yeux/@couleur
. Pour la notation complète les désignations d'axes child::
(pour l'élément enfant child
par rapport à personne
) et attribute::
pour le choix de son attribut couleur
sont utilisées. Dans la notation abrégée, la mention relative de l'élément enfant yeux
et du nom de l'attribut précédé du signe "chez" (@
)suffit.
L'adressage avec des jokers (caractères de remplacement) permet de choisir plusieurs nœuds en une seule fois.
<codefichier> <signature>474946383961</signature> <screen-descriptor>10000200B30000</screen-descriptor> <color-map>000000BF000000BF00BFBF00</color-map> <extension-block>21F90401000000</extension-block> <!-- etc... --> </codefichier> |
<xsl:template match="codefichier"> <xsl:value-of select="child::*" /> </xsl:template> |
<xsl:template match="codefichier"> <xsl:value-of select="*" /> </xsl:template> |
L'exemple suppose qu'à l'aide d'éléments XML la construction d'un fichier binaire est décrite (dans l'exemple: le format GIF). Dans la sortie, les contenus de tous les éléments enfants de codefichier
doivent être écrits simplement sur une lancée. Dans la définition de modèle de codefichier
ceci est obtenu dans l'attribut select
de l'instruction xsl:value-of par la mention du caractère de remplacement *
(astérisque). Dans la notation complète la mention de l'axe child::
est notée, elle peut être omise dans la notation abrégée.
Le caractère de remplacement *
(astérisque) ne choisit que sur le niveau immédiatement subordonné hiérarchiquement. Une forme accentuée est la suite de caractères //
(deux barres obliques). Avec elle, le choix se porte sur tous les niveaux subordonnés dans la hiérarchie peu importe, le nombre d'embranchements à venir dans l'arborescence.
Par l'adressage absolu et relatif, il n'est pas encore possible d'adresser chaque élément de son choix. Admettons qu'un élément nommé liste
ait 25 éléments-enfants nommés element_liste
, alors un adressage tel que liste/element_liste
n'accède qu'au premier de ces éléments. Ce genre de problèmes peut certes également être maîtrisé par des boucles xsl:for-each, toutefois il arrive que l'on ne veuille adresser qu'un élément bien précis des éléments-enfants et non pas tous à la suite. Les exemples suivants montrent des adressages avec des mentions de position et des conditions pour adresser certains éléments distincts. Ici sont mises également en œuvre en partie des fonctions XPath.
Les parties composant la syntaxe placées entre crochets ([]
) font partie également de l'éventail des mentions pour l'adressage avec des mentions de position et des conditions. Ces parties constitutives sont désignées par le terme Prédicats. Nombre des exemples qui suivent utilisent ces prédicats.
|
XPath propose une série d'opérateurs qui permettent de comparer des valeurs, d'effectuer des opérations ou d'évaluer des expressions. Ces attributs peuvent être placés dans les attributs de certains Éléments XSLT. Là ils aident à formuler des conditions, à calculer les positions d'élément et plus encore. XPath connaît les opérateurs suivants:
|
Fonctions XPath | |
Éléments XSLT | |
SELFHTML/Aides à la navigation XML/DTD Représentation de données XML |
© 2001 Stefan Münz / © 2003 Traduction Serge François, 13405@free.fr
selfhtml@fr.selfhtml.org