我想通过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属性答案 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存在一些潜在问题:
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实现。