Solución

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>                                                                       (1)
    <rule context="arc:animal[@sexo='macho']">                                    (1a)
      <report test="number(arc:edad) &gt; number(//arc:limiteedadreproductiva/arc:animal_especie[arc:name=current()/arc:especie]/arc:macho)"> (1b)
      ¡Noé, el macho es muy viejo! No podrá reproducirse. 
      Ten en cuenta la selección natural.</report>
    </rule>
    <rule context="arc:animal[@sexo='hembra']">                                   (1a)
      <report test="number(arc:edad) &gt; number(//arc:limiteedadreproductiva/arc:animal_especie[arc:name=current()/arc:especie]/arc:hembra)"> (1b)
      ¡Noé, la hembra es muy vieja! No podrá reproducirse. 
      Ten en cuenta la selección natural.</report>
    </rule>
  </pattern>
 
  <pattern>
    <rule context="arc:capacidad de carga">                                       (2)
      <report test=". &lt; sum(//arc:peso)">                                      (2a)
      Noé, hay muchos animales a bordo. La carga sobrepasa 
      la capacidad máxima del arca.</report>
    </rule>
  </pattern>

  <pattern>                                                                       (3)
    <rule context="arc:animal[@carnivoro='sí']">
      <report test="parent::*/arc:animal[@carnivoro='no']">
      Hay animales carnívoros y herbívoros en un mismo compartimento. 
      ¡Los animales no pueden ser utilizados como fuente de comida!</report>
      <report test="parent::*/arc:animal/arc:peso &lt; (arc:peso div 2)">
      Noé, este animal carnívoro es muy fuerte para su compañero. 
      Podría usarlo como fuente de comida.</report>
    </rule>
    <rule context="arc:animal">
      <report test="parent::*/arc:animal/arc:peso &lt; (arc:peso div 10)">
      Noé, este animal es demasiado grande para su compañero. 
      Lo podría aplastar.</report>
    </rule>
  </pattern>
 
  <pattern>
    <rule context="arc:animal">                                                     (4)
      <report test="count(//arc:animal[arc:especie=current()/arc:especie]) &gt; 2"> (4a)
      En el arca hay más de dos animales de esta especie.</report>
      <report test="count(parent::*/arc:animal[arc:especie=current()/arc:especie]) &lt; 2"> (4b)
      En el arca hay menos de dos animales de esta especie.</report>
      <assert test="count(parent::*/arc:animal[arc:especie=current()/arc:especie][@sexo='macho']) = 1"> (4c)
      Cada pareja debe consistir en un macho y una hembra.
      </assert>
    </rule>
  </pattern>
 
  <pattern>
    <rule context="arc:compartimento">                                               (5)
      <report test="count(arc:animal) &gt; 6">
      ¡Noé, has metido muchos animales en un mismo compartimento! Esto puede tener 
      efectos negativos en la convivencia de los animales. No deberías 
      meter más de 6 animales en un mismo compartimento.
      </report>
    </rule>
  </pattern>
</schema>
(1) Con respecto a la edad reproductiva debe diferenciarse entre machos y hembras, ya que la edad reproductiva máxima se especifica respectivamente dentro de los elementos <macho> y <hembra>.
(a) El nodo de contexto se coloca en el elemento <animal>, puesto que la edad debe comprobarse para cada animal.</animal>
(b) Los tests aquí definidos comparan la edad respectiva de los animales con la edad indicada en el contenedor <edad-reproductiva-maxima>. Para ello se selecciona el elemento <especie-animal> que contenga un elemento <nombre> que se corresponda con el elemento <especie> del nodo de contexto. La edad reproductiva máxima se extraerá del elemento <macho> o <hembra> del elemento <especie-animal> correspondiente. Puesto que aquí no se especifica el tipo de datos y se trata de una comparación de dos números, es necesario convertir ambos en un valor numérico con la función number().
(2) La carga útil del arca se especifica en el elemento <carga-util>. El cumplimiento de la carga máxima sólo debe comprobarse una vez, por ello se selecciona el elemento <carga-util> como nodo de contexto.
(a) Para este test se suman todos los elementos <peso> del documento y se comprueba si la suma es menor que el valor de la carga útil.
 
(3) Esta plantilla ya la hemos examinado con detenimiento.

(4) Con esta regla se realizan tres tests para cada animal para comprobar que de esta especie no exista más de una pareja en el arca, que los dos se encuentren en un mismo compartimento y que la pareja se componga de un macho y una hembra.

(a) En este test se cuentan los animales (con la función count ()) que contienen el mismo elemento <art> que el nodo de contexto. El test está construido de manera que el resultado no puede ser mayor que 2. De esta manera se comprueba con este test que no haya en el arca más de dos animales de una misma especie.
(b) En el segundo test se comprueba si han sido alojadas al menos dos animales de esta especie en el mismo compartimento. Puesto que en el test anterior se comprobó que no hay más de dos animales de esta especie en el arca, se comprueba, a partir de la combinación de ambos tests, que debe alojarse exactamente una pareja en el mismo compartimento.
(c) Para el tercer test hacemos uso de una condición que en combinación con los otros tests comprobará si cada pareja se compone de un macho y una hembra.

(5) Esta regla examina todos los elementos <compartimento>. El test cuenta el número de animales en cada compartimento y comprueba si hay contenidos más de seis elementos <animal>.

<< anterior

 

 

 


Derechos de autor © dpunkt.verlag GmbH 2011
El usuario podrá imprimir la versión online. La copia será exclusivamente para uso personal. Por lo demás el presente capítulo del libro publicado en lengua alemana "Schematron - Effiziente Business Rules für XML-Dokumente" está sometido a los mismos términos y condiciones que la versión impresa. La presente obra está protegida en su totalidad por la ley de propiedad intelectual. Reservados todos los derechos, incluyendo los derechos de reproducción, traducción, microfilmación, así como el almacenamiento y procesamiento en sistemas electrónicos.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, teléfono + 49 (0) 6221 14830, fax + 49 (0) 6221 148399, hallo(at)dpunkt.de