tag - script type= text/javascript src=
La etiqueta de final de script explĂcita siempre se convierte en autocierre (11)
¿Y esto va en contra del motor XSLT de MS, por supuesto? Que extraño. No puedo decir que he encontrado esto en .NET 1.1 o 2.0 y tengo una serie de transformaciones que hacen exactamente lo mismo, por lo que le sugiero que vaya con la solución simple.
Estoy usando xslt para transformar xml en un archivo aspx. En xslt, tengo una etiqueta de script para incluir un archivo jquery.js. Para que funcione con IE, la etiqueta del script debe tener una etiqueta de cierre explícita. Por alguna razón, esto no funciona con xslt a continuación.
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
xmlns:asp="remove">
<xsl:output method="html"/>
<xsl:template match="/">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>TEST</title>
<script type="text/javascript" src="jquery-1.2.6.js"></script>
Pero si cambio la etiqueta del script como se muestra a continuación, funciona.
<script type="text/javascript" src="jquery-1.2.6.js">
// <![CDATA[ // ]]>
</script>
Pensé que el <xsl:output method="html" />
haría el truco, pero parece que no funciona?
/ Jonas
Este es un problema bastante común cuando se genera HTML desde XSLT. Sospecho que la raíz del problema es que el XSLT en sí mismo es un documento XML. Aunque empiece con su programa XSLT como XML serializado, para cuando lo reciba el procesador XSLT, ya se ha deserializado a una representación de "infoset". En un nivel XML, una etiqueta vacía y una autocompletada son equivalentes; el elemento simplemente no tiene hijos. Esto significa que su procesador XSLT probablemente nunca verá una versión del programa donde el elemento del script tenga una etiqueta de apertura y cierre.
Usualmente lo soluciono usando un espacio no disruptivo convenientemente escapado. En cualquier caso, debes poner algo dentro de la etiqueta del script.
Por cierto, esto no se trata de hacer feliz a IE. Si mira las especificaciones de HTML , encontrará que se requiere la etiqueta de finalización. Estoy seguro de que a algunas personas les parecerá irónico que IE lo implemente correctamente. :-)
Si está creando el XmlWriter usted mismo, necesita pasar el OutputSettings de la transformación al XmlWriter, por ejemplo:
XmlDocument doc = new XmlDocument();
doc.LoadXml("<book><author>Trudi Canavan</author><title>Voice of the Gods</title></book>");
XslCompiledTransform transform = new XslCompiledTransform();
transform.Load("XSLTFile1.xslt");
StringBuilder output = new StringBuilder();
// Here we pass the output setting to the writer, otherwise the transform
// may be set to Html, but the XmlWriter will be outputting Xml
XmlWriter writer = XmlWriter.Create(output, transform.OutputSettings);
transform.Transform(doc, writer);
Console.WriteLine(output.ToString());
Console.ReadKey();
Esto es por diseño y la única solución que conozco es usar un XmlTextWriter
personalizado:
public class HtmlTextWriter : XmlTextWriter
{
private readonly string[] fullEndElements =
new string[] { "script", "title" };
private string lastStartElement = null;
public HtmlTextWriter(TextWriter textWriter)
: base(textWriter)
{
}
public HtmlTextWriter(string filename, Encoding encoding)
: base(filename, encoding)
{
}
public HtmlTextWriter(Stream w, Encoding encoding)
: base(stream, encoding)
{
}
public override void WriteStartElement(string prefix, string localName, string ns)
{
lastStartElement = localName;
base.WriteStartElement(prefix, localName, ns);
}
public override void WriteEndElement()
{
if (Array.IndexOf(fullEndElements, lastStartElement) > -1)
{
base.WriteFullEndElement();
}
else
{
base.WriteEndElement();
}
}
}
La respuesta de Bart van Delfts me apuntó en la dirección correcta con esta, ¡así que aplaudimos por la pista!
Estaba teniendo este problema también con [ javax.xml.transform.Transformer ]. Siempre que traté de analizar un fragmento de html formateado, en mi caso:
<textarea></textarea>
el resultado final del nodo se trajo a mi jsp como:
<textarea/>
que obviamente estaba enganchando cualquier código siguiente, debido a que se ve como más contenido del elemento textarea.
estableciendo t.setOutputProperty(javax.xml.transform.OutputKeys.METHOD, "html");
parece haber proporcionado el comportamiento de cierre automático que esperaba. Esta propiedad tiene como valor predeterminado "xml" de mi propia prueba, por lo que obviamente una etiqueta xml sin nodos debajo es perfectamente feliz como cierre automático.
Espero que esto ayude de todos modos.
Encontré esta respuesta en el sitio del foro de MSDN:
<xsl:value-of select="'' ''"/>
Si agrega el código xslt anterior antes de su finalización en el archivo xsl, fuerza al elemento a tener algún contenido (espacio en este caso) en lugar de autorrellenarse. Lo intenté y funcionó.
Esto es lo que creó:
<script...> </script>
en lugar de
<script ... />.
considera este ejemplo,
<Discount>
<!--<xsl:if test="Discount>0">-->
<xsl:value-of select="Discount"/>
<!--</xsl:if>-->
</Discount>
Si estoy trabajando con descuento para un producto. y lo estoy verificando antes de su uso. devolverá la salida de,
<Discount>value of the discount</Discount>
Pero si desactivo el ejemplo anterior así,
<Discount>
<xsl:if test="Discount>0">
<xsl:value-of select="Discount"/>
</xsl:if>
</Discount>
devolverá el o / p después de xslt como (si el descuento es> 0),
<Discount/>
Para aquellos de ustedes que usan Xalan 2.7.0 (en Java), tuve el mismo problema. Adopté el archivo org / apache / xml / serializer / ToStream.java en el código fuente original para evitar este problema. Si especifica como propiedad de salida:
private static Properties XHTML() {
Properties p = new Properties();
p.setProperty(OutputKeys.METHOD, "xhtml");
p.setProperty(OutputKeys.DOCTYPE_PUBLIC,
"-//W3C//DTD XHTML 1.0 Strict//EN");
p.setProperty(OutputKeys.DOCTYPE_SYSTEM,
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd");
p.setProperty(OutputKeys.ENCODING, "UTF-8");
p.setProperty("{http://xml.apache.org/xalan}indent-amount", "4");
p.setProperty(OutputKeys.INDENT, "yes");
p.setProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
p.setProperty("{http://example.com}selfclosing","no");
return p;
}
Tenga en cuenta la última línea de selfclosing
. Esta es una propiedad a la que se responde en esta versión renovada de ToStream.java y evitará las <div />
y <script />
y las etiquetas de salida <div></div>
y <script></script>
lugar. También incluye excepciones a esto, es decir, las que se especifican en el estándar HTML como autorrellenadas (es decir, "área", "base", "basefont", "br", "col", "fotograma", "hora"). "," img "," entrada "," enlace "," meta "," param "). Me funcionó al menos, y ahora las páginas web también están bien en IE.
El nuevo archivo ToStream.java se puede encontrar en http://bvandelft.ruhosting.nl/ToStream.java y una versión precompilada de serializer.jar (trabajando con 2.7) también está disponible en la misma URL pero serializer.jar (en el que se incluye la versión compilada de ToStream) no se le permitió publicar más de 1 URL :-p
Usé un comentario antes de la etiqueta del final del script para resolver este problema.
Como se mencionó, hay trucos para poner un contenido invisible en el elemento, pero en xslt siempre se puede generar una salida precisa como un texto:
<xsl:text disable-output-escaping="yes">
<script src="jquery-2.0.3.js"></script>
</xsl:text>
Por cierto. Creo que el método = "html" también debería funcionar, pero no renderizará xhtml así, por ejemplo br no se cerrará.
Otro truco rápido es agregar un comentario de Javascript dentro de la etiqueta:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">//</script>
Esto solo agregará un comentario al final del guión; sin embargo, tenga cuidado de no comentar nada por error.