我如何干净地通过XSLT将文件的doctype设置为HTML5 <!DOCTYPE html>
(在这种情况下使用collective.xdv)
以下是我的Google foo能够找到的最佳内容:
<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">
答案 0 :(得分:141)
我认为目前只有将doctype写成文本才能支持:
<?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>
这将产生以下输出:
<!DOCTYPE html>
<html>
</html>
答案 1 :(得分:61)
要使用简单的HTML doctype <!DOCTYPE html>
,您必须使用disable-output-escaping
功能:<xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
。但是,disable-output-escaping
是XSLT中的可选功能,因此您的XSLT引擎或序列化管道可能不支持它。
出于这个原因,HTML5提供了另一种doctype,用于兼容HTML5-unaware XSLT版本(即所有当前存在的XSLT版本)和其他具有相同问题的系统。替代doctype是<!DOCTYPE html SYSTEM "about:legacy-compat">
。要输出此文档类型,请使用doctype-system="about:legacy-compat"
元素上的属性xsl:output
,而不使用使用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>
答案 2 :(得分:30)
<xsl:output
method="html"
doctype-system="about:legacy-compat"
encoding="UTF-8"
indent="yes" />
此输出
<!DOCTYPE html SYSTEM "about:legacy-compat">
这被修改为我对http://ukchill.com/technology/generating-html5-using-xslt/
的修正答案 3 :(得分:19)
使用Saxon 9.4,您可以使用:
<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
这会产生:
<!DOCTYPE HTML>
答案 4 :(得分:10)
使用doctype-system而不是doctype-public
答案 5 :(得分:8)
如果您希望XHTML输出与HTML5一致,必须必须使用XHTML 1.0 Strict作为doctype,libxml2的xml序列化程序具有由XHTML 1.0文档类型触发的特殊输出模式,以确保输出与XHTML兼容,(例如<br />
而非<br/>
,<div></div>
而不是<div/>
)。 doctype-system="about:legacy-compat"
不会触发此兼容模式
如果您对html输出感到满意,那么设置<xsl:output method="html">
应该做正确的事情。然后,您可以使用<xsl:text disable-output-escaping="yes"><!DOCTYPE html></xsl:text>
设置doctype,但由于XDV尚不支持,因此需要在适当的位置进行管道调整。
事实上似乎<xsl:output method="html"/>
也没有真正帮助 - 这会导致<br/>
输出为<br></br>
。
答案 6 :(得分:6)
Jirka Kosek's advice上Advanced XDV theming Plone.org的这种变体似乎对我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>
答案 7 :(得分:5)
这是一个评论,但我没有足够的业力点将它放在正确的位置。叹息。
我很欣赏这可能是正确的,标准驱动的方式来实现我想要的东西(我已经赞成它)。但前者不受支持(我的处理器失效),后者仍然在我的doctype中导致“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”。正如@Jirka Kosek所说,我认为我的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被列为obsolete permitted doctype string,因此使用此doctype并将其称为HTML5是完全可以接受的。
答案 8 :(得分:3)
很抱歉只提供链接,但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
答案 9 :(得分:2)
使用此标记
<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>
答案 10 :(得分:1)
如果保存为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>
<强>参考强>
答案 11 :(得分:1)
这就是我用来生成兼容的html5 doctype(将saxons html5输出,否则做遗留的事情)
BOOL