0

我正在使用windows.php.net提供的预编译 PHP 二进制文件运行 Windows XP 。我从 PHP 5.2.5 升级到 PHP 5.2.16,现在xsl:include我的一些样式表中的 s 停止工作。连续测试每个版本,我发现它在 5.2.8 中可以正常工作,而在 5.2.9+ 中无法正常工作。我现在得到以下三个错误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">. 有趣的是,在第一个和第三个错误中,它显示的 file:// 协议只有一个斜杠,而不是正确的两个。我猜这就是问题所在。(当我使用“file:/”对完整路径进行硬编码时,它会失败,但是当我使用“file://”对完整路径进行硬编码时,它会起作用。)但是是什么原因导致的呢?libxslt/libxml 中的错误?我还发现 libxml 与编译 libxslt 的 libxml 版本之间存在明显的版本不匹配。

5.2.5
libxml 版本 => 2.6.26
libxslt 针对 libxml 版本编译 => 2.6.26

5.2.8

libxml 版本 => 2.6.32
针对 libxml 版本编译的 libxslt => 2.6.32

=== 它从 5.2.9 开始的版本中断 ===
5.2.9
libxml 版本 => 2.7.3
libxslt 针对 libxml 版本编译 => 2.6.32

5.2.16
libxml 版本 => 2.7.7
libxslt 针对 libxml 版本编译 => 2.6.32

在 PHP 5.2.9 之前,libxslt 是针对 PHP 中包含的同一版本的 libxml 进行编译的。但是从 PHP 5.2.9 开始,libxslt 是针对旧版本的 libxml 编译的,而不是 PHP 中包含的。这是分布式二进制文件的问题还是只是巧合?

为了测试这一点,我想 PHP 可以使用不同版本的 libxml/libxslt 构建,以查看哪些组合有效或无效。不幸的是,我已经脱离了 Windows 世界的元素,在 Windows 上构建 PHP 似乎超出了我的想象。

遗憾的是,到目前为止,我一直无法通过我的应用程序之外的示例重现此问题,因此我正在努力缩小范围并且无法提交特定的错误。

那么,你认为这是由

  • 分布式二进制文件中的版本不匹配问题?
  • PHP 5.2.9 中引入的错误?
  • libxml 2.7 中引入的错误?
  • 别的东西?

我难住了。非常感谢任何可以为我指明正确方向的想法。谢谢。

4

1 回答 1

1

这已作为PHP 错误 #53965提交。

正确使用file:// 协议规定完整的 Windows 路径必须有第三个连续的斜杠来暗示 localhost(即 file:///C:/path)。我的应用程序错误地使用了两个斜杠(即,file://C:/path)。据推测,解析器只是简单地对 URI 进行标记,而不进行完整的错误检查,然后将重组后的字符串传递给 XSLT 处理器,从而导致出现“file:/C:/path”。

解决我的问题的两种选择:

  1. 添加第三个斜杠,或
  2. 完全删除“file://”协议,因为它们只是本地文件

Even though my code was ultimately incorrect, my confusion thus stemmed from the fact that no errors were generated that noted my invalid URI and that the initial file loaded successfully anyway. Either both files should load, or both files should not load -- not one loads and one doesn't, as was the case.

于 2011-03-26T16:50:58.407 回答