3

我有以下错误

第 1 行第 40 列的错误:文档末尾的额外内容

当尝试输出 xml 文件时:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="producers.xsl"?>
<producers>
  <producer>
    <id>8</id>
    <name>Emåmejeriet</name>
    <street>Grenvägen 1-3</street>
    <postal>577 39</postal>
    <city>Hultsfred</city>
    <weburl>http://www.emamejerie3t.se</weburl>
  </producer>
</producers>

我已经验证了 xml,我没有收到任何错误。xsl 模板看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
    <head><title>Producenter</title></head>
    <body>
        <p>
            <xsl:value-of select="producers/producer/id"/>
        </p>
    </body>
</xsl:template>
</xsl:stylesheet>

我错过了什么?

4

2 回答 2

7

缺少 HTML 标签。XML 必须有一个根元素,(你有​​两个headbody)字符串后错误仍然存​​在

<head><title>Producenter</title></head>

当验证器找到第二个根元素(body)时。

只需添加根html标记

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<html>

    <head><title>Producenter</title></head>
    <body>
        <p>
            <xsl:value-of select="producers/producer/id"/>
        </p>
    </body>
</html>
</xsl:template>
</xsl:stylesheet>
于 2012-11-19T15:14:10.300 回答
1

以下是来自 Safari 和 Opera 的错误消息(IE 和 Firefox 处理 XML 文件正常,Chrome 挂断):

野生动物园

此页面包含以下错误:

第 1 行第 40 列的错误:文档末尾的额外内容 以下是第一个错误之前的页面呈现。

该文档是作为 XSL 转换的结果创建的。给出的行号和列号来自转换后的结果。

歌剧

此文档包含无效的 XSLT 样式表。来自 XSLT 引擎的错误消息:错误:无效的 XML 输出:意外的开始标记(已指定根元素)

来自 Safari 的消息特别好——它确认问题不在于执行转换,而在于生成的结果。

来自 Opera 的消息不太好,但两种浏览器都在谈论同一件事:它们将转换的结果视为 XML,而不是 HTML,并报告结果不是格式良好的 XML 文档这一事实(不是单个顶部元素)。

实际上,转换会生成以下输出

<?xml version="1.0" encoding="utf-8"?><head><title>Producenter</title></head><body><p>8</p></body>

而 XML 声明使浏览器期待一个 XML 文档,却发现这不是一个格式良好的 XML 文档。

解决方案

根据分析,修复很简单自然——只需添加以下内容:

<xsl:output method="html"/>

xsl:stylesheet指示后立即。

完整的转换现在变为

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:template match="/">
    <head><title>Producenter</title></head>
    <body>
        <p>
            <xsl:value-of select="producers/producer/id"/>
        </p>
    </body>
</xsl:template>
</xsl:stylesheet>

生成的输出不再以 XML 声明开头,内容类型明确指定为text/html

<head>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">

   <title>Producenter</title>
</head>
<body>
   <p>8</p>
</body>

并且 Safari 和 Opera 都愉快地显示结果,没有错误消息。

请记住:生成 HTML 输出时,请始终在指令中明确指定<xsl:output>

请注意:虽然此答案揭示了问题的真正原因并提供了解决方案,但这并不排除编写良好且完整的 HTML 文档的需要。因此,最好指定html文档的顶部元素。另一个好处是,如果生成的输出的顶部元素是html,XSLT 处理器会自动推断输出必须是“html”并执行 html 序列化,即使没有明确指定输出方法。

根据W3C XSLT 1.0 规范

方法属性的默认选择如下。如果

  • 结果树的根节点有一个子元素,

  • 结果树的根节点(即文档元素)的第一个元素子元素的扩展名称具有本地部分 html(
    大小写的任意组合)和空命名空间 URI,以及

  • 结果树根节点的第一个子元素之前的任何文本节点仅包含空白字符,

那么默认的输出方式是html;否则,默认输出方法为 xml。

于 2012-11-21T19:04:38.640 回答