2011-02-02 1 views
0

Я запускаю Windows XP с предварительно скомпилированными двоичными файлами PHP, доступными с windows.php.net. Я обновился с PHP 5.2.5 до PHP 5.2.16, и теперь xsl:include s в некоторых моих стилях перестали работать. Проверяя каждую версию подряд, я обнаружил, что она работала в 5.2.8 и не работает в 5.2.9+. Теперь я получаю следующие три ошибки для каждого xsl:include.xsl: включить сбой после обновления версии PHP; версия 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: //», он работает.) Но что может вызвать это? Ошибка в libxslt/libxml? Я также обнаружил явное несоответствие версии между libxml и версией libxml, с которой был скомпилирован libxslt.

5.2.5
LibXML Version => 2.6.26
LibXSLT скомпилированы Libxml Version => 2.6.26

5.2.8

LibXML Version => 2.6.32
libxslt скомпилирован против libxml Version => 2.6.32

=== он разрывается в версиях начиная с 5.2.9 ===
5 .2.9
LibXML версия => 2.7.3
LibXSLT составлен против LibXML Version => 2.6.32

5.2.16
LibXML Version => 2.7.7
LibXSLT скомпилированный против LibXML Version => 2.6. 32

До PHP 5.2.9 libxslt был скомпилирован против той же версии libxml, которая была включена в PHP. Но начиная с PHP 5.2.9, libxslt был скомпилирован против более старой версии libxml, чем тот, который был включен в PHP. Это проблема с распределенными двоичными файлами или просто совпадением?

Чтобы проверить это, я полагаю, PHP может быть построен с различными версиями libxml/libxslt, чтобы увидеть, какие комбинации работают или нет. К сожалению, я не в своем элементе в мире Windows, и создание PHP на Windows кажется мне над головой.

К сожалению, до сих пор я не смог воспроизвести эту проблему с помощью примера вне моего приложения, поэтому я стараюсь сузить его и не могу представить конкретную ошибку.

Итак, вы думаете, что это вызвано

  • несоответствия версий проблемы в распределенных бинарных файлах?
  • ошибка, введенная в PHP 5.2.9?
  • ошибка, введенная в libxml 2.7?
  • что-то еще?

Я в тупике. Любые мысли, которые могут указать мне в правильном направлении, очень ценятся. Благодарю.

ответ

1

Это было представлено как PHP bug #53965.

Правильное использование file:// protocol диктует, что для всех путей Windows должен быть третий последовательный слэш, чтобы подразумевать localhost (то есть файл: /// C:/path). В моем приложении неправильно используются две слэши (т. Е. Файл: // C:/path). Предположительно, синтаксический анализатор просто обозначил URI без полной проверки ошибок, а затем передал по рекомбинированной строке XSLT-процессору, что привело к появлению «file:/C:/path».

два варианта, чтобы решить мою проблему:

  1. добавить, что третий слэш, или
  2. удалить "файл: //" протокол полностью, так как они только локальные файлы

Несмотря на то, что мой код был в конечном счете неправильным, моя путаница, таким образом, была связана с тем, что не было создано никаких ошибок, которые отмечали мой недопустимый URI и что исходный файл загружен в любом случае. Либо оба файла должны загружаться, либо оба файла не должны загружаться - не одна загрузка, а другая нет, как это было в случае.

Смежные вопросы