xml twig:输出未转义的文本

发布于 2024-12-15 07:11:47 字数 362 浏览 0 评论 0原文

我正在使用 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); 时,它被转义为“<”,这会破坏它。如何在不转义的情况下输出文本?如果这是不可能的或不好的,我该如何解决它?

I'm using Perl's XML::Twig module to transform XML into (X)HTML. I need to output a Javascript element that looks like this:

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

Since the script contains "<", which is not XML-approved, when I call $node->set_text($code);, it is escaped as "<", which breaks it. How do I output text without escaping it? If that's impossible or bad, how do I get around it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千纸鹤 2024-12-22 07:11:47

如果您希望 XHTML 格式良好,您仍然必须转义“<”。这当然是 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]);

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

If you want the XHTML to be well-formed you still have to escape the '<'. Which of course Javascript would not like.

So the solution is to put the script in a CDATA section, which you get in XML::Twig by giving the element the tag '#CDATA'

Here is how you would create a CDATA section:

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

If you want to wrap all the scripts in CDATA, here is how to do it:

#!/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]);

This will only wrap local scripts, and will not double-wrap the ones which are already wrapped.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文