2010-12-10 26 views
7

No soy un asistente de XSLT.XSLT Para eliminar nodos y nodos vacíos con -1

Tengo el XSLT actual que estoy usando para eliminar nodos vacíos:

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>"; 

Tengo que encontrar una manera de eliminar también los nodos con -1 en ellos. Un desarrollador anterior pensó que sería una buena idea hacer que cada int en el sistema sea predeterminado a -1, y eso significa que todos los campos de DB tienen -1 en lugar de nulo.

Así que por mucho que quiera vencer al caballo muerto (con palo, murciélago, bazooka), tengo que volver al trabajo y terminar esto.

Cualquier ayuda sería genial.

+0

Buena pregunta, +1. Vea mi respuesta para una definición apropiada de "nodo vacío" y para una solución completa pero muy breve. :) –

+2

Otra solución es simplemente cambiar su línea '" " 'to' "" '. – LarsH

Respuesta

12

Tengo el XSLT actual i' m utilizando para eliminar nodos vacíos:

. . . . . . . . .

Tengo que encontrar una manera de eliminar también nodos con -1 en ellos

supongo que se requiere para eliminar todos los "nodos vacíos".

El procesamiento depende de la definición de "nodo vacío". Una definición razonable en su caso es: Cualquier elemento que no tenga atributos e hijos o que no tenga atributos y solo tenga un hijo que sea un nodo de texto con el valor -1.

Para esta definición aquí es una solución simple.

Esta transformación:

<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> 

cuando se aplica en este documento XML de ejemplo:

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

produce el, resultado correcto deseada:

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

Creo que tal vez en lugar de 'y no (texto() o. = - 1)' querías 'y (no (texto()) o. = -1))' ... ¿verdad? Lo que explica por qué los nodos que contienen solo -1 aparecen en su salida. – LarsH

+0

@LarsH: Gracias por notar esto. Estaba cansado anoche al escribir la respuesta. Corregido ahora. –

5

En caso sencillo que esto debería funcionar:

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

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

Con este sencillo de entrada:

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

resultado será:

<root> 
    <node>2</node> 
    <node>8</node> 
    <node>abc</node> 
    <node>99</node> 
</root> 
Cuestiones relacionadas