我有以下情况:
有一个工具可以从Web界面获取XSLT并将XSLT嵌入到XML文件中(某人应该被触发)。 “不幸的是”我在一个法语国家工作,因此XSLT有很多带有重音符号的单词。当XSLT嵌入到XML中时,该工具会将所有重音转换为HTML代码(Iacute,igrave等)。
我的Perl代码正在从XML中检索XSLT,并使用Xalan命令行工具针对其他XML执行它。每次XSLT中都有一些重音时,Xalan工具会抛出异常。
我最初想做一个正则表达式来改变XSLT中的所有重音:
# the & is omitted in the codes becuase it will be rendered in the page $xslt =~s/Aacute;/Á/gso; $xslt =~s/aacute;/á/gso; $xslt =~s/Agrave;/À/gso; $xslt =~s/Acirc;/Â/gso; $xslt =~s/agrave;/à/gso;
但这样做意味着我必须为每个重音代码写一个正则表达式....
我的问题是,如果没有为每个代码编写正则表达式,有没有这样做呢? (认为这是唯一的解决方案,想要呕吐。)
顺便说一下,这个工具是TeamSite,它很糟糕.....
编辑:我忘了提到我需要一个只有Perl的解决方案,安全性不允许我安装他们一周左右没有检查过的任何类型的库:(
答案 0 :(得分:6)
您可以尝试HTML::Entities之类的内容。来自POD:
use HTML::Entities;
$a = "Våre norske tegn bør æres";
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"'
答案 1 :(得分: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
修改:Chas. Owens所提及的e
regexp修饰符不需要。
答案 2 :(得分:0)
我认为没有可能让TeamSite将其保留为utf-8 /将其转换为utf-8?
CGI.pm有一个(未记录的)unescapeHTML函数。但是,由于它没有记录(我没有查看源代码),我不知道它是否只处理基本的HTML实体(<,>,&)或更多。但是,我认为它只做基本实体。
答案 3 :(得分:0)
为什么有人会因将XSL(XML)放入XML文件而被解雇?