Как удалить дубликаты тегов 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>
Другие вопросы по тегам