Establecer doctype HTML5 con XSLT

134

¿Cómo establecería limpiamente el doctype de un archivo en HTML5 a <!DOCTYPE html>través de XSLT (en este caso con collective.xdv )

Lo siguiente, que es lo mejor que mi foo de Google 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">
Jon Hadley
fuente
77
Por cierto, el uso de PUBLIC "XSLT-compat" no está actualizado. El doctype HTML5 compatible con XSLT ahora es <! DOCTYPE HTML SYSTEM "about: legacy-compat">. Ver dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci
1
Desde el último Editor WD, parece que casi cualquier tipo de documento está permitido: corto <!DOCTYPE html>, heredado <!DOCTYPE HTML SYSTEM "about:legacy-compat">y obsoleto ("no debería") HTML 4, HTML 4.01, XHTML 1.0 y XHTML 1.1 (todo DTD estricto cuando hay SISTEMA).
1
Actualice alguna respuesta a HTML5 como (hoy en día) recomendación W3C.
Peter Krauss

Respuestas:

147

Creo que esto solo se admite actualmente escribiendo el doctype 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>
Dirk Vollmar
fuente
Esta es la única forma estándar. Pero, con MSXSL, hay una forma no estándar: usar xsl: output / @ doctype-public vacío y xsl: output / @ doctype-system.
44
disable-output-escapingfue pensado por Casey
yegor256
Ya no estoy trabajando en este proyecto, por lo que no puedo probarlo, sin embargo, marco esto como la mejor respuesta en función de los votos positivos.
Jon Hadley
Uso esto todo el tiempo. Gracias.
jgroenen
Me salvó ... Gracias
cgatian
66

Para utilizar el tipo de documento HTML sencillo <!DOCTYPE html>, usted tiene que utilizar la disable-output-escapingfunción: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>. Sin embargo, disable-output-escapinges una característica opcional en XSLT, por lo que su motor XSLT o la tubería de serialización podrían no ser compatibles.

Por esta razón, HTML5 proporciona un tipo de documento alternativo para la compatibilidad con versiones XSLT que no son compatibles con HTML5 (es decir, todas las versiones actuales de XSLT) y otros sistemas que tienen el mismo problema. La alternativa doctype es <!DOCTYPE html SYSTEM "about:legacy-compat">. Para generar este tipo de documento, use el atributo doctype-system="about:legacy-compat"en el xsl:outputelemento sin usar ningún doctype-publicatributo.

<?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>
hsivonen
fuente
Aprecio que esta sea probablemente la forma correcta y basada en estándares para 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"mi doctype. Como sugirió @Jirka Kosek, creo que mi procesador XSLT podría estar roto.
Jon Hadley
1
La discusión sobre la lista de correo de Deliverance (el procesador XSLT que estoy usando) sobre este problema está aquí: coactivate.org/projects/deliverance/lists/…
Jon Hadley
1
El servicio de validación de w3c emite una advertencia cuando el documento comienza con<!DOCTYPE html SYSTEM "about:legacy-compat">
Adrian W
20

Con Saxon 9.4 puedes usar:

<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />

Esto genera:

<!DOCTYPE HTML>
stephanme
fuente
2
Desafortunadamente, es específico de Saxon. Por otro lado, es simplemente la respuesta más concisa a la P. ¿Me pregunto si esto funciona con los otros procesadores XSLT 2.0?
Paulb
Esto ya no es específico solo para Saxon, sino que también es compatible con las fuentes libxslt / xsltproc. Vea los detalles al final de stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker
10

Utilice doctype-system en lugar de doctype-public

Jirka Kosek
fuente
Eso todavía queda "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"en el doctype.
Jon Hadley
55
si <xsl: output doctype-system = "about: legacy-compat" method = "html" /> produce lo que usted dice, entonces definitivamente hay un error en su procesador XSLT que usa.
Jirka Kosek
¿Dónde se especifica este comportamiento? Esto definitivamente no funciona en JAXP XSLT.
rustyx
xml.apache.org/xalan-j este no da nada de lo que esperas, tal vez solo la edad.
PandaWood
9

Usted debe utilizar XHTML 1.0 estricto como el tipo de documento si desea que la salida XHTML compatible con HTML 5, serializador XML de libxml2 tiene un modo especial de salida provocada por el XHTML 1.0 doctypes que la producción asegura es XHTML compatibles, (por ejemplo, <br />en vez de <br/>, <div></div>en lugar de <div/>). doctype-system="about:legacy-compat"no no activar este modo de compatibilidad

Si está satisfecho con la salida html, entonces la configuración <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 necesitará conectarse en el lugar apropiado ya que XDV aún no lo admite.

De hecho, parece <xsl:output method="html"/>que tampoco ayuda realmente, esto dará como resultado la <br/>salida como <br></br>.

Laurence Rowe
fuente
6

Esta variación de los consejos de Jirka Kosek , a través de temas avanzados 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>
Jon Hadley
fuente
1
Sí, pero como he comentado en la respuesta 0xA3, los vacíos @ doctype-system o @ doctype-public no son estándar (¡además, están en contra de las especificaciones!)
5

Este es un comentario, pero no tengo suficientes puntos de karma para ponerlo en el lugar correcto. Suspiro.

Aprecio que esta sea probablemente la forma correcta y basada en estándares para 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 manera predeterminada, cuando agrega un segundo, <xsl:output doctype-system="about:legacy-compat"/>el anterior doctype-publicno se sobrescribe.

Tenga en cuenta que XHTML 1.0 estricto aparece como una cadena de doctype permitida obsoleta , por lo que es perfectamente aceptable usar este doctype y aún llamarlo HTML5.

Laurence Rowe
fuente
Si su procesador XSLT agrega elementos a sus hojas de estilo o tiene algunos valores predeterminados de atributos no estándar, eso significaría que está roto.
66
@Alejandro: XDV (ahora renombrado diazo) no es un procesador XSLT, es un tema -> compilador XSLT. Es XDV el que agrega los valores predeterminados en el XSLT compilado. Sé esto porque lo escribí;)
Laurence Rowe
3

Lamento proporcionar solo enlaces, pero esto se discutió entre el grupo WHATWG, pero han pasado muchos meses desde que lo he tratado. 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 problema real número:
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

Robar
fuente
2

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"/>
Anil Kumar Gupta
fuente
1

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

Paul Sweatte
fuente
1

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" />
Plátano Ácido
fuente