2010-11-29 12 views
5

Estoy intentando generar un fragmento de código html. Pero necesito que sea bastante impreso/sangrado. ¿Hay alguna manera de hacerlo sin usar <xsl:text>&#xa;</xsl:text> y <xsl:text>&#9;</xsl:text>?Cómo formatear/sangrar salida de una Transformación XSL

He utilizado la siguiente línea sin ningún resultado.

<xsl:output method="html" indent="yes"/> 

Follwoing es el código C#;

XslCompiledTransform XSLT = new XslCompiledTransform(); 
    XSLT.Load(xslPath); 

    using (XmlTextWriter writer = new XmlTextWriter(writePath, null)) 
    { 
     if (isTopLevel) 
     { 
      XSLT.Transform(XMLDocumentForCurrentUser, writer); 
     } 
     else 
     { 
      XsltArgumentList xslArg = new XsltArgumentList(); 
      xslArg.AddParam("MenuIndex", "", menuIndex); 
      XSLT.Transform(XMLDocumentForCurrentUser, xslArg, writer); 
     } 
    } 
// I write the output to file 
//All this works fine, only now I need the HTML to be readable (in the browser's view source or any notepad) 

¿Alguien sabe de una forma de formatear (al menos sangría) salida XSLT?

+0

@conqenator: Si no desea utilizar el parámetro de serialización 'xsl: output/@ indent' (tal vez porque no es bueno como en MSXSL) y no desea hacerlo manualmente, entonces no hay solución en el alcance de XSLT, pero debido a que pone tales restricciones. –

+0

¿Por qué votar abajo? –

+1

Deberá proporcionar más información para que podamos entender por qué indent = "yes" no funciona para usted. Entonces, ¿cuál es su procesador XSLT, cómo se ejecuta exactamente la transformación, a qué se transforma exactamente (por ejemplo, un archivo?), ¿Cómo se ve el resultado de la transformación? –

Respuesta

6

No cree su propio XmlTextWriter si desea que el procesador XSLT aplique la directiva xsl: output. En su lugar, ya sea escribir directamente a un archivo o crear una XmlWriter de la siguiente manera:

maneras
using (XmlWriter result = XmlWriter.Create(writePath, XSLT.OutputSettings)) 
{ 
     if (isTopLevel) 
     { 
      XSLT.Transform(XMLDocumentForCurrentUser, result); 
     } 
     else 
     { 
      XsltArgumentList xslArg = new XsltArgumentList(); 
      xslArg.AddParam("MenuIndex", "", menuIndex); 
      XSLT.Transform(XMLDocumentForCurrentUser, xslArg, result); 
     } 
} 
+1

+1 Para la respuesta correcta, además de la explicación faltante: La transformación está serializando correctamente el resultado de la salida, pero la clase XmlWriter está eliminando el espacio en blanco solo nodo de texto de forma predeterminada; necesita desactivar este comportamiento por un parámetro a la clase XmlWriter. –

+0

¡Funcionó impecablemente! ¡Gracias! –

+0

¡Gracias! Estaba en el límite de mi ingenio tratando de descubrir por qué la salida no está indentada y esto lo solucionó. – EM0

3

Se conocen para impresión bonita, además de <xsl:output indent="yes"/>.

Un buen lugar para buscar es Dave Pawson's XSLT FAQ: http://www.dpawson.co.uk/xsl/sect2/pretty.html

También puede estar interesado en tener un vistazo al código de la XPath Visualizer.

+0

OP decir que los parámetros de serialización de salida no funcionan con su procesador XSLT y no quieren usar una ideación manual. –

+0

En realidad me preguntaba (y esperaba que estuvieras cerca) al publicar esta pregunta. :) Sí, ya descargué el visualizador Xpath hace unos días. Gracias por los enlaces. –

+0

@Alejandro: Esto puede ser un problema en una multitud de casos. La forma confiable de impresión bonita, especialmente cuando la transformación se va a ejecutar con diferentes procesadores XSLT, no es confiar en los parámetros de sangría sino en bricolaje –

Cuestiones relacionadas