【问题标题】:Set HTML5 doctype with XSLT使用 XSLT 设置 HTML5 文档类型
【发布时间】:2011-03-24 03:52:36
【问题描述】:

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

【问题讨论】:

  • 顺便说一下,使用 PUBLIC "XSLT-compat" 已经过时了。 XSLT 兼容的 HTML5 文档类型现在是 。见dev.w3.org/html5/spec/syntax.html#doctype-legacy-string
  • 从上一个编辑器 WD 来看,似乎几乎允许任何文档类型:短 &lt;!DOCTYPE html&gt;、旧版 &lt;!DOCTYPE HTML SYSTEM "about:legacy-compat"&gt; 和过时(“不应该”)HTML 4、HTML 4.01、XHTML 1.0 和 XHTML 1.1(有SYSTEM时都是严格的DTD)。
  • 请将 HTML5 的一些答案更新为(现在)W3C 推荐。

标签: html xslt doctype xhtml-transitional xdv


【解决方案1】:

使用这个标签

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

【讨论】:

    【解决方案2】:

    如果您希望 XHTML 输出与 HTML5 一致,您必须使用 XHTML 1.0 Strict 作为 doctype,libxml2 的 xml 序列化程序具有由 XHTML 1.0 doctypes 触发的特殊输出模式,可确保输出与 XHTML 兼容,(例如&lt;br /&gt; 而不是&lt;br/&gt;&lt;div&gt;&lt;/div&gt; 而不是&lt;div/&gt;)。 doctype-system="about:legacy-compat"不会触发此兼容模式

    如果您对 html 输出感到满意,那么设置 &lt;xsl:output method="html"&gt; 应该是正确的。然后,您可以使用&lt;xsl:text disable-output-escaping="yes"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/xsl:text&gt; 设置文档类型,但这需要在适当的位置进行设置,因为 XDV 尚不支持此功能。

    事实上,&lt;xsl:output method="html"/&gt; 似乎也没有真正的帮助 - 这将导致 &lt;br/&gt; 输出为 &lt;br&gt;&lt;/br&gt;

    【讨论】:

      【解决方案3】:

      这就是我用来生成兼容的 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" />
      

      【讨论】:

        【解决方案4】:

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

        参考文献

        【讨论】:

          【解决方案5】:

          我认为目前只有通过将 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>
          

          【讨论】:

          • 这是唯一的标准方式。但是,对于 MSXSL,有一种非标准方式:使用空 xsl:output/@doctype-public 和 xsl:output/@doctype-system。
          • disable-output-escaping 是凯西的意思
          • 我不再从事这个项目,因此无法测试 - 但是,根据投票数将其标记为最佳答案。
          • 我一直用这个。谢谢。
          • 救了我...谢谢
          【解决方案6】:

          使用 Saxon 9.4,您可以使用:

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

          这会生成:

          <!DOCTYPE HTML>
          

          【讨论】:

          • 不幸的是,它是撒克逊人特有的。另一方面,它只是对问题的最简洁的回答。我想知道这是否适用于其他 XSLT 2.0 处理器?
          • 这现在不再只特定于撒克逊人,而且在 libxslt/xsltproc 源代码中也受支持。详情见文末stackoverflow.com/questions/3387127/set-html5-doctype-with-xslt/…
          【解决方案7】:

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

          出于这个原因,HTML5 提供了一种替代文档类型,以便与不支持 HTML5 的 XSLT 版本(即所有当前存在的 XSLT 版本)和其他存在相同问题的系统兼容。替代文档类型是&lt;!DOCTYPE html SYSTEM "about:legacy-compat"&gt;。要输出此文档类型,请在 xsl:output 元素上使用属性 doctype-system="about:legacy-compat"不使用,完全使用 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>
          

          【讨论】:

          • 我很欣赏这可能是实现我想要的正确的、标准驱动的方式(我已经对此表示赞同)。但是不支持前者(我的处理器摔倒了),而后者仍然在我的文档类型中导致"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"。正如@Jirka Kosek 建议的那样,我认为我的 XSLT 处理器可能坏了。
          • Deliverance(我正在使用的 XSLT 处理器)关于这个问题的邮件列表讨论在这里:coactivate.org/projects/deliverance/lists/…
          • 当文档以 &lt;!DOCTYPE html SYSTEM "about:legacy-compat"&gt; 开头时,w3c validator service 会发出警告
          【解决方案8】:
          <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/的修复

          【讨论】:

          • 当文档以 &lt;!DOCTYPE html SYSTEM "about:legacy-compat"&gt; 开头时,w3c validator service 会发出警告
          【解决方案9】:

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

          我很欣赏这可能是实现我想要的正确的、标准驱动的方式(我已经对此表示赞同)。但是不支持前者(我的处理器摔倒了),而后者仍然导致我的文档类型中出现“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”。正如@Jirka Kosek 建议的那样,我认为我的 XSLT 处理器可能坏了。

          不,您的 XSLT 处理器没有损坏,只是 XDV 添加了:

          &lt;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"/&gt;

          默认情况下,当您添加第二个&lt;xsl:output doctype-system="about:legacy-compat"/&gt; 时,不会覆盖之前的doctype-public

          请注意,XHTML 1.0 strict 被列为obsolete permitted doctype string,因此使用此文档类型并仍将其称为 HTML5 是完全可以接受的。

          【讨论】:

          • 如果您的 XSLT 处理器将元素添加到您的样式表或具有一些非标准属性默认值,则意味着它已损坏。
          • @Alejandro:XDV(现在更名为 diazo)不是 XSLT 处理器,它是一个主题 -> XSLT 编译器。 XDV 将默认值添加到已编译的 XSLT 中。我知道这一点,因为我写了它;)
          【解决方案10】:

          很抱歉只提供链接,但这是在 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

          【讨论】:

            【解决方案11】:

            这种Jirka Kosek's advice 的变体,通过Plone.org 上的Advanced XDV theming 似乎在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>
            

            【讨论】:

            • 是的,但正如我在 0xA3 答案中评论的那样,空的 @doctype-system 或 @doctype-public 不是标准的(而且,它违反了规范!)
            【解决方案12】:

            使用 doctype-system 代替 doctype-public

            【讨论】:

            • 这仍然在文档类型中留下"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
            • 如果 产生了您所说的内容,那么您使用的 XSLT 处理器中肯定存在错误。跨度>
            • 此行为在哪里指定?这绝对不适用于 JAXP XSLT。
            • xml.apache.org/xalan-j 这个版本远不及你的期望——也许只是年龄。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-07-13
            • 1970-01-01
            • 2010-11-01
            相关资源
            最近更新 更多