Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XSLT设置HTML5 doctype_Html_Xslt_Doctype_Xhtml Transitional_Xdv - Fatal编程技术网

使用XSLT设置HTML5 doctype

使用XSLT设置HTML5 doctype,html,xslt,doctype,xhtml-transitional,xdv,Html,Xslt,Doctype,Xhtml Transitional,Xdv,如何通过XSLT(在本例中使用)将文件的doctype干净地设置为HTML5 以下是我的Google foo能够找到的最好的内容: <xsl:output method="html" doctype-public="XSLT-compat" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" /> 产生: <!DOCTYPE html PUBLIC "XSLT-compa

如何通过XSLT(在本例中使用)将文件的doctype干净地设置为HTML5

以下是我的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">


使用doctype system而不是doctype public

我认为目前只支持将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
这将产生以下输出:

<!DOCTYPE html>
<html>
</html>

很抱歉,我只提供了链接,但WHATWG小组对此进行了讨论,但我已经讨论了好几个月了。这里,Ian Hickson和一些XML专家讨论了这一点:


这是实际发行编号:

下面是这个讨论

via on的这一变体似乎对我的工作很有帮助



要使用简单的HTML doctype
,必须使用
禁用输出转义功能:
!DOCTYPE html
。但是,
禁用输出转义
是XSLT中的可选功能,因此您的XSLT引擎或序列化管道可能不支持它

因此,HTML5提供了另一种doctype,以与HTML5 XSLT版本(即所有当前存在的XSLT版本)和具有相同问题的其他系统兼容。可选的doctype是
。要输出此doctype,请在
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>

...

您必须使用XHTML 1.0 Strict作为doctype如果您希望XHTML输出与HTML5保持一致,libxml2的xml序列化程序有一种特殊的输出模式,由XHTML 1.0 doctype触发,以确保输出与XHTML兼容(例如,

而不是

doctype system=“about:legacy compat”
是否触发此兼容模式

如果您对html输出感到满意,那么设置
应该是正确的。然后可以使用
设置doctype!DOCTYPE html
,但这需要在适当的位置安装管道,因为XDV尚不支持此功能


事实上,
似乎也没有真正的帮助-这将导致

被输出为


这是一个注释,但我没有足够的业力点将其放在正确的位置。唉


我很欣赏这可能是实现我想要的目标的正确的、标准驱动的方式(我已经对它投了赞成票)。但前者不受支持(我的处理器崩溃),后者仍然导致我的doctype中出现“”。正如@Jirka Kosek所建议的,我认为我的XSLT处理器可能已经坏了

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

默认情况下,添加第二个
时,不会覆盖上一个
doctype public


请注意,XHTML1.0Strict被列为一个,因此使用这个doctype并仍然称之为HTML5是完全可以接受的

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

你好
参考资料


这个输出

<!DOCTYPE html SYSTEM "about:legacy-compat">


这被修改为使用Saxon 9.4对

的修复,您可以使用:

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

这将产生:

<!DOCTYPE HTML>

这就是我用来生成兼容的html5 doctype的方法(将saxons html5取出,否则就做遗留的事情)


使用此标签



仍然会留下
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“
在doctype中。如果生成您所说的内容,那么您使用的XSLT处理器中肯定存在错误。在哪里指定了此行为?这在JAXP XSLT中肯定不起作用。这一条与你的期望相差甚远——也许只是年龄。这是唯一的标准方法。但是,对于MSXSL,有一种非标准的方法:使用空的xsl:output/@doctype public和xsl:output/@doctype system。
禁用输出转义
是CaseI的意思。我不再从事此项目,因此无法测试-但是,根据投票结果将其标记为最佳答案。我一直在使用此方法。谢谢,救了我。。。谢谢是的,但正如我在0xA3答案中所评论的,空的@doctype system或@doctype public不是标准(而且,它违反了规范!)顺便说一句,使用public“XSLT compat”已经过时了。与XSLT兼容的HTML5 doctype现在是。从上一个编辑器WD中可以看到,几乎任何doctype都是允许的:short
、legacy
和废弃的(“不应该”)HTML4、HTML4.01、XHTML1.0和XHTML1.1(有系统时都是严格的DTD)。请将HTML5的一些答案更新为(现在)W3C建议。我认为这可能是正确的,标准驱动的方式来实现我想要的(我已经把它投了更高的票)。但前者不受支持(我的处理器崩溃),后者仍然会导致
”http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd“
在我的doctype中。正如@Jirka Kosek所建议的,我认为我的XSLT处理器可能坏了。关于这个问题的Deliverance(我正在使用的XSLT处理器)邮件列表讨论如下:当文档以
开头时,如果XSLT处理器向样式表添加元素或具有一些非标准属性默认值,则会发出警告,这意味着它已经坏了。@Alejandro:XDV(现在改名为diazo)不是XSLT处理器,它是一个主题->XSLT编译器。XDV将默认值添加到已编译的XSLT中。我知道这是因为我写的;)不幸的是,这是撒克逊人特有的。另一方面,这只是对问题的最简洁的回答
<xsl:output method="html" version="5.0" encoding="UTF-8" indent="yes" />
<!DOCTYPE HTML>
<?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" />
<xsl:output method="xml" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" doctype-public="XSLT-compat" indent="yes"/>