How would I cleanly set the doctype of a file to HTML5 <!DOCTYPE html>
via XSLT (in this case with collective.xdv)
The following, which is the best my Google foo has been able to find:
<xsl:output
method="html"
doctype-public="XSLT-compat"
omit-xml-declaration="yes"
encoding="UTF-8"
indent="yes" />
produces:
<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Sorry to only provide links but this was discussed among the WHATWG group but it's been many months since I've dealt with it. Here Ian Hickson and some XML experts discuss this:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
and here is the actual issue number:
http://www.w3.org/html/wg/tracker/issues/54
and here's this discussion
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems
Use doctype-system instead of doctype-public
that's what i use to generate a compatible html5 doctype (getting saxons html5 out, otherwise doing the legacy thing)
To use the simple HTML doctype
<!DOCTYPE html>
, you have to use thedisable-output-escaping
feature:<xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
. However,disable-output-escaping
is an optional feature in XSLT, so your XSLT engine or serialization pipeline might not support it.For this reason, HTML5 provides an alternative doctype for compatibility with HTML5-unaware XSLT versions (i.e. all the currently existing versions of XSLT) and other systems that have the same problem. The alternative doctype is
<!DOCTYPE html SYSTEM "about:legacy-compat">
. To output this doctype, use the attributedoctype-system="about:legacy-compat"
on thexsl:output
element without using adoctype-public
attribute at all.Use this tag
This is a comment, but I do not have enough karma points to put it in the correct place. Sigh.
No, your XSLT processor is not broken, it's just that XDV adds:
<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"/>
by default, so when you add a second
<xsl:output doctype-system="about:legacy-compat"/>
the previousdoctype-public
is not overwritten.Note that XHTML 1.0 strict is listed as an obsolete permitted doctype string, so it is perfectly acceptable to use this doctype and still call it HTML5.