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には1つのルート要素が必要です(2つあります-)文字列の後にエラーが続く

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

バリデーターが2番目のルート要素(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は電話を切ります)。

Safari

このページには、次のエラーが含まれています。

1行目の40列目のエラー:ドキュメントの最後にある余分なコンテンツ以下は、最初のエラーまでのページのレンダリングです。

このドキュメントは、XSL変換の結果として作成されました。示されている行番号と列番号は、変換された結果からのものです。

オペラ

このドキュメントには無効なXSLTスタイルシートが含まれていました。XSLTエンジンからのエラーメッセージ:エラー:無効なXML出力:予期しない開始タグ(ルート要素はすでに指定されています)

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はどちらも、エラーメッセージなしで結果を表示します。

注意<xsl:output>:HTML出力を生成するときは、常にこれを命令で明示的に指定してください。

:この回答は問題の真の原因を明らかにし、解決策を提供しますが、これは、適切で完全なHTMLドキュメントを作成する必要性を排除するものではありません。したがって、ドキュメントの最上位要素として指定することをお勧めします。html追加の利点は、生成された出力の最上位要素がである場合html、XSLTプロセッサーは、出力が「html」である必要があることを自動的に推測し、出力メソッドを明示的に指定しなくてもhtmlシリアル化を実行することです。

W3C XSLT 1.0仕様によると

method属性のデフォルトは次のように選択されます。もしも

  • 結果ツリーのルートノードには、要素の子があります。

  • 結果ツリーのルートノードの子の最初の要素(つまり、ドキュメント要素)の展開名には、ローカル部分のhtml(
    大文字と小文字の任意の組み合わせ)とnull名前空間URIがあります。

  • 結果ツリーのルートノードの子の最初の要素の前にあるテキストノードには、空白文字のみが含まれます。

その場合、デフォルトの出力方法はhtmlです。それ以外の場合、デフォルトの出力方法はxmlです。

于 2012-11-21T19:04:38.640 に答える