0

windows.php.netから入手できるコンパイル済みの PHP バイナリを使用して Windows XP を実行しています。PHP 5.2.5 から PHP 5.2.16 にアップグレードしたところxsl:include、一部のスタイルシートの が機能しなくなりました。各バージョンを連続してテストしたところ、5.2.8 までは機能し、5.2.9 以降では機能しないことがわかりました。それぞれに対して次の 3 つのエラーが発生しますxsl:include

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: I/O warning : failed to load external entity "file%3A/C%3A/path/to/included/stylesheet.xsl" in ... on line 227

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: compilation error: file file%3A//C%3A/path/to/included/stylesheet.xsl line 36 element include in ... on line 227

Warning: XSLTProcessor::importStylesheet() [xsltprocessor.importstylesheet]: xsl:include : unable to load file%3A/C%3A/path/to/included/stylesheet.xsl in ... on line 227

これは、指定されたファイルが見つからないためだと思います。インクルードの多くは、変換されるスタイルシートと同じディレクトリにあり、パスにディレクトリがありません<xsl:include href="fileInSameDir.xsl">。興味深いことに、1 番目と 3 番目のエラーでは、正しい 2 つのスラッシュではなく 1 つのスラッシュで file:// プロトコルが表示されています。それが問題だと思います。(「file:/」を使用してフル パスをハードコーディングすると失敗しますが、「file://」を使用してフル パスをハードコーディングすると機能します。) しかし、何が原因でしょうか? libxslt/libxml のバグ? また、libxml と、libxslt がコンパイルされた libxml のバージョンとの間に明らかなバージョンの不一致があることもわかりました。

5.2.5
libxml バージョン => 2.6.26
libxml バージョンに対してコンパイルされた libxslt => 2.6.26

5.2.8

libxml バージョン => 2.6.32 libxml バージョン => 2.6.32
に対してコンパイルされた libxslt

=== 5.2.9 以降のバージョンでは機能しません ===
5.2.9
libxml バージョン => 2.7.3
libxml バージョンに対してコンパイルされた libxslt => 2.6.32

5.2.16
libxml バージョン => 2.7.7
libxml バージョンに対してコンパイルされた libxslt => 2.6.32

PHP 5.2.9 までは、libxslt は、PHP に含まれていたのと同じバージョンの libxml に対してコンパイルされていました。しかし、PHP 5.2.9 以降、libxslt は、PHP に含まれていたバージョンよりも古いバージョンの libxml に対してコンパイルされました。これは配布されたバイナリの問題ですか、それとも単なる偶然ですか?

これをテストするために、さまざまなバージョンの libxml/libxslt を使用して PHP をビルドし、どの組み合わせが機能するかどうかを確認できると思います。残念ながら、私は Windows の世界に慣れていないので、Windows で PHP を構築するのは頭がいっぱいのようです。

残念ながら、これまでのところ、この問題を自分のアプリ以外の例で再現できていないため、絞り込むのに苦労しており、特定のバグを送信することはできません.

それで、あなたはそれが原因だと思いますか

  • 配布されたバイナリのバージョン不一致の問題?
  • PHP 5.2.9 で導入されたバグ?
  • libxml 2.7 で導入されたバグ?
  • 他の何か?

私は困惑しています。私を正しい方向に向ける可能性のある考えは大歓迎です。ありがとう。

4

1 に答える 1

1

これはPHP バグ #53965として提出されました。

file:// プロトコルを適切に使用するには、完全な Windows パスに 3 番目の連続したスラッシュを付けて、localhost を意味する必要があります (つまり、file:///C:/path)。私のアプリケーションは 2 つのスラッシュを間違って使用しています (つまり、file://C:/path)。おそらく、パーサーは完全なエラー チェックを行わずに単に URI をトークン化し、再結合された文字列を XSLT プロセッサに渡したため、"file:/C:/path" のようになったと考えられます。

私の問題を解決するための2つのオプション:

  1. その 3 番目のスラッシュを追加するか、
  2. 「file://」プロトコルはローカル ファイルにすぎないため、完全に削除します。

私のコードは最終的に間違っていましたが、私の混乱は、私の無効な URI を示すエラーが生成されず、最初のファイルがとにかく正常にロードされたという事実から生じました。両方のファイルをロードするか、両方のファイルをロードしないかのいずれかです。この場合のように、一方がロードされ、一方がロードされないわけではありません。

于 2011-03-26T16:50:58.407 に答える