Establecer doctype HTML5 con XSLT
xhtml-transitional xdv (12)
Con Saxon 9.4 puedes usar:
<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
Esto genera:
<!DOCTYPE HTML>
¿Cómo puedo establecer claramente el doctype de un archivo en HTML5 <!DOCTYPE html>
través de XSLT (en este caso con collective.xdv )
Lo siguiente, que es lo mejor que mi Google foo ha podido encontrar:
<xsl:output
method="html"
doctype-public="XSLT-compat"
omit-xml-declaration="yes"
encoding="UTF-8"
indent="yes" />
produce:
<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Creo que esto solo se admite actualmente escribiendo el tipo de documento como texto:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="utf-8" indent="yes" />
<xsl:template match="/">
<xsl:text disable-output-escaping=''yes''><!DOCTYPE html></xsl:text>
<html>
</html>
</xsl:template>
</xsl:stylesheet>
Esto producirá el siguiente resultado:
<!DOCTYPE html>
<html>
</html>
El siguiente código funcionará como una plantilla independiente si se guarda como html5.xml
:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="html5.xml"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"
>
<xsl:output method="xml" encoding="utf-8" version="" indent="yes" standalone="no" media-type="text/html" omit-xml-declaration="no" doctype-system="about:legacy-compat" />
<xsl:template match="xsl:stylesheet">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<xsl:text>hi</xsl:text>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
Referencias
Esta variación del consejo de Jirka Kosek , a través de la tematización avanzada de XDV en Plone.org parece funcionar para mí en collective.xdv .
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output
doctype-public="HTML"
doctype-system=""/>
</xsl:stylesheet>
Este es un comentario, pero no tengo suficientes puntos de karma para ponerlo en el lugar correcto. Suspiro.
Aprecio que esta es probablemente la manera correcta y estandarizada de lograr lo que quiero (lo he votado como tal). Pero el primero no es compatible (mi procesador se cae) y el último todavía da como resultado " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " en mi doctype. Como sugirió @Jirka Kosek, creo que mi procesador XSLT podría estar roto.
No, su procesador XSLT no está roto, es solo que XDV agrega:
<xsl:output method="xml" indent="no" omit-xml-declaration="yes" media-type="text/html" encoding="utf-8" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"/>
de forma predeterminada, así que cuando agrega un segundo <xsl:output doctype-system="about:legacy-compat"/>
no se sobrescribe el doctype-public
anterior.
Tenga en cuenta que XHTML 1.0 strict figura como una cadena doctype obsoleta permitida , por lo que es perfectamente aceptable utilizar este tipo de documento y aún así llamarlo HTML5.
Lamento solo proporcionar enlaces, pero esto fue discutido en el grupo WHATWG, pero pasaron muchos meses desde que resolví el problema. Aquí Ian Hickson y algunos expertos en XML discuten esto:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
y aquí está el número del problema real:
http://www.w3.org/html/wg/tracker/issues/54
y aquí está esta discusión
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems
Para usar el tipo de documento HTML simple <!DOCTYPE html>
, debe usar la función disable-output-escaping
: <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
. Sin embargo, disable-output-escaping
es una característica opcional en XSLT, por lo que su motor XSLT o canalización de serialización podría no ser compatible.
Por esta razón, HTML5 proporciona un tipo de documento alternativo para la compatibilidad con las versiones XSLT que no son conscientes de HTML5 (es decir, todas las versiones actuales de XSLT) y otros sistemas que tienen el mismo problema. El doctype alternativo es <!DOCTYPE html SYSTEM "about:legacy-compat">
. Para enviar este tipo de documento, use el atributo doctype-system="about:legacy-compat"
en el elemento xsl:output
sin usar doctype-public
atributo doctype-public
.
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" doctype-system="about:legacy-compat"/>
...
<html>
</html>
</xsl:stylesheet>
Usa esta etiqueta
<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>
Use doctype-system en lugar de doctype-public
eso es lo que uso para generar un doctype html5 compatible (sacar saxons html5, de lo contrario, hacer lo heredado)
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/REC-html40">
<xsl:output
method="html"
version="5.0"
doctype-system="about:legacy-compat"
encoding="UTF-8"
indent="yes" />
Debe usar XHTML 1.0 Strict como doctype si desea que el resultado XHTML sea consistente con HTML5, el serializador xml de libxml2 tiene un modo de salida especial activado por los doctypes XHTML 1.0 que asegura que el resultado sea compatible con XHTML (por ejemplo <br />
lugar de <br/>
, <div></div>
lugar de <div/>
). doctype-system="about:legacy-compat"
no activa este modo de compatibilidad
Si está contento con la salida html, entonces establecer <xsl:output method="html">
debería hacer lo correcto. Luego puede configurar el doctype con <xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
, aunque esto requerirá la instalación de plomería en el lugar apropiado ya que XDV no es compatible con este todavía.
De hecho, parece que <xsl:output method="html"/>
realidad tampoco ayuda; esto dará como resultado que <br/>
salga como <br></br>
.
<xsl:output
method="html"
doctype-system="about:legacy-compat"
encoding="UTF-8"
indent="yes" />
esta salida
<!DOCTYPE html SYSTEM "about:legacy-compat">
esto se modifica como mi solución para http://ukchill.com/technology/generating-html5-using-xslt/