html5 xslt doctype xhtml-transitional xdv

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''>&lt;!DOCTYPE html&gt;</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



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.



Para usar el tipo de documento HTML simple <!DOCTYPE html> , debe usar la función disable-output-escaping : <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</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">&lt;!DOCTYPE html&gt;</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> .