2012-05-22 16 views
17

Estoy usando XSLT para hacer una transformación muy simple en un documento XML. Solo quiero eliminar todos los nodos de elementos con un nombre particular. Ocurre que en mi documento original todos estos nodos están ubicados al final del documento, pero después de la transformación, aunque los nodos han desaparecido como pretendía, hay muchas líneas vacías en su lugar.obtener paseo de líneas vacías después de eliminar nodos usando XSLT

Esto es estrictamente un problema cosmético ya que logré lo que quería con la transformación, pero por curiosidad: ¿cómo puedo deshacerme de estas líneas vacías? Este es el archivo XSL que he usado para la transformación (el elemento que quería eliminar es "relaciones" con nombre):

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" /> 

    <xsl:template match="*"> 
    <xsl:copy> 
     <xsl:copy-of select="@*" /> 
     <xsl:apply-templates/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="relation"/> 

</xsl:stylesheet> 

Respuesta

21

La razón está en los nodos de texto de espacio en blanco, sólo que son hermanos inmediatos a los elementos eliminados.

Solución: Basta con añadir esta instrucción XSLT para eliminar los nodos de texto de espacio en blanco de sólo - incluso antes de que se inicie la transformación:

<xsl:strip-space elements="*"/> 

El resultado puede perder muesca - si es así, añadir esto:

<xsl:output omit-xml-declaration="yes" indent="yes"/> 

La transformación completa se convierte en:

<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="*"> 
     <xsl:copy> 
      <xsl:copy-of select="@*" /> 
      <xsl:apply-templates/> 
     </xsl:copy> 
    </xsl:template> 
    <xsl:template match="relation"/> 
</xsl:stylesheet> 

cuando se aplica en este documento XML (ninguno proporcionó!):

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 

    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
    <relation/> 
</nums> 

La quería, resultado correcto (sin detrás de espacio en blanco) se produce:

<nums> 
    <num>01</num> 
    <num>02</num> 
    <num>03</num> 
    <num>04</num> 
    <num>05</num> 
    <num>06</num> 
    <num>07</num> 
    <num>08</num> 
    <num>09</num> 
    <num>10</num> 
</nums> 
+2

El único La advertencia que agregaría es: antes de agregar xsl: strip-space a su hoja de estilo, verifique que el documento fuente no contenga nodos de texto en blanco, es decir, espacios en blanco en contenido mixto. –

+1

¿Hay alguna forma de decir que quiero quitar el espacio en blanco solo a los hermanos de los nodos de "relación"? – Sergio

+1

@Sergio: Sí: use: '' –

Cuestiones relacionadas