use strict; use warnings; use XML::Twig; use XML::XPath; use XML::Twig::XPath; my $twigrp = new XML::Twig::XPath( pretty_print => 'indented_c', # print format keep_encoding => 1, ); $twigrp->parse(\*DATA); my %insbeforetag; $insbeforetag{1} = [('//chbody//exercises/orderedlist/item/para', 'inst', '\t{{Num}\.\t')]; for my $row (keys %insbeforetag){ for ($twigrp->findnodes($insbeforetag{$row}->[0])) { my $min_elt= XML::Twig::Elt->new( $insbeforetag{$row}->[1] => $insbeforetag{$row}->[2]); $min_elt->paste( before => $_); } } $twigrp->print; __DATA__ Content Text1 Text2 Text3 Text1 Text2 Text3 Text4