主浏览器中支持XSLT <xsl:output> </xsl:output>

时间:2013-04-06 12:44:35

标签: debugging xslt browser xml-serialization xhtml-1.0-strict

我想通过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 Processor时,转换为XTHML 1.0 Strict可以正常工作。当我使用命令行xsltproc时,它也按预期工作。

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

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

如果我尝试在主要浏览器(Chrome,IE或Mozilla)中现在观看“myfile.xml”,它们都不能在预期的XHTML中转换XML文档。但是,使用Opera,它可以很好地工作。

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

只有在我使用属性method =“xml”时才会出现问题。如果我使用method =“html”,它适用于所有浏览器。但我需要生成XHTML,而不是HTML,这就是为什么我使用method =“xml”以及doctype-system&amp; xsl:output

中的doctype-public属性

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

嗯,你还没有告诉我们浏览器失败的方式。如果要创建XHTML输出,请确保为结果元素使用XHTML命名空间,即放置

<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.xsl转换为xml输出,适用于Windows 8上的IE 10和当前版本的Firefox和Chrome。 / p>

答案 2 :(得分:0)

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

  • IE中的XHTML doctype网址为blocked by the W3C,因此需要a patch
  • Firefox中的XML serializer用于输出XHTML,因此如果不使用XHTML命名空间,它将回退到文本
  • media-type属性需要定义为Chrome的text/html

这是一个自引用样式表,在保存为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>

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

<强>参考

答案 3 :(得分:-1)

大多数浏览器仅支持XSLT 1.0,您应该查看SaxonCE to add support for XSLT 2.0

  

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

功能

小心XPath 2.0 support

相关问题