使用XSLT设置HTML5文档类型


134

我将如何通过XSLT 将文件的文档类型干净地设置为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">

7
顺便说一句,使用PUBLIC“ XSLT-compat”已过时。与XSLT兼容的HTML5文档类型现在为<!DOCTYPE HTML SYSTEM“ about:legacy-compat”>。参见dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
Alohci 2010年

1
从最后一个编辑器WD看来,几乎允许使用任何文档类型:short <!DOCTYPE html>,legacy <!DOCTYPE HTML SYSTEM "about:legacy-compat">和废弃(“不应”)HTML 4,HTML 4.01,XHTML 1.0和XHTML 1.1(如果存在SYSTEM,则均为严格DTD)。

1
请更新对HTML5的一些答复,作为(当今)W3C的建议。
彼得·克劳斯

Answers:


147

我认为目前仅通过将文档类型写为文本来支持此操作:

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

这是唯一的标准方法。但是,对于MSXSL,有一种非标准的方法:使用空的xsl:output / @ doctype-public和xsl:output / @ doctype-system。

4
disable-output-escaping由Casey表示
yegor256

我不再从事此项目,因此无法测试-但是,根据投票将其标记为最佳答案。
乔恩·哈德利

我经常用这个。谢谢。
jgroenen 2012年

救了我...谢谢
cgatian

66

要使用简单的HTML文档类型<!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:outputdoctype-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>

我很欣赏这可能是正确的,由标准驱动的方式来完成我想要的事情(我对此表示赞同)。但是不支持前者(我的处理器崩溃了),而后者仍然导致"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"我的文档类型。正如@Jirka Kosek所建议的,我认为我的XSLT处理器可能坏了。
乔恩·哈德利

1
拯救关于这个问题的邮件列表讨论(我用的XSLT处理器)是在这里:coactivate.org/projects/deliverance/lists/...
乔恩·哈德利

1
W3C验证服务发出警告时,与文档开始<!DOCTYPE html SYSTEM "about:legacy-compat">
阿德里安W¯¯


20

使用Saxon 9.4,您可以使用:

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

这将产生:

<!DOCTYPE HTML>

2
不幸的是,它特定于撒克逊人。另一方面,它只是对Q的最简洁的回答。我想知道这是否可以与其他XSLT 2.0处理器一起使用吗?
Paulb 2014年

现在,这不再只是Saxon特有的,libxslt / xsltproc源中也支持。请参阅stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
sideshowbarker

10

使用doctype-system而不是doctype-public


仍然保留"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"在doctype中。
乔恩·哈德利

5
如果<xsl:output doctype-system =“ about:legacy-compat” method =“ html” />产生了您所说的内容,那么您使用的XSLT处理器肯定存在错误。
耶尔卡·科塞克

在哪里指定此行为?这在JAXP XSLT中绝对不起作用。
rustyx

xml.apache.org/xalan-j,这与您所期望的相差无几 -可能只是年龄。
PandaWood '16

9

必须使用XHTML 1.0严格的DOCTYPE如果你想与HTML5 XHTML输出一致的libxml2的XML序列化器具有通过XHTML 1.0的doctype,确保输出触发的特殊输出模式是XHTML兼容,(例如,<br />而不是<br/><div></div>而非<div/>)。doctype-system="about:legacy-compat"不会触发此兼容模式

如果您对html输出感到满意,则设置<xsl:output method="html">应该做对了。然后,您可以使用设置doctype <xsl:text disable-output-escaping="yes">&lt;!DOCTYPE html&gt;</xsl:text>,尽管这需要在适当的位置进行检查,因为XDV尚不支持此类型。

实际上,这似乎<xsl:output method="html"/>也无济于事-这将导致<br/>输出为<br></br>


6

这种变化尔卡Kosek的建议,通过先进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>

1
是的,但是正如我在0xA3答案中评论的那样,空的@ doctype-system或@ doctype-public不是标准的(也违反规范!)

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被列为废弃的允许doctype字符串,因此完全可以接受使用此doctype并仍将其称为HTML5。


如果您的XSLT处理器将元素添加到样式表中或具有一些非标准属性默认值,则意味着它已损坏。

6
@Alejandro:XDV(现在重命名为重氮)不是XSLT处理器,而是主题-> XSLT编译器。XDV将默认值添加到已编译的XSLT中。我知道这是因为我写了它;)
Laurence Rowe



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>

参考资料


1

这就是我用来生成兼容的html5 doctype的方式(将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" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.