2011-02-02 55 views
0

我正在运行Windows XP,预编译的PHP二进制文件可从windows.php.net获得。我从PHP 5.2.5升级到PHP 5.2.16,现在我的一些样式表中的xsl:include停止工作。连续测试每个版本,我发现它通过了5.2.8,并且在5.2.9+中不起作用。我现在每个xsl:include都会得到以下三个错误。升级PHP版本后xsl:include失败;是libxml/libxslt版本不匹配的问题?

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中引入了一个bug?
  • 别的东西?

我很难过。任何想法都可能将我指向正确的方向,我们对此表示赞赏。谢谢。

回答

1

这已提交为PHP bug #53965

正确使用file:// protocol表明完整的Windows路径必须有第三个连续的斜杠来暗示本地主机(即file:/// C:/ path)。我的应用程序不正确地使用两个斜杠(即file:// C:/ path)。据推测,解析器只是在没有完全错误检查的情况下对URI进行标记,然后将重组字符串传递给XSLT处理器,导致出现“file:/ C:/ path”。

两个选项来解决我的问题:

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

尽管我的代码最终是不正确的,但是我的混淆源于这样一个事实,即没有错误发生,指出我的无效URI,并且最初的文件无论如何都成功加载。要么加载这两个文件,要么两个文件都不应该加载 - 没有加载,也没有加载,情况就是这样。