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です。