From: sgunderson@bigfoot.com <> Date: Thu, 1 Mar 2007 14:22:27 +0000 (+0100) Subject: Try to handle the perl-sax issue differently. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=065637d9b212c043a8deec678af7ea94a05b9f8a;p=xml-template Try to handle the perl-sax issue differently. --- diff --git a/perl-sax/XML/TemplateSAX/Handler.pm b/perl-sax/XML/TemplateSAX/Handler.pm index 3ec394b..e63ee4c 100644 --- a/perl-sax/XML/TemplateSAX/Handler.pm +++ b/perl-sax/XML/TemplateSAX/Handler.pm @@ -14,6 +14,7 @@ sub new { my $self = { obj => $options{'Content'}, stack => [], + level => 0, Handler => $options{'Handler'} }; bless($self, $class); @@ -24,6 +25,8 @@ sub start_element { 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)); @@ -75,8 +78,7 @@ sub start_element { 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 @@ -163,12 +165,12 @@ sub processing_instruction { 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? @@ -180,12 +182,15 @@ sub end_element { } $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') {