我有一套以前工作正常的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;
答案 0 :(得分:1)
从经验来看mod_perl做了很多有趣的事情,例如JSON :: XS在mod_perl下工作很糟糕并导致严重的内存泄漏+卡住进程,所以我转移到JSON :: Tiny这是一个原生的简单代码 - mod_perl可以处理
我感觉XML :: LibXSLT有同样的问题,我将我的代码从XML :: LibXSLT迁移到使用原生xsltproc
这个原因,是的,它需要产生,但如果你做得对,开销并不比你现在正在做的更糟,而且更稳定
所以我的建议是从XML :: LibXSLT转移到xsltproc
(二进制),我在mod_perl下使用没有问题,或者找到一些其他库来为你做XSLT转换(也许是FOP?)