Comment tester si un élément ou un attribut existe en utilisant XPath/XSLT ? Comment
tester s'il est vide ?
Eric van der Vlist,
Dyomedea (vdv@dyomedea.com).
jeudi 25 janvier 2001
Je souhaite effectuer un test pour savoir si un élément ou un
attribut n'existe pas, comment faire?
Ce serait quelque chose du genre:
<xsl:if
test="{Report/@reportid} = Empty ">
XPath convertit toutes les valeurs en valeur logique lorsque c'est nécessaire.
Pour tester si un élément ou un attribut existe, il suffit donc
d'écrire son chemin et la conversion se fera de manière implicite:
Test si l'élément "element" existe sous le noeud contexte:
<xsl:if
test="element">
Test s'il existe un élément "element" sous le noeud racine
ayant un attribut "attribut":
<xsl:if
test="element[@attribut]">
Copie de l'ensemble des éléments "element" du
document ayant des sous éléments "fils":
<xsl:copy-of
select="//element[fils]">
Il s'agit bien de tests d'existence, les éléments ou attributs
pouvant, dans ce cas, être vides.
La première manière de tester si un attribut ou élément est
vide est de le convertir explicitement en chaîne de caractères, XPath faisant
ensuite une conversion implicite en valeur logique si nécessaire.
Pour tester s'il existe un élément "element" sous le noeud
racine ayant un attribut "attribut" non vide:
<xsl:if
test="element[string(@attribut)]">
Cette formulation est dangereuse si l'élément ou attribut peut
contenir des caractères blancs (espaces, retours chariot, tabulation, …) et le
résultat de ce test serait vrai pour <element attribut=" "/>.
On préférera donc souvent utiliser la fonction normalize-string() qui supprime tous les blancs inutiles.
Copie de l'ensemble des éléments "element" du
document ayant des sous éléments "fils" non vides:
<xsl:copy-of
select="//element[normalize-space(fils)]">
Ce test ne copiera pas un élément tel que celui-ci:
<element>
<fils> <!--uniquement des blancs-->
</fils>
</element>
En ce qui concerne les éléments, on pourra également enlever
tous les noeuds texte ne contenant que des caractères blancs, on utilisera
également l'instruction strip-space:
<xsl:strip-space
elements ="*" />
Les tests mentionnés plus haut sont fiables. Encore faut-il
s'entendre sur ce qu'est un élément vide… Dans notre test, nous testons en fait
que la valeur au sens XPath du terme de
cet élément est vide; hors la valeur XPath d'un élément s'obtient en supprimant
toutes les balises et l'élément suivant serait rejeté par ce test comme ayant
une valeur normalisée nulle:
<element>
<fils>
<petit-fils/>
</fils>
</element>
Pour tester si un élément est vide au sens strict du terme, il
est donc préférable de compter ses noeuds en utilisant les fonctions XPath
count() et le test node():
Copie de l'ensemble des éléments "element" du
document ayant des sous éléments "fils" n'ayant pas de noeuds texte ou
éléments:
<xsl:copy-of
select="//element[fils[count(node())]]">
Plus sélectif, ce test va inclure un élément comme celui ayant
un fils un petit-fils. Par contre, il test n'est pas absolu et test qu'un
élément est vide au sens XML du terme. XML n'accordant que peu de valeurs aux
attributs, la fonction node() ne retourne que les noeuds de types texte ou
élément et notre test ne couvrira pas un élément comme:
<element>
<fils petit-fils="present">
</element>
Pour inclure les noeuds ayant
des attributs, il faut explicitement les rajouter lors du comptage:
Copie de l'ensemble des éléments "element" du
document ayant des sous éléments "fils" n'ayant pas de noeuds texte, éléments
ou attributs:
<xsl:copy-of
select="//element[fils[count(node()|@*)]]">
Cette dernière formulation vous permet n'éliminer que les fils
n'ayant ni texte significatif, ni sous-élément, ni attribut.
Sverre
Peschardt: "[xml-tech] Element vide"Michael
Tartar: "[xml-tech] Re: Element vide"LEFEBVRE
Christophe: "[xml-tech] Re: Element vide"Eric
van der Vlist: "[xml-tech] Re: Element vide"Joan
Perez/AT-Carrefour: "[xml-tech] tester l'existence d'une balise xml dans
une feuille xsl"Eric
van der Vlist: "[xml-tech] Re: tester l'existence d'une balise xml dans
une feuille xsl"MOUSSAUD
Benoît: "[xml-tech] XPATH: présence d'un attribut"Eric
van der Vlist: "[xml-tech] Re: XPATH: présence d'un attribut"
Copyright 2001,
Eric van der Vlist.
|