У меня есть набор таблиц стилей XSLT, которые раньше работали нормально. Недавно один из разработчиков обновил наш Perl до более новой версии. С тех пор мы периодически получаем ошибки компиляции таблицы стилей, где определены функции EXSLT.
Вот пример ошибки:
параметр элемента разрешен только в шаблоне, переменной или параметре
Переменная определяется в функции EXSLT. Как только ошибка получена, я буду получать ее каждый раз, когда пытаюсь получить доступ к своей веб-странице, пока я не перезапущу Apache (используется в сочетании с mod_perl). После перезапуска я могу заставить веб-страницу, вызывающую XML::LibXSLT, и функцию EXSLT правильно отобразить один раз, но перезагрузка страницы снова вызовет ошибку.
Прочитав документы XML::LibXSLT, я убедился, что функция HAVE_EXSLT() возвращает значение 1. Моя текущая версия XML::LibXSLT — 1.79. Моя DLL-библиотека LibXSLT — 1.1.28. Моя версия perl 5.14.3. Предыдущие версии, которые работали, были 5.8.8, 1.66 и 1.1.22 соответственно.
Почему теперь я вижу эти ошибки, хотя раньше их не было? Ниже приведен начальный фрагмент таблицы стилей, который выдает ошибки компиляции. Пожалуйста, дайте мне знать, если есть какая-либо дополнительная информация, которую было бы полезно предоставить.
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
xmlns:func="http://exslt.org/functions"
xmlns:dtbl="http://docbook.sourceforge.net/dtbl"
extension-element-prefixes="func"
exclude-result-prefixes="exsl func dtbl"
version="1.0">
<func:function name="dtbl:convertLength">
<xsl:param name="arbitrary.length"/>
Дополнительные выводы:
После первоначальной публикации этого вопроса я обнаружил, что вообще не могу воспроизвести ошибку, если использую старый добрый CGI вместо mod_perl. Кроме того, я нашел следующую строку в моем файле Apache httpd.conf. При комментировании я увидел, что частота появления ошибки резко снизилась, хотя полностью ошибку не убрал.
PerlModule XML::LibXSLT;
mod_fcgid
вместоmod_perl
, чтобы уменьшить накладные расходы долгоживущих процессов без проблем с многопоточностью. - person Ian Roberts   schedule 26.11.2013mod_fcgid
заключается в том, что вам нужно писать свой код практически с нуля, если вы хотите его использовать, в то время как mod_perl (с его проблемами) позволяет вам использовать существующий код за вычетом некоторых изменений, связанных с параллелизмом. - person Noam Rathaus   schedule 26.11.2013