我正在使用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.265.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.325.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 中引入的错误?
- 别的东西?
我难住了。非常感谢任何可以为我指明正确方向的想法。谢谢。