Mozilla / Firefox中的客户端XSLT失败

时间:2015-08-23 10:54:49

标签: xslt

我有一个在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没有放入前导空格。

2 个答案:

答案 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中,它呈现如下:

enter image description here

注意(1):如果您不从Web服务器(本地或远程)运行它,由于安全限制,它将无法在Firefox或Chrome中运行。

注意(2):要查看呈现的XML或HTML,请使用Chrome或Firefox开发人员工具的Inspect Element功能。

注意(3):您不需要使用元标记,因为规范要求在识别出HTML输出时立即输出该元标记。

注意(4)如果您不确定Firefox是否正确加载样式表,请查看使用Firebug,它应该显示类似的内容(标记&#34; 200 OK&#34;):

enter image description here

答案 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元素的文本将不会显示。