Accueil
 chercher             Plan du site             Info (English version) 
L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.Les listes de discussions XMLfr sont à votre disposition pour réagir sur nos articles ou simplement poser une question.Si vous ètes passionnée(e) par XML, pourquoi ne pas en faire votre métier ?XMLfr n'est heureusement pas le seul site où l'on parle de XML. Découvrez les autres grâce à XMLfr et à l'ODP.Les partenaires grâce auxquels XMLfr peut se développer.Pour tout savoir sur XMLfr.XMLfr sans fil, c'est possible !Pour ceux qui veulent vraiment en savoir plus sur XML.L'index du site.
 Si vous vous posez une question, vous n'êtes peut-être pas le premier...Les traductions en français des bibles XML.Ces articles sont des références dans leur domaine.Tout ce qu'il faut savoir pour démarrer sur un sujet XML...


Existence d'un attribut ou d'un élément en XSLT

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.


 

Mots clés.



L'histoire de XML s'écrit en ce moment même. XMLfr vous aide à la suivre et à en dégager les tendances.


Les documents publiés sur ce site le sont sous licence "Open Content"
Conception graphique
  l.henriot  

Conception, réalisation et hébergement
Questions ou commentaires
  redacteurs@xmlfr.org