El principio de las reglas de negocio

El principio de las reglas de negocio no tiene su origen en Schematron. Los esquemas de Schematron se utilizan sólo para formular reglas de negocio para la comprobación de documentos XML. Las reglas de negocio son las condiciones que podemos imponer a una instancia XML. Un ejemplo de regla de negocio que podemos formular en relación a nuestro ejemplo del arca es la siguiente:

Los animales carnívoros no se podrán alojar en un mismo compartimento junto con animales herbívoros.

En Schematron se utilizan reglas (elementos <rule>), que podrán englobar varias reglas de negocio. Igualmente, es posible que se necesiten varias reglas de Schematron para definir una regla de negocio. Una regla de negocio define determinados criterios en relación con un contexto, con los que se comprobará un documento.

A la hora de fijar un nodo de contexto, no deberá tratarse necesariamente de un único nodo. Es posible también abarcar un conjunto de nodos, por ejemplo, todos los elementos que posean un nombre concreto. Los criterios para la comprobación se definen mediante tests asignados a una regla. Si un test falla, se mostrará el aviso de error que se haya definido previamente para tal caso. Los nodos de contexto del ejemplo anterior del arca serían los animales carnívoros. El criterio a consultar sería pues que estos animales no se encuentren junto con un animal herbívoro en el mismo compartimento. Las variaciones mostradas a continuación muestran que en Schematron es posible definir una determinada regla de negocio mediante reglas Schematron con distintos nodos de contexto:

Los animales carnívoros no se podrán alojar en un mismo compartimento junto con animales herbívoros.
Un compartimento podrá albergar, bien sólo animales carnívoros, o bien sólo animales herbívoros.

Las reglas correspondientes tendrían así diferentes nodos de contexto: animales carnívoros o compartimentos. De ello resulta una formulación diferente del test correspondiente.

 

¿Cómo se define una regla de negocio?
Ahora dejaremos la teoría a un lado. La puesta en práctica de reglas de negocio en Schematron ya no será una cuestión demasiado difícil. El elemento <rule> contiene las reglas y el atributo context determina el nodo de contexto. El elemento <rule> contiene además los tests o condiciones que se asignarán a las reglas.

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
   <ns uri="http://www.schematron.info/arche" prefix="arc"/>
   <pattern>
      <rule context="arc:animal[@carnívoro='sí']">               (1)
         <report test="parent::*/arc:animal[@carnívoro='no']">
          Hay animales carnívoros y herbívoros en un mismo compartimento. 
          ¡Los animales no pueden ser utilizados como fuente de comida!
         </report>
      </rule>
   </pattern>
</schema>

(1) La regla se aplica a todos los elemetos <animal> de la instancia cuyos atributos carnívoro poseen el valor . Al aplicar una regla a un elemento se comprueban cada uno de los tests definidos en la regla para ese elemento.

Nota para expertos en XSLT:

El principio de las reglas de negocio se corresponde con el principio de las plantillas en XSLT con el atributo match. En una implementación para transformar Schematron en XSLT todas las reglas se convierten de manera interna en plantillas y los valores de los atributos context se transfieren a atributos match. La transformación de nuestro ejemplo genera el siguiente resultado:

<xsl:template match="arc:animal[@carnivoro='sí']">
     […]
     <!-- Los tests se convierten en elementos xsl:if -->
     […]
</xsl:template>

En la expresión XPath para la selección del nodo de contexto pueden también estar contenidas condiciones en forma de predicados. En el ejemplo anterior se quiere comprobar si un animal carnívoro ha sido alojado junto con uno herbívoro. Esta condición puede ampliarse con ayuda de predicados adicionales. Por ejemplo, se puede comprobar si un carnívoro macho y un herbívoro se encuentran en un mismo compartimento.

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>
    <rule context="arc:animal[@carnivoro='sí'] [@genero='macho']"> (1)
      <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>
    </rule>
  </pattern>
</schema>
(1) La expresión XPath en en atributo context se amplia con un predicado adicional. Ahora se aplica la regla sólo a animales que sean carnívoros y machos. Otro test comprobará si un herbívoro se encuentra en el mismo compartimento.

No obstante, esta forma de preselección no es realmente necesaria. Es posible trasladar los mismos criterios a una consulta realizada con un test. No obstante, puesto que el atributo context deternima los nodos a los que se aplica la regla, una preselección permite minimizar considerablemente el número de reglas a ejecutar, lo que favorece un mejor rendimiento del proceso. Además, esto simplifica las expresiones XPath de los siguientes tests.

<< anterior siguiente >>

 

 

 


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