5

我有一组以前运行良好的 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;
4

1 回答 1

1

根据经验,mod_perl 做了很多有趣的事情,例如 JSON::XS 在 mod_perl 下工作很糟糕,并导致严重的内存泄漏 + 进程卡住,所以我转向 JSON::Tiny,这是一个原生且简单的代码 - mod_perl 可以处理

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

所以我的建议是要么从 XML::LibXSLT 转移到xsltproc我在 mod_perl 下使用的 (binary) 没有问题,要么找到一些其他库来为你做 XSLT 转换(也许是 FOP?)

于 2013-11-26T15:58:09.630 回答