xml twig: вывод неэкранированного текста - PullRequest
1 голос
/ 15 ноября 2011

Я использую модуль 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, при вызове <code>$node->set_text($code); он экранируется как «<», что нарушает его. Как вывести текст без экранирования? Если это невозможно или плохо, как мне обойти это? </p>

1 Ответ

4 голосов
/ 15 ноября 2011

Если вы хотите, чтобы XHTML был правильно сформирован, вам все равно нужно экранировать «<». Что, конечно, Javascript не понравится. </p>

Таким образом, решение состоит в том, чтобы поместить скрипт в раздел 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]);

Это обернет только локальные сценарии и не обернет дважды уже созданные.

...