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 的解决方案,安全性不允许我安装他们一周左右没有检查过的任何类型的库:(

4

4 回答 4

6

你可以试试HTML::Entities 之类的东西。从 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

作为对您的编辑的回应,HTML::Entities 不在 perl 核心中。它可能仍安装在您的系统上,因为许多其他库都在使用它。您可以通过运行以下命令进行检查:

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提到的正则表达式修饰符。欧文斯

于 2009-01-28T16:23:33.347 回答
0

我认为不可能让 TeamSite 将其保留为 utf-8/将其转换为 utf-8?

CGI.pm 有一个(未记录的)unescapeHTML 函数。但是,由于它没有记录(而且我没有查看源代码),我不知道它是否只处理基本的 HTML 实体(<、>、&)或更多。但是,我猜它只做基本实体。

于 2009-01-28T15:29:35.063 回答
0

为什么有人会因为将 XSL(即 XML)放入 XML 文件而被解雇?

于 2009-01-29T11:46:26.880 回答