使用XSLT设置HTML5 doctype

Jon*_*ley 133 xslt html5 doctype xhtml-transitional xdv

如何通过XSLT 将文件的doctype 干净地设置为HTML5 <!DOCTYPE html>(在本例中为collective.xdv)

以下是我最好的谷歌foo能够找到的:

<xsl:output
    method="html"
    doctype-public="XSLT-compat"
    omit-xml-declaration="yes"
    encoding="UTF-8"
    indent="yes" />
Run Code Online (Sandbox Code Playgroud)

生产:

<!DOCTYPE html PUBLIC "XSLT-compat" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Run Code Online (Sandbox Code Playgroud)

Dir*_*mar 147

我认为目前只有将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>
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出:

<!DOCTYPE html>
<html>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 这在FireFox中不起作用,不支持dso (5认同)
  • "禁用 - 输出 - 逃避"是凯西的意思 (4认同)

hsi*_*nen 65

要使用简单的HTML文档类型<!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,请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>
Run Code Online (Sandbox Code Playgroud)


Jim*_*els 30

<xsl:output
     method="html"
     doctype-system="about:legacy-compat"
     encoding="UTF-8"
     indent="yes" />
Run Code Online (Sandbox Code Playgroud)

这个输出

<!DOCTYPE html SYSTEM "about:legacy-compat">
Run Code Online (Sandbox Code Playgroud)

这被修改为我对http://ukchill.com/technology/generating-html5-using-xslt/的修复


小智 19

使用Saxon 9.4,您可以使用:

<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
Run Code Online (Sandbox Code Playgroud)

这会产生:

<!DOCTYPE HTML>
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这是撒克逊人特有的.另一方面,它只是Q的最简洁的答案.我想知道这是否适用于其他XSLT 2.0处理器? (2认同)

Jir*_*sek 10

使用doctype-system而不是doctype-public

  • 如果<xsl:output doctype-system ="about:legacy-compat"method ="html"/>产生你说的话,那么你使用的XSLT处理器肯定存在错误. (5认同)

Lau*_*owe 8

必须,如果你想用HTML5 XHTML输出一致的使用XHTML 1.0严格的DOCTYPE,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>.


Jon*_*ley 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>
Run Code Online (Sandbox Code Playgroud)


Lau*_*owe 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是完全可以接受的.

  • @Alejandro:XDV(现在改名为diazo)不是XSLT处理器,它是一个主题 - > XSLT编译器.它是XDV,它将默认值添加到已编译的XSLT中.我知道这是因为我写了它;) (6认同)