4

次のような状況があります。

Web インターフェイスから XSLT を取得し、XSLT を XML ファイルに埋め込むツールがあります (誰かがクビになっているはずです)。「残念ながら」私はフランス語圏の国で働いているため、XSLT にはアクセントのある単語が多数含まれています。XSLT が XML に埋め込まれている場合、ツールはすべてのアクセントを HTML コード (Iacute、igrave など) に変換します。

私の Perl コードは XML から XSLT を取得し、Xalan コマンド ライン ツールを使用して他の XML に対してそれを実行しています。XSLT にアクセントがあるたびに、Xalan ツールは例外をスローします。

私は最初に正規表現を実行して、XSLT usch のすべてのアクセントを次のように変更します。

# & はページでレンダリングされるため、コードでは省略されています
$xslt =~s/Aacute;/Á/gso;
$xslt =~s/aacute;/á/gso;
$xslt =~s/Agrave;/À/gso;
$xslt =~s/Acirc;/Â/gso;
$xslt =~s/agrave;/à/gso;

しかし、そうすることは、アクセントコードごとに正規表現を書かなければならないことを意味します....

私の質問は、コードごとに正規表現を書かずにこれを行う方法はありますか? (それが唯一の解決策だと思うと、吐きたくなります。)

ちなみにツールはTeamSiteで、最悪です.....

編集済み:Perlのみのソリューションが必要であることを忘れていました。セキュリティにより、1週間ほどチェックされていないタイプのライブラリをインストールできません:(

4

4 に答える 4

6

You can try something like HTML::Entities. From the POD:

use HTML::Entities;
$a = "Våre norske tegn bør &#230res";
decode_entities($a);
#encode_entities($a, "\200-\377");  ## not needed for what you are doing

In response to your edit, HTML::Entities is not in the perl core. It might still be installed on your system because it is used by a lot of other libraries. You can check by running this command:

perl -MHTML::Entities -le 'print "If this prints, the it is installed"'
于 2009-01-28T14:44:16.887 に答える
1

あなたの目的にはHTML::Entitiesが最善の解決策ですが、ニーズに合った既存のパッケージが見つからない場合は、次のアプローチが複数のs///ステートメントよりも効果的です

# this part do in inter function module code which is executed in compile time
# or place in BEGIN or do once before first s/// statement using it
my %trans = (
  'Aacute;' => 'Á',
  'aacute;' => 'á',
  'Agrave;' => 'À',
  'Acirc;' => 'Â',
  'agrave;' => 'à',
); # remember you can generate parts of this hash for example by map

my $re = qr/${ \(join'|', map quotemeta, keys %trans)}/;

# this code place in your functions or methods
s/($re)/$trans{$1}/g; # 'o' is almost useless here because $re has been compiled yet

編集: Chaseが述べたように、regexp修飾子は必要ありません。オーエンズ

于 2009-01-28T16:23:33.347 に答える
0

TeamSiteをutf-8のままにする/utf-8に変換することはできないと思いますか?

CGI.pmには(文書化されていない)unescapeHTML関数があります。ただし、文書化されていないため(そして、ソースを調べていないため)、基本的なHTMLエンティティ(<、>、&)以上を処理するだけかどうかはわかりません。ただし、基本的なエンティティのみを実行すると思います。

于 2009-01-28T15:29:35.063 に答える