The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
$|=1;
use XML::Rules;

$xml = <<'*END*';
<doc>
 <person xmlns="http://jenda.krynicky.cz/xmlns/testXMLNS/person" xmlns:foo="http://jenda.krynicky.cz/xmlns/testXMLNS/foo">
  <fname>Jane</fname>
  <lname>Luser</lname>
  <email>JLuser@bogus.com</email>
  <address>
   <street>Washington st.</street>
   <city>Old Creek</city>
   <country>The US</country>
   <bogus>bleargh</bogus>
   <foo:bogus>bleargh</foo:bogus>
  </address>
 </person>
 <person>
  <fname>John</fname>
  <lname>Other</lname>
  <email>JOther@silly.com</email>
  <address>
   <street>Grant's st.</street>
   <city>New Creek</city>
   <country>Canada</country>
   <bogus>sdrysdfgtyh <foo>degtrhy werthy</foo> drthyu</bogus>
  </address>
 </person>
</doc>
*END*

%rules = (
	_default => 'content no xmlns',
#	bogus => sub {}, # means "returns no value. The subtags ARE processed.
	'^bogus' => undef, # means "ignore". The subtags ARE NOT processed.
	'address,p:address' => 'no content',
	person => 'no content array',
	'p:person' => 'no content array',
	doc => sub {[ @{$_[1]->{person}}, @{$_[1]->{'p:person'}}] }, #'pass no content',
	foo => sub {print "FOOOOOOOO\n"},
	'foo:bogus' => sub {print "Yeah, the aliased namespaces work!\n"},
	'fxx:bogus' => sub {print "Yeah, the aliased namespaces work! And even correctly!\n"},
	fname => sub {fname => 'NORMAL ' . $_[1]->{_content} . ' NORMAL'},
);

my $parser = new XML::Rules (
	rules => \%rules,
	namespaces => {
		reverse 'ahoj' => 'http://jenda.krynicky.cz/xmlns/testXMLNS/other',
#		'p' => 'http://jenda.krynicky.cz/xmlns/testXMLNS/person',
		'' => 'http://jenda.krynicky.cz/xmlns/testXMLNS/person',
		'fxx' => 'http://jenda.krynicky.cz/xmlns/testXMLNS/foo',
	},
	# other options
);

my $result = $parser->parsestring($xml);

use Data::Dumper;
print Dumper($result);