reference

Recupera el valor de un atributo de un objeto de regla.

La expresión reference puede contener opcionalmente una expresión hijo que determina el objeto de regla a partir de la cual se puede obtener el atributo; si se omite, se utilizará el objeto de regla que contiene reference.

La expresión reference es la clave para crear reglas que son reutilizables y comprensibles. Puede utilizar reference en un atributo con nombre en lugar de cualquier expresión. El validador de conjunto de reglas CER emitirá un error si el tipo de atributo de referencia no coincide con el tipo requerido por la expresión.

<?xml version="1.0" encoding="UTF-8"?>
<RuleSet name="Example_reference"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
"http://www.curamsoftware.com/CreoleRulesSchema.xsd">
  <Class name="Person">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="age">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Una simple referencia a otro
         atributo en esta clase de regla -->
    <Attribute name="ageNextYear">
      <type>
        <javaclass name="Number"/>
      </type>
      <derivation>
        <arithmetic operation="+">
          <!-- Esta <reference> no tiene elementos hijo,
               de modo que se toma el objeto de regla para que sea "este
 objeto de regla"-->
          <reference attribute="age"/>
          <Number value="1"/>
        </arithmetic>
      </derivation>
    </Attribute>

    <Attribute name="favoritePet">
      <type>
        <ruleclass name="Pet"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Pet">

    <Attribute name="name">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <Attribute name="species">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

  </Class>

  <Class name="Household">

    <!-- Todas las personas de la unidad familiar -->
    <Attribute name="members">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Se designa a una persona especial
         como el "cabeza" de familia -->
    <Attribute name="headOfHousehold">
      <type>
        <ruleclass name="Person"/>
      </type>
      <derivation>
        <specified/>
      </derivation>
    </Attribute>

    <!-- Una referencia a un atributo en un
         objeto de regla diferente:

    name OF favoritePet OF headOfHousehold

    En un lenguaje de programación, esto se puede
    escribir al revés utilizando una notación de
    "puntos" de desreferencia como la siguiente:

    headOfHousehold.favoritePet.name

    -->
    <Attribute name="nameOfHeadOfHouseholdsFavoritePet">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>

        <!-- El nombre... -->
        <reference attribute="name">

          <!-- ...de la mascota favorita... -->
          <reference attribute="favoritePet">

            <!-- ...del cabeza de familia. -->
            <!-- La referencia más interna debe hacer referencia a
                   un atributo en este objeto de regla.-->
            <reference attribute="headOfHousehold"/>
          </reference>
        </reference>
      </derivation>
    </Attribute>


    <!-- Identifica a los propietarios de perros de la unidad familiar
         comprobando qué personas tienen una mascota
         favorita que sea un perro. -->
    <Attribute name="dogOwners">
      <type>
        <javaclass name="List">
          <ruleclass name="Person"/>
        </javaclass>
      </type>
      <derivation>
        <filter>
          <list>
            <!-- referencia simple a los miembros
                 de la unidad familiar -->
            <reference attribute="members"/>
          </list>
          <listitemexpression>
            <equals>
              <String value="Dog"/>
              <!-- Una referencia a un atributo en un elemento
                   de la lista. -->

              <reference attribute="species">
                <reference attribute="favoritePet">
                  <current/>
                </reference>
              </reference>

            </equals>

          </listitemexpression>
        </filter>
      </derivation>
    </Attribute>

  </Class>

</RuleSet>