use strict; use XML::Rules; my $parser = XML::Rules->new( style => 'filter', rules => { _default => 'raw', 'id,gpa' => 'raw extended', student => sub { my ($tag, $attrs, $parser) = @_[0,1,4]; my $id = $attrs->{':id'}{_content}; if (exists $parser->{parameters}{ $id }) { $attrs->{':gpa'}{_content} = $parser->{parameters}{ $id }; } return $tag => $attrs; } } ); $parser->filter( \*DATA, \*STDOUT, {'002' => 'B'}); __DATA__ John 001 A John 002 C