141

我如何通过 XSLT将文件的 doctype干净地<!DOCTYPE html>设置为 HTML5 (在本例中为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">
4

12 回答 12

154

我认为目前仅通过将 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>
于 2010-08-02T12:05:29.353 回答
66

要使用简单的 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 提供了一种替代文档类型,以与不支持 HTML5 的 XSLT 版本(即所有当前存在的 XSLT 版本)和其他具有相同问题的系统兼容。替代文档类型是<!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>
于 2010-08-04T11:09:04.497 回答
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/的修复

于 2012-05-06T07:24:10.557 回答
20

使用 Saxon 9.4,您可以使用:

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

这会产生:

<!DOCTYPE HTML>
于 2013-10-15T10:54:26.680 回答
10

使用 doctype-system 代替 doctype-public

于 2010-08-02T12:01:55.693 回答
10

如果您希望 XHTML 输出与 HTML5 一致,则必须使用 XHTML 1.0 Strict 作为 doctype,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>,尽管这需要在适当的位置进行检查,因为 XDV 尚不支持此功能。

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

于 2010-08-04T14:09:12.297 回答
6

通过Plone.org上的Advanced XDV 主题, Jirka Kosek 的建议的这种变体似乎在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>
于 2010-08-02T13:42:08.337 回答
5

这是一条评论,但我没有足够的业力点将其放在正确的位置。叹。

我很欣赏这可能是实现我想要的正确的、标准驱动的方式(我对此表示赞同)。但不支持前者(我的处理器摔倒了),而后者仍然导致我的文档类型中出现“ 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 被列为过时的允许文档类型字符串,因此使用此文档类型并仍将其称为 HTML5 是完全可以接受的。

于 2010-08-04T14:18:20.610 回答
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

于 2010-08-02T12:15:44.027 回答
2

使用这个标签

<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>
于 2018-02-12T09:40:27.437 回答
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>

参考

于 2012-01-05T23:09:20.793 回答
1

这就是我用来生成兼容的 html5 doctype 的东西(让撒克逊人 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" />
于 2016-10-16T00:46:55.840 回答