使用XSLT设置HTML5 doctype

时间:2010-08-02 11:08:57

标签: html5 xslt doctype xhtml-transitional xdv

我如何干净地通过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">

12 个答案:

答案 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'>&lt;!DOCTYPE html&gt;</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">&lt;!DOCTYPE html&gt;</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">&lt;!DOCTYPE html&gt;</xsl:text>设置doctype,但由于XDV尚不支持,因此需要在适当的位置进行管道调整。

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

答案 6 :(得分:6)

Jirka Kosek's adviceAdvanced 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