2011-08-22 12 views
6

Estoy usando XslCompiledTransform para convertir un archivo XML a HTML. ¿Hay alguna manera de evitar que use etiquetas de cierre automático?Evite que XslCompiledTransform use etiquetas de cierre automático

p. Ej.

<span></span> <!-- I want this even if content empty --> 
<span/> <!-- stop doing this! -> 

Las etiquetas de cierre automático sobre la esperanza de están ensuciando mi documento independientemente del navegador que uso, aunque es XML válido, es sólo que 'lapso' no se le permite tener etiquetas de cierre automático.

¿Existe alguna configuración que pueda poner en mi xsl o en mi código C# .Net para evitar que se usen etiquetas de cierre automático?

+0

Un lapso sin atributos o contenido debe ser completamente invisible. ¿Envolvería su extensión en un bloque xsl: if para verificar que el contenido le funcione? –

+0

El término correcto es etiquetas de cierre automático. –

+0

Buena pregunta, +1. Ver mi respuesta para dos soluciones alternativas. –

Respuesta

0

Usted puede intentar <xsl:output method="html"/>, documento XML sin embargo estaría bien formada ya no es el resultado.

O bien, puede invocar el método XslCompiledTransform.Transform() pasar como uno de los parámetros de su propio XmlWriter. En su implementación, usted tiene el control total y puede implementar cualquier serialización requerida del árbol de resultados.

+1

Esto todavía genera el inválido , incluso con el método de salida = "html". – Sheamus

+0

@Sheamus: Entonces definitivamente debe modificar la configuración de su XmlWriter y/o escribir su clase implementando XmlWriter, como lo recomendé en mi respuesta. –

0

En su XSLT use <xsl:output method="html"/> y luego asegúrese de que los elementos de resultado HTML que crea su hoja de estilo no están en ningún espacio de nombres. Además, dependiendo de cómo uses XslCompiledTransform en tu código C#, debes asegurarte de que se cumplan las configuraciones xsl:output en la hoja de estilo. Puede lograrlo fácilmente mediante la transformación a un archivo o secuencia o TextWriter, en ese caso no tiene que hacer nada. Sin embargo, si por algún motivo se transforma en un XmlWriter, debe asegurarse de que se haya creado con la configuración adecuada, p.

XslCompiledTransform proc = new XslCompiledTransform(); 
proc.Load("sheet.xsl"); 

using (XmlWriter xw = XmlWriter.Create("result.html", proc.OutputSettings)) 
{ 
    proc.Transform("input.xml", null, xw); 
} 

Pero por lo general que debe estar bien simplemente transformando a un arroyo o TextWriter, en ese caso no hay nada en el código C# tiene que hacer para cumplir con el método de salida de la hoja de estilo.

+2

todavía se genera. – Sheamus

0

La única solución que he podido encontrar es agregar lógica al archivo XSL. Básicamente, si los elementos que quería abarcar están vacíos, no use el elemento span en absoluto.

<xsl:if test="count(jar/beans) > 0"> 
    <xsl:apply-templates select="jar/beans"/> 
</xsl:if> 

No es ideal para tener que insertar esto en todas partes en mi archivo XSL, para compensar el hecho de que a pesar de que elegir el método de salida "html", más que de buen grado generará HTML ilegal.

suspiro.

1

Aunque no pude clasificar esto como una solución directa (ya que no emite un elemento vacío), la solución que utilicé fue poner un espacio (usando xsl: text) en el elemento, ya que esto es Marcado HTML, y si está activando el modo Estándares (no peculiaridades), el espacio extra no cambia el contenido procesado. Tampoco tenía control sobre la invocación del objeto de transformación.

<div class="clearBoth"><xsl:text> </xsl:text></div> 
Cuestiones relacionadas