Как удалить дубликаты тегов span в xml twig?
Мне нужно слить span
теги с таким же стилем в следующем XML-документе:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book>
<p><span style="font-size:10pt;">T</span><span style="font-size:10pt;">h</span><span style="font-size:10pt;">e</span></p>
<p><span style="font-style:italic;">o</span><span style="font-style:italic;">f</span><span style="font-size:10pt;">e</span></p>
</book>
Мой желаемый результат:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book>
<p><span style="font-size:10pt;">The</span></p>
<p><span style="font-style:italic;">of</span><span style="font-size:10pt;">e</span></p>
</book>
Это то, что я пробовал до сих пор:
use strict;
use XML::Twig;
my $Document = XML::Twig->new(
keep_encoding=>1,
twig_handlers =>{
},
pretty_print => 'indented',
);
$Document->parsefile("book.xml");
$Document->print();
У меня возникают трудности с пониманием концепций этого модуля. Возможно ли то, что я пытаюсь сделать?
1 ответ
Ну, вы на самом деле не удаляете там XML-теги - каждый, что касается XML, span
является независимой организацией.
Тем не менее, что вы можете сделать, это использовать XML::Twig::Elt
метод prev_sibling
- потому что это смотрит на узлы на одном уровне. И если предыдущий узел имеет правильный тип и тот же стиль - объедините текущий текст и удалите этот узел. Я не уверен, что это будет работать для всех случаев использования, но это будет делать то, что вы просите.
use strict;
use warnings;
use XML::Twig;
my $previous_span;
my $previous_style;
sub merge_span {
my ( $twig, $span ) = @_;
my $prev = $span->prev_sibling;
if ( $prev
and $prev->tag eq $span->tag
and $prev->att('style') eq $span->att('style')
and not $prev -> has_children
and not $span -> has_children
)
{
$prev->set_text( $prev->text . $span->text );
$span->delete;
}
}
my $xml = XML::Twig->new(
'pretty_print' => 'indented',
'twig_handlers' => { 'span' => \&merge_span, },
);
$xml->parse( \*DATA );
$xml->print;
__DATA__
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<book>
<p><span style="font-size:10pt;">T</span><span style="font-size:10pt;">h</span><span style="font-size:10pt;">e</span></p>
<p><span style="font-style:italic;">o</span><span style="font-style:italic;">f</span><span style="font-size:10pt;">e</span></p>
</book>