使用XSLT设置HTML5文档types

我将如何通过XSLT 干净地设置文件的文档types为HTML5 <!DOCTYPE html> (在本例中为collective.xdv )

以下是我的谷歌foo能find的最好的:

 <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 

生产:

 <!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

我认为目前只有通过将文档编写为文本来支持:

 <?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> 

这将产生以下输出:

 <!DOCTYPE html> <html> </html> 

要使用简单的HTML doctype <!DOCTYPE html> ,您必须使用disable-output-escapingfunction: <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text> 。 但是, disable-output-escaping是XSLT中的可选function ,所以XSLT引擎或序列化pipe道可能不支持它。

由于这个原因,HTML5提供了一个替代的文档types,以兼容不支持HTML5的XSLT版本(即XSLT的所有当前版本)和其他具有相同问题的系统。 替代文档types是<!DOCTYPE html SYSTEM "about:legacy-compat"> 。 要输出此doctype,请在xsl:output元素上使用属性doctype-system="about:legacy-compat"而不使用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> 
 <xsl:output method="html" doctype-system="about:legacy-compat" encoding="UTF-8" indent="yes" /> 

这个输出

 <!DOCTYPE html SYSTEM "about:legacy-compat"> 

这是修改为我的修复http://chchill.com/technology/generating-html5-using-xslt/

用撒克逊9.4你可以使用:

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

这会产生:

 <!DOCTYPE HTML> 

使用doctype-system而不是doctype-public

如果您希望XHTML输出与HTML5一致,则必须使用XHTML 1.0 Strict作为文档types,libxml2的xml序列化程序具有由XHTML 1.0 doctypes触发的特殊输出模式,以确保输出与XHTML兼容(例如<br />而不是<br/><div></div>而不是<div/> )。 doctype-system="about:legacy-compat"不会触发这个兼容模式

如果您对html输出感到满意,那么设置<xsl:output method="html">应该做正确的事情。 然后,您可以使用<xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text> ,尽pipe这将需要在适当的位置进行pipe理,因为XDV不支持然而。

事实上,似乎<xsl:output method="html"/>也没有任何帮助 – 这将导致输出为<br></br>

Jirka Kosek的build议的这种变化,通过Plone.org上的Advanced XDV主题似乎在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> 

这是一个评论,但我没有足够的业力点把它放在正确的地方。 叹。

我很欣赏这可能是正确的,标准驱动的方式来实现我想要的东西(我已经赞成这样)。 但前者不被支持(我的处理器崩溃了),而后者仍然导致我的文档types中的“ http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ”。 正如@Jirka Kosek所build议的那样,我认为我的XSLT处理器可能会被破坏。

不,您的XSLT处理器没有损坏,只是XDV增加了:

<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"/>

默认情况下,当添加第二个<xsl:output doctype-system="about:legacy-compat"/> ,以前的doctype-public不会被覆盖。

请注意,XHTML 1.0 strict被列为过时的允许的doctypestring ,因此使用此doctype并仍将其称为HTML5是完全可以接受的。

对不起,只提供链接,但这是在WHATWG小组之间讨论的,但是我已经处理了好几个月了。 Ian Hickson和一些XML专家在这里讨论这个问题:
http://lists.w3.org/Archives/Public/public-html/2009Jan/0640.html
http://markmail.org/message/64aykbbsfzlbidzl
这里是实际的问题编号:
http://www.w3.org/html/wg/tracker/issues/54
这是这个讨论
http://www.contentwithstyle.co.uk/content/xslt-and-html-5-problems

如果保存为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> 

参考

  • 多语言标记:文档types

这就是我用来生成兼容的html5文档types(获得saxons html5,否则做遗留的事情)

 <?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" />