Bonjour,

Suite à la discussion que j'avais ouverte pour identifier les nœuds vides d'un fichier XML : http://www.developpez.net/forums/d14...-noeuds-vides/
J'ai une nouvelle question :

Il me faudrait supprimer les nœuds vides d'un fichier XML, mais pas les nœuds vides ayant des attributs.

Exemple :

Voici le xml en entrée :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <tag1>
        un peu de texte
     </tag1>
     <tag2>
        encore du texte
     </tag2>
     <tag3>
        <tag3child1>test</tag3child1>
	<tag3child2 attribut1="test"/>
	<tag3child3/>
     </tag3>
</root>
Et le résultat attendu serait donc que <tag3child3> disparaisse :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <tag1>
        un peu de texte
     </tag1>
     <tag2>
        encore du texte
     </tag2>
     <tag3>
        <tag3child1>test</tag3child1>
	<tag3child2 attribut1="test"/>
     </tag3>
</root>
J'utilise le script XSLT suivant, en rajoutant dans ma condition le fait qu'il recherche les nœuds vides qui n'ont pas d'attributs.
J'essaie avec ceci : and @*= '' mais apparemment ce n'est pas la bonne solution / syntaxe.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 
 
<!--							-->
<!-- Remove elements if empty	-->
<!--							-->
<xsl:template match="@*|node()">
	<xsl:copy>
		<xsl:apply-templates select="@*|node()"/>
	</xsl:copy>
</xsl:template>
 
<xsl:template match="tag3child1|tag3child2|tag3child3">
	<xsl:if test="normalize-space(string(.)) != '' and @* != ''">
		<xsl:copy>
			<xsl:apply-templates select="@*|node()"/>
		</xsl:copy>
	</xsl:if>
</xsl:template>
 
</xsl:stylesheet>
Ce n'est pas ce que j'espérais puisque j'obtiens le résultat suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="UTF-8"?>
<root>
     <tag1>
        un peu de texte
     </tag1>
     <tag2>
        encore du texte
     </tag2>
     <tag3>
     <!-- tag3 est complètement vide -->
     </tag3>
</root>
Le tag 3 est complètement vide, j'avoue que mes recherches se sont révélées plutôt infructueuses.
Un peu d'aide, ou une piste serait la bienvenue

D'avance merci