]> git.sesse.net Git - xml-template/commitdiff
Try to handle the perl-sax issue differently.
authorsgunderson@bigfoot.com <>
Thu, 1 Mar 2007 14:22:27 +0000 (15:22 +0100)
committersgunderson@bigfoot.com <>
Thu, 1 Mar 2007 14:22:27 +0000 (15:22 +0100)
perl-sax/XML/TemplateSAX/Handler.pm

index 3ec394b86b45f95e3da86abd931b8d161300c6c0..e63ee4c8b04b3167161ca81963c5cab25155e502 100644 (file)
@@ -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') {