Tipos de datos de plantilla compuesta
Un tipo de datos COMPOSITE consta de uno o varios valores que tienen los mismos tipos de datos o diferentes. Los compuestos pueden tener una longitud fija o variable (pero no indefinida). Este tipo de datos es similar al tipo de datos de estructura C lLanguage.
*DataType: COMPOSITE dirige una plantilla para definir un tipo de datos compuesto cuyos miembros pueden ser de diferentes tipos de datos. Los miembros del tipo de datos COMPOSITE se generarán como elementos secundarios XML individuales que pertenecen al elemento que representa el contexto envolvente. Si cada elemento secundario representa un primitivo de tipo de datos, el tipo de datos se definirá mediante el atributo XML xsi:type en cada elemento. Si se define un atributo GDL para que sea DataType : COMPOSITE, el contexto envolvente será el <elemento GDL_ATTRIBUTE> . El nombre del elemento de cada elemento secundario XML será la etiqueta correspondiente definida por La directiva: *ElementTags.
Si composite es un miembro de otro tipo de datos compuesto, se creará un elemento para representar ese contexto envolvente. El nombre de este elemento primario será la etiqueta correspondiente asignada por la plantilla que corresponde al tipo de datos compuesto envolvente.
Las directivas siguientes se usan para definir el tipo de datos COMPOSITE:
*ElementType (obligatorio). Nombre de la plantilla que define los tipos de datos de cada uno de los elementos. Se debe especificar un tipo de datos para cada elemento. Uno o varios elementos pueden tener el mismo tipo de datos. El número de ElementTypes proporcionados debe ser igual al valor ArraySize o Max que especifica *ArraySize .
*RequiredDelimiter (obligatorio). Cadena que separará sintácticamente cada elemento COMPOSITE de la siguiente. Dos delimitadores consecutivos se interpretarán como un elemento omitido. Los delimitadores no son necesarios para indicar la omisión de los elementos finales.
Debe tener mucho cuidado si usa espacios en blanco como delimitador o como parte de la cadena delimitador. Por ejemplo, el analizador interpretará caracteres de espacio extraños como indica los elementos omitidos; y como es posible que no vea espacios en blanco adicionales, pueden producirse errores de análisis extraños. Además, el exceso de espacios en blanco se quita rutinariamente del archivo de origen y el espacio en blanco se agrega a menudo al flujo de entrada como resultado del procesamiento de preprocesador, macro y comentario. Por lo tanto, la cadena real que se analiza podría tener un número completamente diferente de caracteres de espacio de los especificados originalmente. No debe usar caracteres de tabulación como parte de la cadena de delimitador necesaria porque se convierten rutinariamente en caracteres de espacio durante el procesamiento de entrada.
*OptionalDelimiter (Opcional). Cualquier cadena que se compone de caracteres especificados en *OptionalDelimiter que aparezca junto a la cadena *RequiredDelimiter se considerará parte del delimitador.
*ElementTags (obligatorio). El número de etiquetas proporcionadas debe ser igual al valor ArraySize o Max especificado por *ArraySize . Cada miembro se etiquetará con la etiqueta correspondiente. Este etiquetado es útil si se omiten uno o varios elementos. Cuando se omiten los elementos COMPOSITE, no se usa la etiqueta que corresponde al elemento omitido. Para evitar confundir al cliente, no use nombres de elementos reservados de instantáneaS GDL como nombres de etiqueta. Estos nombres reservados son CONSTRUCT, ATTRIBUTE y Personalidad.
*ArraySize (opcional). Si se omite esta directiva, se presupone un composite de tamaño fijo. El tamaño será igual al número de nombres de plantillas en *ElementType.
Use dos enteros para especificar el tamaño mínimo y máximo permitido para un COMPOSITE de tamaño variable. Tenga en cuenta que se permite cero para el tamaño mínimo. No se permiten tipos de datos COMPOSITE de tamaño ilimitado. No puede usar el carácter comodín GPD (*) para especificar el tamaño o el tamaño máximo.
*ArrayLabel (opcional). Si se especifica esta directiva, la lista de elementos COMPOSITE debe ir entre paréntesis y estar precedida por la etiqueta *ArrayLabel . Si no se especifica ninguna etiqueta en esta directiva, el paréntesis es opcional y no se permite ninguna etiqueta de precedimiento.
Tenga en cuenta la siguiente plantilla.
*Template: QUALNAME_EX
{
*Type: DATATYPE
*DataType: COMPOSITE
*ElementType: (SYMBOL, SYMBOL, INTEGER)
*RequiredDelimiter: "."
*ElementTags: (feature, option, resourceID)
}
La plantilla anterior define un tamaño fijo compuesto de dos tipos de datos SYMBOL y un entero. Composite está sin etiquetar. A cada elemento de COMPOSITE se le asigna un elemento ElementTag único. Estas etiquetas etiquetarán cada elemento de la salida XML para ayudar al cliente. Cada elemento está separado del siguiente exactamente por un punto (.); ningún otro carácter se considera parte del delimitador. *No se especifica ArraySize , por lo que se supone un tamaño COMPUESTO fijo. Dado que el tamaño COMPUESTO es fijo, no se permite ninguna omisión de miembro.
*DataType: las plantillas COMPUESTAs no generan un esquema correspondiente. En su lugar, se usa el esquema de las plantillas denominadas en la directiva *ElementType .
Por ejemplo, considere una plantilla SYMBOL que se define de la siguiente manera.
*Template: SYMBOL
{
*Type: DATATYPE
*DataType: FILTER_TYPE
*ElementType: XML_STRING
*FilterTypeName: "SYMBOLNAME"
}
Y tenga en cuenta la siguiente entrada de GDL.
*rcNameID: ( RESDLL.stdname.467 )
O bien, tenga en cuenta la siguiente entrada GDL que no tiene los paréntesis opcionales.
*rcNameID: RESDLL.stdname.467
Supongamos que la entrada GDL se interpreta mediante la siguiente plantilla de RC_NAME_ID.
*Template: RC_NAME_ID
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
La salida XML resultante será la siguiente.
<GDL_ATTRIBUTE Name="*rcNameID" >
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</GDL_ATTRIBUTE>
En el ejemplo siguiente se muestran los tipos de datos compuestos anidados mediante un tipo de datos INTERVAL que contiene un par de tipos de datos DATE, que representan un intervalo de tiempo. Cada tipo de datos DATE es un tipo de datos COMPOSITE de un tipo de datos MONTH, DAY y YEAR. El atributo VACATION GDL usa el tipo de datos INTERVAL para expresar un período de tiempo que un empleado podría estar ausente. La siguiente colección de plantillas lograría esta situación.
Plantilla de mes
*Template: MONTHS
{
*Type: DATATYPE
*DataType: ENUMERATOR
*XMLDataType: "months"
*EnumeratorList: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
}
Plantilla de día
*Template: DAY
{
*Inherits: INTEGER
*MinValue: 1
*MaxValue: 31
}
Plantilla de año
*Template: YEAR
{
*Inherits: INTEGER
*MinValue: 1900
*MaxValue: 2100
}
Plantilla de fecha
*Template: DATE
{
*Type: DATATYPE
*DataType: COMPOSITE
*ElementType: (MONTHS, DAY, YEAR)
*RequiredDelimiter: "-"
*ElementTags: (month, day, year)
}
Plantilla de intervalo
*Template: INTERVAL
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: DATE
*RequiredDelimiter: "to"
*OptionalDelimiter: "<20 09>"
*ElementTags: (start_date, end_date)
*ArraySize: 2
}
Plantilla de vacaciones
*Template: VACATION
{
*Name: "*VacationDates"
*Type: ATTRIBUTE
*ValueType: INTERVAL
}
Tenga en cuenta la siguiente entrada GDL.
*VacationDates: Dec-20-2001 to Jan-3-2002
Si esta entrada GDL se interpreta mediante la plantilla VACATION, la salida XML resultante será la siguiente.
<GDL_ATTRIBUTE Name="*VacationDates" >
<start_date >
<month xsi:type="GDLW_months">Dec</month>
<day xsi:type="GDLW_int">20</day>
<year xsi:type="GDLW_int">2001</year>
</start_date>
<end_date >
<month xsi:type="GDLW_months">Jan</month>
<day xsi:type="GDLW_int">3</day>
<year xsi:type="GDLW_int">2002</year>
</end_date>
</GDL_ATTRIBUTE>