2010-02-26 11 views
6

Quiero imprimir mi salida xml en una sola línea [cuando se ve en el bloc de notas u otro editor de texto simple], para eliminar el espacio en blanco redundante en mi archivo xml. Entonces, ¿cuál es el mejor método a seguir para eso?¿Cuál es el mejor enfoque para eliminar el espacio en blanco redundante en XML [strip-space o indent = "no"]?

Creo que hay dos opciones,
1) Para utilizar

<xsl:output method="xml" indent="no"/> 

2) o de utilizar

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

que es más eficiente, y por qué?
algunas personas sugieren que use indent="no",

creía que tira del espacio es el más adecuado, pero no está seguro debido a las sugerencias dadas por los demás.

Para ser más elaborada me dejó tomar un ejemplo: XML
de entrada:

<root> 
<node> 
    <child1/> 
    <child2/> 
</node> 
</root> 

y la salida requerida es:

<root><node><child1/><child2/></node></root> 
+0

Buena pregunta. +1 de mi parte En mi respuesta traté de explicar completamente el efecto de las dos directivas y cómo interactúan. –

Respuesta

10

Con el fin de eliminar cualquier cosa que se parece a "sangría", puede ser necesario (eso significa que hay casos cuando se necesita) para utilizar tanto <xsl:strip-space> y `` guión = "no" `.

Tome el ejemplo más simple: tiene la transformación de identidad. Sin ninguno de los dos métodos especificados, la transformación reproducirá los nodos de texto de espacio en blanco del documento XML de origen. Es decir, si el documento XML de origen está sangrado, la transformación también producirá un resultado sangrado.

Ahora, agréguense a esta transformación <xsl:output indent="no" />. Esto indica al procesador XSLT que no realice su propia "impresión bonita". Sin embargo, los nodos de solo espacio en blanco del documento XML de origen todavía se copian en el resultado y el documento resultante parece sangrado (porque el documento fuente está sangrado).

Ahora, como último paso, agregue <xsl:strip-space elements="*"/>. Ha especificado ambos métodos para evitar nodos de espacio en blanco en la salida. ¿Lo que pasa?El procesador XSLT, y no procesa ningún nodo de espacio en blanco. No aplica sangría a la salida; obtienes la salida de una línea deseada.

Finalmente, realice una regresión, cambie <xsl:output indent="no" /> a <xsl:output indent="yes" />. El <xsl:strip-space elements="*"/> todavía está allí, por lo que no se reproducen nodos de espacio en blanco en la salida. Pero el procesador XSLT obedece a la directiva <xsl:output indent="yes" /> y agrega nodos de texto solo de espacio en blanco.

Así, a partir de las cuatro combinaciones posibles, únicamente especificando ambos<xsl:strip-space elements="*"/> y <xsl:output indent="no" /> garantiza que sin sangría será causada ya sea desde los nodos de espacio en blanco sólo desde el documento XML de origen o de la iniciativa procesadores XSLT.

Incluso este último caso, por supuesto, no garantiza por completo que la salida no será sangría - si el programador XSLT pone intencionadamente hay código de sangrado suficiente

<xsl:text>

</xsl:text>

la salida contendrá esta sangría.

+0

Gracias por la explicación detallada :-) –

2

diferencias Perfomance se miden mejor. Las implementaciones del procesador XSLT difieren, y usted debe realizar la prueba por su cuenta (aunque sospecho que preocuparse por el rendimiento de uno u otro podría caer en la categoría de "optimización prematura" en este caso).

<xsl:output indent="no" /> podría no tener el efecto deseado si no van acompañados por

<xsl:template match="text(normalize-space()='')" /> 

porque si no se eliminan los nodos de espacio en blanco (las que entre sus etiquetas), entonces van a aparecer en la salida, en algún momento, independientemente de la configuración de "salida".

+0

Disculpa el comentario anterior - Todavía tenía sueño - por favor, bórralo. ¿Por qué codificaría la plantilla, cuando signifique lo mismo que ''? –

+0

@Dimitre: Lo quise decir solamente en conjunción con '', porque 'indent =" no "' no sería suficiente sin ningún manejo explícito de espacios en blanco. P.S .: El único que puede eliminar sus comentarios es usted mismo. :-) (Lo sé, esto ha sido diferente en una versión anterior del sitio) – Tomalak

Cuestiones relacionadas