XML分支:输出未转义的文本

xml twig: output unescaped text

本文关键字:转义 文本 输出 分支 XML      更新时间:2023-09-26

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

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

由于脚本包含"<",这不是xml批准的,当我调用$node->set_text($code);时,它被转义为"<",这破坏了它。如何输出文本而不转义?如果这是不可能的或不好的,我该如何绕过它?

如果希望XHTML格式良好,仍然需要转义'<'。这当然是Javascript不喜欢的。

因此,解决方案是将脚本放在CDATA部分中,您可以在XML::Twig中通过给元素标记'#CDATA '

来获得该部分。下面是创建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]);

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