From: sgunderson@bigfoot.com <> Date: Thu, 1 Mar 2007 13:49:25 +0000 (+0100) Subject: Try to fix the structure test, but fail miserably. X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=2eb70ba073bd09bf817ff9ac959023d1d8382d91;hp=ebb171ceab791e7449f819b6bb611ff0cebdb816;p=xml-template Try to fix the structure test, but fail miserably. --- diff --git a/perl-sax/XML/TemplateSAX/Handler.pm b/perl-sax/XML/TemplateSAX/Handler.pm index 3ec394b..72a506c 100644 --- a/perl-sax/XML/TemplateSAX/Handler.pm +++ b/perl-sax/XML/TemplateSAX/Handler.pm @@ -28,6 +28,20 @@ sub start_element { my $id = $data->{'Attributes'}->{'{http://template.sesse.net/}id'}; $id = $id->{'Value'} if (defined($id)); + # + # If we have multiple elements with the same name within each other, + # we need to keep track of how many there are, so check here and increment. + # end_element will decrement and optionally pop the stack. + # + my $stack = $self->{'stack'}; + if (scalar @$stack > 0) { + my $top = $stack->[scalar @$stack - 1]; + + if ($data->{'Name'} eq $top->[0]) { + ++$top->[1]; + } + } + # within a replacement; just ignore everything return if (!defined($obj)); @@ -75,8 +89,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'}, 0, $obj ]; # # This is sort of ugly. We special-case replacement by outputting @@ -169,20 +182,24 @@ sub end_element { my $top = $stack->[scalar @$stack - 1]; if ($data->{'Name'} eq $top->[0]) { - my $obj = $self->{'obj'}; - - # did we just finish a clone operation? - if (ref($obj) eq 'XML::TemplateSAX::Buffer') { - for my $instance (@{$obj->{'ptr'}}) { - $self->{'obj'} = $instance; - $obj->replay($self); + if ($top->[1] == 0) { + my $obj = $self->{'obj'}; + + # did we just finish a clone operation? + if (ref($obj) eq 'XML::TemplateSAX::Buffer') { + for my $instance (@{$obj->{'ptr'}}) { + $self->{'obj'} = $instance; + $obj->replay($self); + } } - } - $self->SUPER::end_element($data); - $self->{'obj'} = $top->[1]; - pop @$stack; - return; + $self->SUPER::end_element($data); + $self->{'obj'} = $top->[2]; + pop @$stack; + return; + } else { + --$top->[1]; + } } }