choose

Elige un valor basándose en una condición que se cumple.

La expresión choose contiene:

Las condiciones se evalúan en orden descendente de las expresiones when, deteniéndose en la primera condición para pasar la prueba. Las condiciones subsiguientes no se evalúan.

La expresión choose refleja las sentencias if / else if /.../ else típicas de la mayoría de los lenguajes de programación. Se puede utilizar de forma efectiva para implementar una tabla de decisiones.

Puede tener en cuenta la posibilidad de ordenar las condiciones de manera que las que tienen más probabilidades de ser satisfactorias estén cerca de la parte superior de la lista (para evitar cálculos innecesarios).

aviso: Para condiciones simples (por ejemplo las que prueban la igualdad en un solo valor), normalmente puede reordenar las condiciones sin que ello afecte el comportamiento del conjunto de reglas.

Sin embargo, para condiciones más complejas (y, por tanto, en general), debe considerar detenidamente si la reordenación de las condiciones introducirá cambios de comportamiento no deseados.

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

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

    <Attribute name="ageCategory">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <choose>
          <!-- No hay ninguna <test> explícita, por lo tanto esta
               sentencia <choose> probará cada condición para
               ver si es verdadera (TRUE). -->
          <type>
            <javaclass name="String"/>
          </type>

          <!-- Tenga en cuenta que el orden de estas condiciones es
               importante; si tuviéramos que intercambiar las posiciones de las
               pruebas "Newborn" e "Infant", todos los niños
               de menos de 5 años (incluidos los que tienen menos de 1)
               se identificarán como bebés (Infants); ningún niño se
               identificará como recién nacido (Newborns).  -->
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="1"/>
              </compare>
            </condition>
            <value>
              <String value="Newborn"/>
            </value>
          </when>
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="5"/>
              </compare>
            </condition>
            <value>
              <String value="Infant"/>
            </value>
          </when>
          <when>
            <condition>
              <compare comparison="&lt;">
                <reference attribute="age"/>
                <Number value="18"/>
              </compare>
            </condition>
            <value>
              <String value="Child"/>
            </value>
          </when>
          <otherwise>
            <value>
              <String value="Adult"/>
            </value>
          </otherwise>
        </choose>
      </derivation>
    </Attribute>

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

    <Attribute name="maritalStatus">
      <type>
        <javaclass name="String"/>
      </type>
      <derivation>
        <choose>
          <type>
            <javaclass name="String"/>
          </type>
          <!-- Probar el número de cónyuges -->
          <test>
            <reference attribute="numberOfSpouses"/>
          </test>
          <!-- Tenga en cuenta que el orden de las pruebas "0" y "1" no importa -
               por lo tanto es aconsejable que los ordene en función de si  la mayoría de
               instancias de persona que se están probando tiene 0 o 1 cónyuges.
      -->
          <when>
            <condition>
              <Number value="0"/>
            </condition>
            <value>
              <String value="Unmarried"/>
            </value>
          </when>
          <when>
            <condition>
              <Number value="1"/>
            </condition>
            <value>
              <String value="Casado/a - cónyuge único"/>
            </value>
          </when>
          <otherwise>
            <value>
              <String value="Casado/a - varios cónyuges"/>
            </value>
          </otherwise>
        </choose>

      </derivation>
    </Attribute>

  </Class>

</RuleSet>