XML::LibXSLT периодически выдает ошибки компиляции таблицы стилей

У меня есть набор таблиц стилей 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;

person Scott    schedule 12.11.2013    source источник
comment
Для меня такая случайная ошибка предполагает, что вы используете MPM с потоками с модулем, который не является потокобезопасным. Возможно, вы захотите рассмотреть возможность использования подхода FastCGI, такого как mod_fcgid вместо mod_perl, чтобы уменьшить накладные расходы долгоживущих процессов без проблем с многопоточностью.   -  person Ian Roberts    schedule 26.11.2013
comment
Проблема с mod_fcgid заключается в том, что вам нужно писать свой код практически с нуля, если вы хотите его использовать, в то время как mod_perl (с его проблемами) позволяет вам использовать существующий код за вычетом некоторых изменений, связанных с параллелизмом.   -  person Noam Rathaus    schedule 26.11.2013


Ответы (1)


Из опыта mod_perl делает много забавных вещей, например, JSON::XS ужасно работает под mod_perl и вызывает серьезную утечку памяти + зависание процесса, поэтому я перешел на JSON::Tiny, который является нативным и простым кодом, с которым mod_perl может справиться.

У меня такое ощущение, что XML::LibXSLT имеет ту же проблему, я перенес свой код с XML::LibXSLT на использование собственного xsltproc по этой причине, да, он требует порождения, но если вы все сделаете правильно, накладные расходы не хуже, чем что вы делаете сейчас, и это более стабильно

Поэтому я предлагаю либо перейти с XML::LibXSLT на xsltproc (двоичный), который я без проблем использую в mod_perl, либо найти какую-то другую библиотеку, которая сделает для вас преобразование XSLT (может быть, FOP?)

person Noam Rathaus    schedule 26.11.2013