| 7 | 1 package IMPL::DOM::Schema::NodeSet; | 
|  | 2 use strict; | 
|  | 3 use warnings; | 
|  | 4 | 
|  | 5 use base qw(IMPL::DOM::Schema::Item); | 
|  | 6 use IMPL::Class::Property; | 
|  | 7 | 
|  | 8 BEGIN { | 
|  | 9     public property UnexpectedMessage => prop_all; | 
|  | 10     public property MaxMessage => prop_all; | 
|  | 11     public property MinMessage => prop_all; | 
|  | 12 } | 
|  | 13 | 
|  | 14 sub Validate { | 
|  | 15     my ($this,$node) = @_; | 
|  | 16 | 
|  | 17     my @errors; | 
|  | 18 | 
|  | 19     my %nodes = map { | 
|  | 20         $_->nodeName , | 
|  | 21         {Schema => $_, Min => $_->minOccur, Max => $_->maxOccur, Seen => 0 } | 
|  | 22     } @{$this->childNodes}; | 
|  | 23 | 
|  | 24     foreach my $child ( @{$node->childNodes} ) { | 
|  | 25         if (my $info = $nodes{$child->nodeName}) { | 
|  | 26             $info->{Seen}++; | 
|  | 27             push @errors,{ | 
|  | 28                 Error => 1, | 
|  | 29                 Source => $this, | 
|  | 30                 Node => $child, | 
|  | 31                 Message => $this->MaxMessage | 
|  | 32             } if ($info->{Seen} > $info->{Max}); | 
|  | 33 | 
|  | 34             push @errors,$info->{Schema}->Validate($child); | 
|  | 35         } else { | 
|  | 36             push @errors, { | 
|  | 37                 Error => 1, | 
|  | 38                 Source => $this, | 
|  | 39                 Node => $child, | 
|  | 40                 Message => $this->UnexpectedMessage | 
|  | 41             } | 
|  | 42         } | 
|  | 43     } | 
|  | 44 | 
|  | 45     foreach my $info (values %nodes) { | 
|  | 46         push @errors, { | 
|  | 47             Error => 1, | 
|  | 48             Source => $this, | 
|  | 49             Message => $this->MinMessage | 
|  | 50         } if $info->{Min} > $info->{Seen}; | 
|  | 51     } | 
|  | 52 | 
|  | 53     return @errors; | 
|  | 54 } | 
|  | 55 | 
|  | 56 1; | 
|  | 57 | 
|  | 58 __END__ | 
|  | 59 | 
|  | 60 =pod | 
|  | 61 | 
|  | 62 =head1 DESCRIPTION | 
|  | 63 | 
|  | 64    .   . | 
|  | 65  C<IMPL::DOM::Schema::ComplexNode>  C<IMPL::DOM::Schema::SimpleNode>. | 
|  | 66 | 
|  | 67    , | 
|  | 68   , | 
|  | 69   . | 
|  | 70 | 
|  | 71 =cut |