Как добавить пробел между двумя элементами?

Я новичок в ветке xml, как я могу добавить пространство между двумя элементами в xml-twig?

Входные данные:

<xml>
<fig id="fig6_4">
<label><xref ref-type="page" id="page_54"/>[Figure 4]</label>
<caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>

Автор сценария:

$xml_twig_content = XML::Twig->new(
                                   twig_handlers => {
                                   'fig' => \&figure,
},
                                  );
$xml_twig_content->parsefile('sample.xml');

sub figure{
my ($xml_twig_content, $figure) = @_;
my @figchild = $figure->children;
foreach my $chid (@figchild){
if ($chid->name =~ /label/){
        my $t = $chid->text;
        $chid->set_inner_xml($t . ' ');
        $chid->erase;
}

выход:

<xml>
<fig id="fig6_4">
[Figure 4] <caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>

я нуждаюсь:

<xml>
    <fig id="fig6_4">
    <xref ref-type="page" id="page_54"/>[Figure 4] <caption>The Klein Sexual Orientation Grid</caption>
    </fig>
    </xml>

как я могу вставить пространство между двумя элементами.....

2 ответа

Решение

Я бы использовал обработчик на fig/label, так как это единственный элемент, который необходимо изменить. Затем коду в обработчике необходимо добавить суффикс к элементу, а затем стереть тег:

XML::Twig->new( twig_handlers => { 'fig/label' => sub { $_->suffix( ' ')->erase; }});

Мне не совсем ясно, какова цель - ваш формат выходных данных не выглядит особенно желательным. Тем не менее, приведенного ниже примера должно быть достаточно для того, чтобы помочь вам. Здесь рассматриваются два момента:

  1. Эта "внешняя ссылка" отсутствует в вашем текущем выводе.
  2. Как добавить произвольный пробел (в основном содержимое PCDATA) в документ

В качестве примечания: раньше я не использовал XML::Twig; документация на самом деле довольно хорошая, если вы знакомы с концепциями XML.

use strict;
use warnings;

use XML::Twig;

my $twig = XML::Twig->new(
    twig_handlers => {
        'fig' => \&figure
    },
    pretty_print => 'indented',
);

$twig->parse(do { local $/; <DATA> });

$twig->print;

sub figure {
    my ( $twig, $figure ) = @_;

    # Find all children of type label (would there really be more than 1??)
    foreach my $label ($figure->children('label')) {
        # Replace the label with its chidren nodes
        $label->replace_with($label->cut_children);

        # Find the caption and place 4 spaces before it
        if (my $caption = $figure->first_child('caption')) {
            my $some_whitespace = XML::Twig::Elt->new('#PCDATA' => '    ');
            $some_whitespace->paste(before => $caption);
        }
    }
}

__DATA__
<xml>
<fig id="fig6_4">
<label><xref ref-type="page" id="page_54"/>[Figure 4]</label>
<caption>The Klein Sexual Orientation Grid</caption>
</fig>
</xml>
Другие вопросы по тегам