.net - form - textarea html
Usar XSLT para generar un elemento HTML textarea vacĂo (6)
Chris Ballance tuvo una respuesta que funcionó para mí. Pero vale la pena señalar que he estado usando una sobrecarga de XslCompiledTransform que da salida a una transmisión, así:
XslCompiledTransform transform = new XslCompiledTransform();
...
MemoryStream stream = new MemoryStream();
transform.Transform(reader, args, stream);
Para pasar las configuraciones correctas, tuve que usar la sobrecarga que aceptaba un XmlWriter.
// using XmlWriter so I can pass the output settings along.
XmlWriter writer = XmlWriter.Create(stream, transform.OutputSettings);
transform.Transform(reader, args, writer);
Microsoft está usando un patrón de diseño realmente extraño allí.
Al intentar dar salida a un elemento textarea vacío, el procesador .NET XSLT contrae el elemento a su forma abreviada. En lugar de esto:
<textarea id="blah" name="blah"></textarea>
Entiendo esto:
<textarea id="blah" name="blah"/>
Lo que hace que muchos navegadores web (incluyendo IE y Firefox) rendericen el resto de la página como si fuera el contenido del área de texto. Esto apesta.
Puedo forzar al procesador XSLT a generar tanto las etiquetas de texto de apertura como de cierre si coloco algo intermedio como un espacio sin interrupciones. Pero eso significa que tengo que hacer más análisis y validación en el lado del cliente para saber cuándo el área de texto está "realmente" vacía. También tengo que usar JavaScript para eliminar el espacio adicional para que los usuarios no comiencen sus comentarios con un espacio en blanco.
¿Alguien sabe de una forma de forzar al procesador XSLT a renderizar las etiquetas de apertura y cierre sin tener que insertar contenido ficticio?
Tengo que usar contenido ficticio, esta fue la plantilla xsl: que utilicé, solo con el carácter Línea de entrada dentro del área de texto.
<!-- This prevents empty textarea elements being rendered as singletons in the XHTML output by adding a newline character -->
<xsl:template name="xhtml-textarea-contents">
<!-- what should be contained in the textarea -->
<xsl:param name="contents" />
<xsl:choose>
<xsl:when test="$contents = ''''"><xsl:text>
</xsl:text></xsl:when>
<xsl:otherwise><xsl:copy-of select="$contents" /></xsl:otherwise>
</xsl:choose>
</xsl:template>
Tuve un problema similar y me di cuenta de que si configuraba ConformanceLevel de XmlWriterSettings en Fragment, eliminaba algunas de las peculiaridades de XslCompiledTransform.
FileStream xmlFileStream = File.Create("file.xml");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("transform.xsl");
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter xmlWriter = XmlWriter.Create(xmlFileStream, settings);
transform.Transform(sourceXml, null, xmlWriter);
Si está generando un xml o html, puede escribir una nueva línea dentro del área de texto y luego eliminarla con jquery.
Este es un ejemplo con jQuery:
<textarea> <textarea>
<script>
$(document).ready(function(){
$(''textarea'').each(
function(index){$(this).text('''');}
);
});
</script>
He encontrado este problema fuera de .net, que es reproducible [para mí] tanto en <xsl:output method="xml">
como en <xsl:output method="xhtml">
(estoy asumiendo que method="html"
es aplicable a nuestro escenario donde la salida tiene que estar bien formada xml)
Para evitar el colapso de la etiqueta textarea, debemos insertar algo de contenido, pero también debemos evitar manipular el contenido real . El seguimiento:
<xsl:if test="not(normalize-space())"><xsl:comment></xsl:comment></xsl:if>
produce resultados correctos (es decir, evita que el área de textarea
vacía se cierre automáticamente y no introduce contenido artificial). Creo que este comportamiento se menciona en la especificación en la construcción del nodo del infoset de validación posterior al esquema , donde los valores de cadena de los comentarios vacíos se convertirían en cadenas de longitud cero; sin embargo, el fraseo del documento también está disponible para la lectura ligera de la tarde.
Empujándolo un poco más ( si no altera el contenido, ¿realmente necesitamos xsl:if
? ), Esta es la plantilla final que impide que ciertas etiquetas colapsen (aspiro a seguir el patrón de transformación de identidad ):
<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
</xsl:copy>
</xsl:template>
<xsl:template match="textarea">
<xsl:copy>
<xsl:apply-templates select="node()|@*"/>
<xsl:comment></xsl:comment>
</xsl:copy>
</xsl:template>
NB: el comportamiento de los navegadores sugiere que esta transformación debería aplicarse también a otros elementos, como los párrafos. Sin embargo, tener un <p/>
cierre automático no es tan destructivo como tener un cierre automático <textarea/>
!