diff --git a/xmlschema/tests/test_models.py b/xmlschema/tests/test_models.py index e8e41c4..d47c691 100644 --- a/xmlschema/tests/test_models.py +++ b/xmlschema/tests/test_models.py @@ -630,6 +630,27 @@ class TestModelValidation11(TestModelValidation): self.assertIsNone(schema.validate(xml_data)) + def test_all_model_with_extended_occurs(self): + schema = self.schema_class( + """ + + + + + + + + + + + + + """) + + xml_data = '' + + self.assertIsNone(schema.validate(xml_data)) + class TestModelBasedSorting(XsdValidatorTestCase): diff --git a/xmlschema/validators/models.py b/xmlschema/validators/models.py index 46263a2..df921b0 100644 --- a/xmlschema/validators/models.py +++ b/xmlschema/validators/models.py @@ -440,7 +440,10 @@ class ModelVisitor(MutableSequence): item_occurs = occurs[item] model = self.group.model - if item_occurs: + if model == 'all': + return False + + elif item_occurs: self.match = True if model == 'choice': occurs[item] = 0 @@ -470,7 +473,7 @@ class ModelVisitor(MutableSequence): occurs[element] += 1 self.match = True if self.group.model == 'all': - pass + self.items = (e for e in self.group if not e.is_over(occurs[e])) elif not element.is_over(occurs[element]): return @@ -487,8 +490,6 @@ class ModelVisitor(MutableSequence): if obj is None: if not self.match: if self.group.model == 'all': - for e in self.group: - occurs[e] = occurs[(e,)] if all(e.min_occurs <= occurs[e] for e in self.group): occurs[self.group] = 1 group, expected = self.group, self.expected @@ -497,16 +498,14 @@ class ModelVisitor(MutableSequence): elif self.group.model != 'all': self.items, self.match = iter(self.group), False elif any(not e.is_over(occurs[e]) for e in self.group): - for e in self.group: - occurs[(e,)] += occurs[e] self.items, self.match = (e for e in self.group if not e.is_over(occurs[e])), False else: - for e in self.group: - occurs[(e,)] += occurs[e] occurs[self.group] = 1 elif not isinstance(obj, ModelGroup): # XsdElement or XsdAnyElement - self.element, occurs[obj] = obj, 0 + self.element = obj + if self.group.model != 'all': + occurs[obj] = 0 return else: @@ -515,7 +514,7 @@ class ModelVisitor(MutableSequence): occurs[obj] = 0 if obj.model == 'all': for e in obj: - occurs[(e,)] = 0 + occurs[e] = 0 except IndexError: # Model visit ended