my $self = {
obj => $options{'Content'},
stack => [],
+ level => 0,
Handler => $options{'Handler'}
};
bless($self, $class);
my ($self, $data) = @_;
my $obj = $self->{'obj'};
+ ++$self->{'level'};
+
# find the ID, if any
my $id = $data->{'Attributes'}->{'{http://template.sesse.net/}id'};
$id = $id->{'Value'} if (defined($id));
if (defined($match)) {
$self->SUPER::start_element($data);
- # FIXME: we should match on something better than the name. But what?
- push @{$self->{'stack'}}, [ $data->{'Name'}, $obj ];
+ push @{$self->{'stack'}}, [ $data->{'Name'}, $self->{'level'}, $obj ];
#
# This is sort of ugly. We special-case replacement by outputting
sub end_element {
my ($self, $data) = @_;
-
+
my $stack = $self->{'stack'};
if (scalar @$stack > 0) {
my $top = $stack->[scalar @$stack - 1];
- if ($data->{'Name'} eq $top->[0]) {
+ if ($data->{'Name'} eq $top->[0] && $self->{'level'} == $top->[1]) {
my $obj = $self->{'obj'};
# did we just finish a clone operation?
}
$self->SUPER::end_element($data);
- $self->{'obj'} = $top->[1];
+ $self->{'obj'} = $top->[2];
pop @$stack;
+ --$self->{'level'};
return;
}
}
+ --$self->{'level'};
+
return if (!defined($self->{'obj'}));
if (ref($self->{'obj'}) eq 'XML::TemplateSAX::Buffer') {