使用 XSLT 设置 HTML5 doctype

如何通过 XSLT (在本例中使用 Collective xdv)将文件的 doctype 设置为 HTML5<!DOCTYPE html>

以下是我的 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">
86085 次浏览

使用 doctype-system 而不是 doctype-public

我认为目前只有将 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'>&lt;!DOCTYPE html&gt;</xsl:text>
<html>
</html>
</xsl:template>


</xsl:stylesheet>

这将产生以下结果:

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

对不起,只提供链接,但这是在 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

这种变化的 吉尔卡 · 科塞克的建议,通过 高级 XDV 主题化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>

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

出于这个原因,HTML5提供了一种替代 doctype,以便与 HTML5无意识的 XSLT 版本(即所有当前存在的 XSLT 版本)和其他存在同样问题的系统兼容。另一种 doctype 是 <!DOCTYPE html SYSTEM "about:legacy-compat">。要输出这个 doctype,在 xsl:output元素 没有上使用 doctype-public属性的属性 doctype-system="about:legacy-compat"

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

如果你想让 XHTML 输出与 HTML5保持一致,你可以使用 XHTML 1.0 Strick 作为 doctype,libxml2的 xml 序列化器有一个由 XHTML 1.0 doctype 触发的特殊输出模式,确保输出与 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>设置 doctype,不过这需要在适当的位置进行修改,因为 XDV 还不支持这一点。

事实上,似乎 <xsl:output method="html"/>也没有真正的帮助-这将导致 <br/>作为 <br></br>输出。

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

我很欣赏这可能是正确的,标准驱动的方式来完成我想要的(我已经表示反对)。但是前者不受支持(我的处理器出现故障) ,而后者在 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的严格性被列为 废弃允许的 doctype 字符串,因此使用这种 doctype 仍然称为 HTML5是完全可以接受的。

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

参考文献

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

使用 Saxon 9.4,您可以使用:

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

这就产生了:

<!DOCTYPE HTML>

这就是我用来生成兼容的 html5文档类型的方法(将 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" />

用这个标签

<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>