XML::libXSLT 间歇性地抛出样式表编译错误



我有一组以前工作正常的XSLT样式表。最近,一位开发人员将我们的Perl升级到了更新的版本。从那时起,我们一直在定义 EXSLT 函数时出现间歇性的样式表编译错误。

下面是错误的示例:

元素参数仅允许在模板、变量或参数中

该变量在 EXSLT 函数中定义。收到错误后,每次尝试访问我的网页时都会收到错误,直到重新启动 Apache(与 mod_perl 结合使用)。重新启动后,我可以让调用XML::LibXSLT和EXSLT函数的网页正确显示一次,但是重新加载页面会再次触发错误。

在阅读了 XML::LibXSLT 文档后,我确认 HAVE_EXSLT() 函数返回的值为 1。我当前的 XML::LibXSLT 版本是 1.79。我的 LibXSLT DLL 是 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_perl做了很多有趣的事情,例如 JSON::XS 在mod_perl下工作很糟糕,并导致严重的内存泄漏 + 卡住进程,所以我搬到了 JSON::Tiny 这是一个原生且简单的代码 - mod_perl可以处理

我有一种感觉,XML::LibXSLT 也有同样的问题,出于这个原因,我将我的代码从 XML::LibXSLT 迁移到使用本机xsltproc,是的,它需要生成,但如果你做得对,开销并不比你现在做的更糟糕,而且更稳定

所以我的建议是从XML::LibXSLT移动到我在mod_perl下使用的xsltproc(二进制),或者找到其他库来为您进行XSLT转换(也许是FOP ?

相关内容

  • 没有找到相关文章

最新更新