When you're deleting the node, the remaining address and contact elements haven't been parsed yet, so they aren't removed.
Create a handler for the node you want to remove. Unfortunately, you can't use something like
site[name[string() =~ /name2/]]
because XML::Twig doesn't support the full XPath syntax:
> XPath expressions are limited to using the child and descendant axis (indeed you can't specify an axis), and predicates cannot be nested.
You can do part of the work in Perl, though:
my %handlers = ( 'site' => sub {
my ($twig, $cnt) = @_;
$cnt->delete if grep $_->text =~ /name2/,
$cnt->children('name');
} );
BTW, in XML::XSH2, you'd just delete /sites/site[xsh:match(name,"name2")] ;
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
|