1

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);と "<" としてエスケープされて壊れます。テキストをエスケープせずに出力するにはどうすればよいですか? それが不可能または悪い場合、どうすれば回避できますか?

4

1 に答える 1

4

XHTMLを整形式にしたい場合でも、「<」をエスケープする必要があります。もちろん、Javascriptはどちらを望まないでしょう。

したがって、解決策は、要素にタグを付けることによってXML::Twigで取得するCDATAセクションにスクリプトを配置することです'#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]);

これはローカルスクリプトのみをラップし、すでにラップされているスクリプトを二重にラップしません。

于 2011-11-15T06:49:41.477 に答える