Compartir a través de


Tipos de datos de plantilla XSD

El tipo de datos XSD_DEFINED usa esquemas para la definición del tipo de datos. Puede definir cualquier ComplexType o SimpleType.

*DataType: XSD_DEFINED crea una definición de tipo de datos mediante los elementos xml xsd:complexType> o < xsd:simpleType> estándar<. El valor de datos de instancia se generará como el contenido de un elemento XML cuyo xsi:type se especifica mediante el valor de *XMLDataType que aparece en esta plantilla. Esta salida permite usar XSD para derivar nuevos tipos simples o complejos y usarlos en atributos GDL.

Las siguientes directivas se usan para definir completamente el tipo de datos XSD_DEFINED:

  • *XMLDataType (obligatorio). Nombre (NCName) que se ha asignado al tipo de datos XSD que define esta plantilla. Este nombre es el valor del atributo name en el <elemento complexType> o <simpleType> que define la directiva *XSDTypeDefinition. Este nombre debe ser único para todos los tipos XSD_DEFINED y ENUMERATOR. Para evitar conflictos con los tipos de datos que define el analizador de GDL, debe evitar nombres que comiencen por "GDL_" y "GDLW_". El estándar XML define la sintaxis de un NCName y puede imponer restricciones adicionales.

  • *XSDTypeDefinition (obligatorio). XSD con formato correcto que define el tipo de datos. Solo los <elementos complexType> o <simpleType> pueden aparecer en el contexto más cercano a la raíz. Varios <elementos complexType> o <simpleType> pueden aparecer como elementos del mismo nivel en el contexto raíz-más si solo se hace referencia a uno de ellos como el tipo de valor de un atributo GDL. El nombre del tipo al que se hace referencia como el tipo de valor de un atributo GDL es el que aparece en la directiva *XMLDataType. Solo se puede hacer referencia a los tipos de datos restantes desde otras <definiciones complexType> o <simpleType> .

    Las definiciones de tipo también pueden hacer referencia a otras definiciones de tipo definidas en otras plantillas. Al hacer referencia a definiciones de tipo dentro de una directiva *XSDTypeDefinition creada mediante la directiva *XSDTypeDefinition, debe usar el prefijo gdl: espacio de nombres.

    Si el XSD ocupa varias líneas o si infringe las reglas de sintaxis de GDL, debe ir entrelimitadores <Begin/EndValue> . El XSD que se define en estos delimitadores se insertará en el esquema XSD que genera el analizador de GDL. Tenga en cuenta que las <definiciones complexType> a las que se hará referencia como ValueType de un atributo GDL no pueden declarar ningún atributo XML. En el esquema que genera el analizador de GDL, el espacio de nombres XSD es el espacio de nombres predeterminado, por lo que los nombres de elementos como <complexType> o <sequence> o <element> no necesitan un calificador de espacio de nombres. El espacio de nombres de destino está asociado al prefijo gdl: .

  • *¿Complextype? (TRUE | FALSE) (Opcional). Si esta directiva es TRUE, el analizador de GDL hará referencia a esta definición como <complexContent> al extender este tipo de datos; de lo contrario, se hace referencia a la definición como <simpleContent>. Si no se especifica esta directiva, el analizador asume que es FALSE.

  • *ArrayLabel (opcional). Si se especifica esta directiva, el filtro del analizador espera que los valores de instancia de este tipo se incluyan entre paréntesis, precedidos por la etiqueta de matriz especificada.

La sintaxis de la instancia de valor declarada como de este tipo de datos debe cumplir la sintaxis definida por el XSD que proporciona la directiva *XSDTypeDefinition. El analizador proporcionará la etiqueta start y end para el elemento y los datos de la instancia de valor solo deben proporcionar el contenido del elemento. Si la sintaxis XML entra en conflicto con las reglas de sintaxis básicas de GDL, el valor (o simplemente la parte en conflicto) debe ir entre <las construcciones Begin/EndValue:> .

Los valores XML con estas sintaxis incompatibles o cuya sintaxis no es compatible con la sintaxis que usan los tipos de datos compuestos, no pueden aparecer como miembro de un tipo de datos compuesto. Tenga en cuenta también que el analizador de GDL no escapará caracteres XML especiales como corchetes de apertura o cierre (< o >) o una y comercial (&). El creador de la instancia de valor es responsable de cumplir la sintaxis XML de los datos de caracteres.

Por ejemplo, considere la siguiente plantilla.

