我有一个在Chrome中呈现的结果文档,但不是Mozilla / Firefox。
我相信这是因为有顶级前导空格(<!DOCTYPE html
之前有两个空行)。
如何将此转换更改为不具有前导空格(fiddle)?
XML:
<?xml-stylesheet href="/css/my.xsl" type="text/xsl"?>
<webpage>
<title>Book</title>
<auth>Mike</auth>
<container-content>
<p>foo1</p>
<p>foo2</p>
</container-content>
</webpage>
XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:output
method="xml"
indent="yes"
encoding="UTF-8"
omit-xml-declaration="yes"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"
doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"/>
<xsl:strip-space elements="*"/>
<xsl:template match="text()"/>
<xsl:template match="/">
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8"/>
</head>
<body>
<xsl:copy-of select="//container-content/*"/>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
结果:
- a blank line here -
- and here -
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<body>
<p>foo1</p>
<p>foo2</p>
</body>
</html>
或者,我可能不正确,并且这两个空白行不是Mozilla / Firefox中渲染失败的原因。我很难对客户端转换进行故障排除。
旁注:我在Saxon 6.5中开发过,认为Saxon最接近浏览器的作用。我错了。我注意到Xalan没有放入前导空格。
答案 0 :(得分:1)
我刚用Saxon 6.5运行你的样式表,实际上,它会输出两个空白行,如果你将xsl:output
更改为没有缩进和xml声明,则删除它们。但是,我认为这是Saxon 6.5中的一个错误(一个小错误,因为空白并不重要)。
使用其他XSLT 1.0处理器运行它不会显示空白。但是,正如我的评论中所说,空白是无关紧要的,因为浏览器无论如何都不会序列化。 (注意:显然,浏览器会进行某种序列化,因为它们会查看您是使用XML还是HTML输出。)
我用Firefox运行你的例子,而且#34;只是工作&#34;。由于样式表只是简单的XML副本,因此它只显示文本。如果我将xsl:output
更改为HTML并添加几行以确保我正确运行它(我添加了<h1>Hello</h1>
,则会显示HTML。
我不确定您希望浏览器显示什么,但我的猜测不是XML,而是(X)HTML。 XSLT 1.0在XHTML上不是很好(在XSLT 2.0中受支持,但浏览器不支持),但在HTML中可以正常工作。
我按如下方式修改了样式表:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
exclude-result-prefixes="xs"
version="1.0">
<xsl:strip-space elements="*"/>
<xsl:template match="text()"/>
<xsl:template match="/">
<html>
<head />
<body>
<xsl:apply-templates />
</body>
</html>
</xsl:template>
<xsl:template match="title">
<h1><xsl:value-of select="."/></h1>
</xsl:template>
<xsl:template match="auth">
<p>Author: <xsl:value-of select="." /></p>
</xsl:template>
</xsl:stylesheet>
在Firefox和Chrome中,它呈现如下:
注意(1):如果您不从Web服务器(本地或远程)运行它,由于安全限制,它将无法在Firefox或Chrome中运行。
注意(2):要查看呈现的XML或HTML,请使用Chrome或Firefox开发人员工具的Inspect Element功能。
注意(3):您不需要使用元标记,因为规范要求在识别出HTML输出时立即输出该元标记。
注意(4)如果您不确定Firefox是否正确加载样式表,请查看使用Firebug,它应该显示类似的内容(标记&#34; 200 OK&#34;):
答案 1 :(得分:1)
如果您想转换为XHTML,那么您需要确保为结果元素使用XHTML命名空间,以便
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml"
version="1.0">
样式表上的,与输出方法xml
不同,Mozilla不会将没有名称空间的元素识别为XHTML元素。
由于您的输入p
元素也没有名称空间,您无法复制它们但必须为它们编写模板
<xsl:template match="*">
<xsl:element name="{local-name()}"><!-- assumes you have the namespace declaration suggested above -->
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
然后使用<xsl:apply-templates select="//container-content/*"/>
代替copy-of
。在这种情况下,需要删除<xsl:template match="text()"/>
,否则转换的p
元素的文本将不会显示。