xml twig:输出未转义的文本

时间:2011-11-15 05:56:05

标签: javascript xml perl xml-twig

我正在使用Perl的XML :: Twig模块将XML转换为(X)HTML。我需要输出一个看起来像这样的Javascript元素:

<script type="text/javascript">window.onload = function(){for(i = 1; i < 5; i++)collapse("tbl" + i);}</script>

由于脚本包含“&lt;”(未经XML批准),因此当我调用$node->set_text($code);时,它会被转义为“&lt;”,这会破坏它。如何在不转义文本的情况下输出文本?如果这不可能或不好,我该如何解决它?

1 个答案:

答案 0 :(得分:4)

如果您希望XHTML格式正确,您仍然必须逃避'&lt;'。当然Javascript不喜欢。

因此,解决方案是将脚本放在CDATA部分中,通过为元素提供标记'#CDATA'

来获取XML :: Twig中的部分

以下是创建CDATA部分的方法:

perl -MXML::Twig -E'say XML::Twig::Elt->new( script)->set_cdata( "a<b")->sprint'
# <script><![CDATA[a<b]]></script>

如果要将所有脚本包装在CDATA中,请按以下步骤操作:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_roots => { script => sub { if( my $s= $_->text) { $_->set_cdata( $s); }
                                                $_->print;
                                              },
                              },
                 twig_print_outside_roots => 1,
              )
          ->parsefile( $ARGV[0]);

这将只包装本地脚本,并且不会对已经包装的脚本进行双重包装。