use strict;
use XML::Rules;
my $parser = XML::Rules->new(style => 'filter', rules => {
_default => 'raw',
p => sub { return $_[1]->{_content}},
});
$parser->filter(\*DATA);
__DATA__
<li>
<p>
Some <b>text</b>
</p>
</li>
If you wanted to remove only <p> directly inside <li>, the code would look like this:
use strict;
use XML::Rules;
my $parser = XML::Rules->new(style => 'filter', rules => {
_default => 'raw',
p => sub {
if ($_[2][-1] eq 'li') {
return $_[1]->{_content};
} else {
return $_[0] => $_[1];
}
},
});
$parser->filter(\*DATA);
__DATA__
<root>
<li>
<p>
Some <b>text</b>
</p>
</li>
<p>
Other <b>text</b>
</p>
</root>
The $_[2] is a reference to an array containing the names of the opened tags, so the condition just checks whether the enclosing tag of the currently processed <p> is <li>.
Jenda
Enoch was right!
Enjoy the last years of Rome.
|