1

我想通过 XSLT 将输入的 XML 文档转换为 XHTML。在我的样式表中,我使用具有以下属性的 xsl:output:

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />

当我在 XML Copy Editor 或 Editix 等编辑器中使用 XSLT 处理器时,向 XTHML 1.0 Strict 的转换工作正常。当我使用命令行 xsltproc 时,它也按预期工作。

但是当我将样式表(“myfile.xsl”)链接到原始 XML 文档(“myfile.xml”)中时,如下所示:

<?xml-stylesheet type="text/xsl" href="myfile.xsl"?>

如果我现在尝试在主要浏览器(Chrome、IE 或 Mozilla)中观看“myfile.xml”,它们都无法将 XML 文档转换为预期的 XHTML。但是,使用 Opera,它可以完美运行。

我的 XSLT 是否有问题(即 xsl:output 中)或者这是主要浏览器(IE、Chrome、Mozilla)的 XSLT 实现中的缺陷?

仅当我在 . 如果我使用 method="html",它适用于所有浏览器。但我需要生成 XHTML,而不是 HTML,这就是为什么我在 xsl:output 中使用 method="xml" 以及 doctype-system 和 doctype-public 属性

4

4 回答 4

2

我相信大多数浏览器在使用 xml-stylesheet PI 运行转换时不会序列化输出。他们只是创建一个结果树然后渲染它。如果他们没有序列化结果树,他们应该完全正确地忽略 xsl:output 声明。

于 2013-04-06T13:09:35.793 回答
2

好吧,您还没有真正告诉我们浏览器以何种方式失败。如果要创建 XHTML 输出,请确保为结果元素使用 XHTML 命名空间,即 put

<xsl:stylesheet
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN" />


<xsl:template match="/">
  <html>...<xsl:apply-templates/>...</html>
</xsl:template>

</xsl:stylesheet>

在您的代码中确保结果元素是 XHTML 元素(而不是没有命名空间中的 XML 元素,这些元素恰好具有像 'html' 这样的本地名称但无法识别为 XHTML)。

我很确定带有输出方法xml的 Firefox/Mozilla 浏览器可以识别 XHTML 元素。我认为还有 IE 9 和 10,我不确定具有有限 XHTML 支持的旧版 IE 是否可以工作。

举个例子,XML 输入http://home.arcor.de/martin.honnen/xslt/test2013040601.xml通过http://home.arcor.de/martin.honnen/xslt/test2013040601转换为xml输出.xsl并且适用于 IE 10 和 Windows 8 上当前版本的 Firefox 和 Chrome。

于 2013-04-06T13:15:20.720 回答
0

客户端 XSLT 存在一些潜在问题:

  • XHTML doctype URL在 IE中被 W3C 阻止,因此需要打补丁
  • Firefox 中的XML 序列化器用于输出 XHTML,因此如果不使用 XHTML 命名空间,它将回退到文本
  • media-type属性需要定义text/html为 Chrome

这是一个自引用样式表,在另存为时可以使用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>

以下是一些不相关的问题,可以解释其他跨浏览器问题:

参考

于 2013-08-21T00:01:29.683 回答
-1

大多数浏览器只支持 XSLT 1.0,你应该看看SaxonCE 添加对 XSLT 2.0 的支持

Saxon-CE(客户端版)是 Saxonica 的 XSLT 2.0 实现,用于 Web 浏览器。

特征

注意XPath 2.0 支持

于 2013-04-06T12:50:31.780 回答