2010-12-10 5 views
7

Je ne suis pas un assistant XSLT.XSLT Pour supprimer des nœuds et des nœuds vides avec -1

J'ai le XSLT courant que je utilise pour supprimer des nœuds vides:

string strippingStylesheet = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">" + 
       "<xsl:template match=\"@*|node()\">" + 
       "<xsl:if test=\". != ''\">" + 
       "<xsl:copy>" + 
       "<xsl:apply-templates select=\"@*|node()\"/>" + 
       "</xsl:copy>" + 
       "</xsl:if></xsl:template></xsl:stylesheet>"; 

Je dois trouver un moyen de supprimer également les noeuds avec -1 en eux. Un développeur précédent a pensé que ce serait une bonne idée de faire passer par défaut tous les int dans le système à -1, et oui cela signifie que tous les champs de la base de données ont -1 en eux au lieu de null.

Donc, autant que je veux battre le cheval mort (avec un bâton, une chauve-souris, bazooka), je dois me remettre au travail et faire ce travail.

Toute aide serait géniale.

+0

Bonne question, +1. Voir ma réponse pour une définition appropriée de "noeud vide" et pour une solution complète mais très courte. :) –

+2

Une autre solution consiste simplement à changer votre ligne '" " 'à" "" '. – LarsH

Répondre

12

J'ai le XSLT courant i » m en utilisant supprimer des nœuds vides:

. . . . . . . . .

Je dois trouver un moyen de supprimer également noeuds avec -1 dans les

Je suppose qu'il est nécessaire de supprimer tous les « noeuds vides ».

Le traitement dépend de la définition de "noeud vide". Une définition raisonnable dans votre cas est: Tout élément qui n'a pas d'attributs et enfants ou n'a pas d'attributs et a un seul enfant qui est un nœud de texte avec la valeur -1. Pour cette définition de est une solution simple.

Cette transformation:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="*[not(@*) and not(*) and (not(text()) or .=-1)]"/> 
</xsl:stylesheet> 

lorsqu'il est appliqué sur cet échantillon document XML:

<t> 
<a>-1</a> 
<a>2</a> 
<b><c/></b> 
<d>-1</d> 
<d>15</d> 
<e x="1"/> 
<f>foo</f> 
</t> 

produit le résultat souhaité, correct:

<t> 
    <a>2</a> 
    <b/> 
    <d>15</d> 
    <e x="1"/> 
    <f>foo</f> 
</t> 
+1

Je pense que peut-être à la place de 'et not (text() ou. = - 1)' vous vouliez dire 'et (not (text()) ou. = -1))' ... non? Ce qui explique pourquoi les nœuds ne contenant que -1 apparaissent dans votre sortie. – LarsH

+0

@LarsH: Merci de l'avoir remarqué. Était assez fatigué la nuit dernière en écrivant la réponse. Fixé maintenant –

5

En cas simple cela devrait fonctionner:

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

<xsl:template match="*[. = '' or . = '-1']"/> 

Avec cette entrée simple:

<root> 
    <node></node> 
    <node>-1</node> 
    <node>2</node> 
    <node>8</node> 
    <node>abc</node> 
    <node>-1</node> 
    <node></node> 
    <node>99</node> 
</root> 

Le résultat sera:

<root> 
    <node>2</node> 
    <node>8</node> 
    <node>abc</node> 
    <node>99</node> 
</root> 
Questions connexes