5

以前は問題なく動作していた一連の XSLT スタイルシートがあります。最近、仲間の開発者が Perl を新しいバージョンにアップグレードしました。その時以来、EXSLT 関数が定義されている場所で断続的なスタイルシート コンパイル エラーが発生しています。

エラーの例を次に示します。

要素のパラメーターは、テンプレート、変数、またはパラメーター内でのみ許可されます

変数は EXSLT 関数内で定義されます。エラーが受信されると、Apache (mod_perl と組み合わせて使用​​) を再起動するまで、Web ページにアクセスしようとするたびにエラーが表示されます。再起動後、XML::LibXSLT と EXSLT 関数を呼び出す Web ページを一度は正しく表示できますが、ページをリロードすると再びエラーが発生します。

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"/>

追加の調査結果:

この質問を最初に投稿した後、mod_perl の代わりに単純な古い CGI を使用すると、エラーをまったく再現できないことがわかりました。さらに、Apache httpd.conf で次の行を見つけました。コメントアウトすると、エラーが完全になくなるわけではありませんが、エラーの発生頻度が劇的に低下することがわかりました。

PerlModule XML::LibXSLT;
4

1 に答える 1

1

経験から、mod_perl は多くの面白いことを行います。たとえば、JSON::XS は mod_perl の下でひどく動作し、深刻なメモリ リークとスタック プロセスを引き起こします。そのため、mod_perl が処理できるネイティブでシンプルなコードである JSON::Tiny に移動しました。

XML::LibXSLT にも同じ問題があると感じています。コードを XML::LibXSLT からネイティブを使用するように移行しxsltprocました。あなたは今やっています、そしてそれはより安定しています

したがって、私の提案は、XML::LibXSLT からxsltprocmod_perl で問題なく使用する (バイナリ) に移動するか、XSLT 変換を行う他のライブラリを見つけることです (おそらく FOP ?)

于 2013-11-26T15:58:09.630 に答える