xml错误xsl样式表

时间:2012-11-19 14:39:56

标签: php xml xslt

我有以下错误

第40行第1行的

错误:文档末尾的额外内容

尝试输出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>

我错过了什么?

2 个答案:

答案 0 :(得分:7)

缺少Html标记。 XML必须有一个根元素,(你有​​两个 - head body ) 字符串

后错误仍然存​​在
<head><title>Producenter</title></head>

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

只需添加root 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>

答案 1 :(得分:1)

以下是来自Safari和Opera的错误消息(IE和Firefox处理XML文件O​​K,Chrome挂起):

<强> Safari浏览器

  

此页面包含以下错误:

     第40行第1行的

错误:文档末尾的额外内容   下面是第一个错误的页面呈现。

     

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

<强>戏

  

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

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

来自Opera的消息并不是那么好,但两个浏览器都谈论同样的事情:他们将转换的结果视为HTML,而不是XML,并报告结果不是格式良好的事实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 Specification

  

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

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

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

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

  •   
     

然后默认输出方法是html;否则,默认输出   方法是xml。