2009-12-15 3 views
2

Essayer quelque chose de farfelu en nettoyant du XML détaillé, c'est-à-dire supprimer tous les nœuds vides de manière récursive. A cet effet, je considère qu'un nœud est "vide" s'il a (a) pas de nœuds enfants, (b) un contenu uniquement blanc, (c) uniquement des nœuds enfants "vides". C'est, je considère ce qui suit pour être « vide » parce que toutes les feuilles sont vides/espaces blancs uniquement nœuds:XSL Ignorer les enfants vides de façon récursive

<foo> 
    <bar> 
    <baz/> 
    </bar> 
    <quux> </quux> 
</foo> 

J'ai essayé d'utiliser <xsl:if test="child::node()"> dans mes modèles, mais cela ne semble pas fonctionner. Il est tout à fait possible que la réponse soit "marchez l'arbre vous-même, idiot", mais il semble que le genre de chose que XSL devrait être capable de faire?

Je me attends

<foo> 
    <bar> 
    <baz/> 
    </bar> 
    <quux> </quux> 
    <quuux>Actual content</quuux> 
</foo> 

revenir comme

<foo> 
    <quuux>Actual content</quuux> 
</foo> 

avec ce filtre je pense.

Répondre

5

La raison pour laquelle child::node() ne fonctionnait pas pour vous était que vous y avez des nœuds enfants - ce sont des nœuds de texte d'espaces. Au lieu de cela, essayez quelque chose comme normalize-space() != ''. Vous ne voulez probablement pas if il, que ce soit - mettre en place match:

<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[normalize-space() = '']"/> 
+0

+1. P.S .: Voir la réponse de @ santiiiii, il souligne validement quelques problèmes mineurs dans le vôtre. – Tomalak

+0

Corrigé en conséquence. –

+0

Merci. Ceci, avec la correction de Santiiii, est ce que je voulais. – UltraNurd

4

réponse de Pavel est correcte. Deux petites erreurs cependant: vous devez fermer le noeud xsl:copy, et apply:templates utilise select au lieu de match. Ce serait la version finale:

<xsl:template match="node() | @*"> 
    <xsl:copy> 
    <xsl:apply-templates select="node() | @*"/> 
    </xsl:copy> 
</xsl:template> 

<xsl:template match="*[normalize-space() = '']"/> 
Questions connexes