La solution
<schema xmlns="http://purl.oclc.org/dsdl/schematron">
<ns uri="http://www.schematron.info/arche" prefix="arc"/>
<pattern> (1)
<rule context="arc:animal[@sexe='male']"> (1a)
<report test="number(arc:age) > number(//arc:maxAgeReproduction/arc:animal_espece[arc:nom=current()/arc:espece]/arc:male)"> (1b)
Le mâle est trop âgé, Noé! Il ne pourra plus se reproduire.
Veille à la sélection naturelle.</report>
</rule>
<rule context="arc:animal[@sexe='femelle']"> (1a)
<report test="number(arc:age) > number(//arc:maxAgeReproduction/arc:animal_espece[arc:nom=current()/arc:espece]/arc:femelle)"> (1b)
La femelle est trop âgé, Noé! Elle ne pourra plus se reproduire.
Veille à la sélection narurelle.</report>
</rule>
</pattern>
<pattern>
<rule context="arc:charge"> (2)
<report test=". < sum(//arc:poids)"> (2a)
Noé, tu as trop d'animaux à bord. Le chargement dépasse le poids maximal
autorisé dans l'arche.</report>
</rule>
</pattern>
<pattern> (3)
<rule context="arc:animal[@carnivore='oui']">
<report test="parent::*/arc:animal[@carnivore='non']">
Il y a des carnivores et des herbivores dans un même compartiment.
Les animaux ne sont pas des ressources alimentaires!</report>
<report test="parent::*/arc:animal/arc:poid < (arc:poids div 2)">
Noé, ce carnivore est trop fort (lourd) pour ses compagnons de chambrée.
Il pourrait les utiliser comme un ressource alimentaire.</report>
</rule>
<rule context="arc:animal">
<report test="parent::*/arc:animal/arc:poids < (arc:poids div 10)">
Noé, l'animal est trop lourd pour ces compagnons de chambrée!
Il pourrait en piétiner un.</report>
</rule>
</pattern>
<pattern>
<rule context="arc:animal"> (4)
<report test="count(//arc:animal[arc:espece=current()/arc:espece]) > 2"> (4a)
Dans l'arche, se trouvent plus de deux animaux de cette espèce.</report>
<report test="count(parent::*/arc:animal[arc:espece=current()/arc:espece]) < 2"> (4b)
Dans ce compartiment, se trouvent moins de deux animaux de cette espèce.
</report>
<assert test="count(parent::*/arc:animal[arc:espece=current()/arc:espece][@sexe='male']) = 1"> (4c)
Un couple est toujours composé d'un mâle et d'une femelle.
</assert>
</rule>
</pattern>
<pattern>
<rule context="arc:chambre"> (5)
<report test="count(arc:chambre) > 6">
Noé, si tu places trop d'animaux dans un même compartiment, il se peut que cela ait
des conséquences néfastes sur la vie en communauté! Tu ne devrais pas mettre plus
de 6 animaux dans un même compartiment.
</report>
</rule>
</pattern>
</schema>
(1) | Une distinction doit être opérée entre les mâles et les femelles en ce qui concerne l'âge de reproduction, c'est pourquoi l'âge maximum de reproduction pour les mâles sera indiqué par l'élément <male> et pour les femelles par l'élément <femelle> .
| ||||||
(2) | La charge utile est indiquée par l'élément <charge> . Le respect de la charge utile ne doit être vérifié qu'une fois, c'est la raison pour laquelle l'élément <charge> a été choisi comme nœud de contexte.
| ||||||
(3) | Ce pattern a été déjà traité de manière détaillée. | ||||||
(4) | Cette règle vérifie pour chaque animal à l'aide d'une combinaison de trois tests, s'il y a dans l'arche plus d'un couple d'une même espèce, s'il a été placé dans le même compartiment et s'il se compose d'un mâle et d'une femelle.
| ||||||
(5) | Cette règle vérifie tous les éléments <chambre> . Le test compte le nombre d'animaux dans chaque chambre et vérifie si plus de six éléments <animal> ont été détectés. |
<< précédent |
Copyright © dpunkt.verlag GmbH 2011
Vous pouvez imprimer cette version en ligne pour un usage privé. Par ailleurs, ce chapitre du livre "Schematron - Effiziente Business Rules für XML-Dokumente" est soumis aux mêmes clauses prévues pour la version papier : L'intégralité de l'oeuvre est protégée par les droits d'auteurs. Tous droits réservés y compris la copie, la traduction, la reproduction sur microfilm, tout comme l'enregistrement et le traitement dans des systèmes électroniques.
dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, téléphone + 49 (0)6221-14830, fax + 49 (0)6221-148399, hallo(at)dpunkt.de