*Template:  USAddress
{
    *Type:  DATATYPE
    *DataType:   XSD_DEFINED
    *ComplexType?: TRUE
    *XMLDataType: "USAddress"
    *XSDTypeDefinition:<BeginValue:XSD>
    <complexType name="USAddress">
        <sequence>
            <element name="name"   type="string"/>
            <element name="street" type="string"/>
            <element name="city"   type="string"/>
            <element name="state"  type="string"/>
            <element name="zip"    type="gdl:zipCode"/>
        </sequence>
    </complexType>

<simpleType name="zipCode">
 <restriction base="integer">
  <minInclusive value="10000"/>
  <maxInclusive value="99999"/>
 </restriction>
</simpleType><EndValue:XSD>
}

En el ejemplo anterior se define un tipo definido por XSD denominado "USAddress" al que puede hacer referencia un atributo GDL como valueType. En realidad, este ejemplo de XSD define dos tipos de datos: USAddress y zipCode. No se puede hacer referencia al tipo zipCode mediante un atributo GDL y solo se puede hacer referencia desde dentro de otra definición de tipo de datos XSD.

En el ejemplo siguiente, se hace referencia al tipo zipCode en la declaración del <elemento zip> . Tenga en cuenta que se hace referencia mediante el prefijo gdl: espacio de nombres. también se puede hacer referencia a zipCode desde una definición de tipo de datos XSD en otra plantilla.

La definición de plantilla anterior provocará la creación de la siguiente entrada de esquema XML (es el valor de *XSDTypeDefinition sin cambios).

    <complexType name="USAddress">
        <sequence>
            <element name="name"   type="string"/>
            <element name="street" type="string"/>
            <element name="city"   type="string"/>
            <element name="state"  type="string"/>
            <element name="zip"    type="gdl:zipCode"/>
        </sequence>
    </complexType>

    <simpleType name="zipCode">
        <restriction base="integer">
            <minInclusive value="10000"/>
            <maxInclusive value="99999"/>
        </restriction>
    </simpleType>

El analizador construye automáticamente otro tipo de datos que define un nuevo tipo que se deriva del tipo USAddress , pero que tiene atributos XML adicionales que pueden aparecer en la instantánea. Si usa el tipo de datos original, recibirá errores de validación de esquema porque el tipo original no permitió que aparezcan atributos XML. Con este enfoque, no es necesario codificar de forma rígida atributos XML sintetizados por el analizador en las plantillas y, si se agregan atributos adicionales a versiones futuras de la instantánea, no es necesario modificar las plantillas existentes.

En el ejemplo de código siguiente se muestra la definición de tipo de datos adicional.

    <complexType name = "GDLW_USAddress">
        <complexContent>
            <extension base="gdl:USAddress">
                <attribute name="Name" type="string" use="optional"/>
                <attribute name="Personality" type="string" use="optional"/>
            </extension>
        </complexContent>
    </complexType>

Nota El tipo de datos GDLW_USAddress se declara como <complexContent> porque la plantilla para USAddress establece *ComplexType?: TRUE.

Tenga en cuenta la siguiente entrada de GDL.

*Address: <BeginValue:XML> 
   <name>Alice Smith</name>
   <street>123 Maple Street</street>
   <city>Mill Valley</city>
   <state>CA</state>
   <zip>90952</zip>
<EndValue:XML>

Y considere la plantilla ADDRESS, que declara el *GDL de dirección aAttribute para tener un *ValueType definido por la plantilla USAddress, como se muestra en el ejemplo de código siguiente.

*Template:  ADDRESS
{
    *Name: "*Address"
    *Type:  ATTRIBUTE
    *ValueType:  USAddress
}

Si la entrada de GDL anterior se interpreta mediante la plantilla ADDRESS, se produciría la salida XML resultante.

    <GDL_ATTRIBUTE Name="*Address"  xsi:type="GDLW_USAddress" >
    <name>Ben Smith</name>
    <street>123 Maple Street</street>
    <city>Mill Valley</city>
    <state>CA</state>
    <zip>90952</zip>
    </GDL_ATTRIBUTE>

El atributo XML xsi:type define esta instancia del elemento ATTRIBUTE para contener un tipo de datos definido por XSD denominado GDLW_USAddress. El valor completo de la instancia de atributo GDL se inserta como contenido de elemento en el <elemento GDL_ATTRIBUTE> de la instantánea XML sin ninguna modificación. Por lo tanto, el valor debe ser XML válido y debe seguir todas las reglas de sintaxis XML, como la representación de caracteres especiales.