2011-11-15 17 views
1

私はXMLを(X)HTMLに変換するためにPerlのXML :: Twigモジュールを使用しています。私は$node->set_text($code);を呼び出すとき、それを破った、「<」としてエスケープされ、XML-承認されていないスクリプトは「<」が含まれているのでxml twig:エスケープされていないテキストを出力

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

、:私は、出力に次のようになりますJavascriptの要素を必要とします。テキストをエスケープしないで出力するにはどうすればよいですか?それが不可能または悪い場合は、どうすれば回避できますか?

答えて

4

XHTMLを整形したい場合は、まだ '<'をエスケープする必要があります。もちろん、どちらのJavascriptが好きではないでしょうか。

だから解決策は、あなたがタグ'#CDATA「ここ

要素を使用すると、CDATAセクションを作成する方法をされて与えることによって、XML ::小枝で取得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]); 

これは、ローカルのスクリプトをラップし、ものをダブル折り返されませんすでにラップされています。

関連する問題