Condividi tramite


Tipi di dati modello XSD

Il tipo di dati XSD_DEFINED usa schemi per la definizione del tipo di dati. È possibile definire qualsiasi ComplexType o SimpleType.

*DataType: XSD_DEFINED crea una definizione del tipo di dati usando gli elementi XML xsd:complexType> o << xsd:simpleType> standard. Il valore dei dati dell'istanza verrà restituito come contenuto di un elemento XML il cui valore xsi:type è specificato dal valore *XMLDataType visualizzato in questo modello. Questo output consente di usare XSD per derivare nuovi tipi semplici o complessi e usarli negli attributi GDL.

Le direttive seguenti vengono usate per definire completamente il tipo di dati XSD_DEFINED:

  • *XMLDataType (obbligatorio). Nome (NCName) assegnato al tipo di dati XSD definito da questo modello. Questo nome è il valore dell'attributo name nell'elemento <complexType> o <simpleType> definito dalla direttiva *XSDTypeDefinition. Questo nome deve essere univoco per tutti i tipi XSD_DEFINED e ENUMERATOR. Per evitare conflitti con i tipi di dati definiti dal parser GDL, è consigliabile evitare nomi che iniziano con "GDL_" e "GDLW_". Lo standard XML definisce la sintassi per un NCName e potrebbe imporre restrizioni aggiuntive.

  • *XSDTypeDefinition (obbligatorio). XSD ben formato che definisce il tipo di dati. Solo gli <elementi complexType> o <simpleType> possono essere visualizzati nel contesto più vicino alla radice. Più <elementi complexType o <simpleType>> possono essere visualizzati come elementi di pari livello nel contesto radice se al massimo uno di essi viene effettivamente fatto riferimento come tipo di valore di un attributo GDL. Il nome del tipo a cui viene fatto riferimento come tipo valore di un attributo GDL è quello visualizzato nella direttiva *XMLDataType. È possibile fare riferimento ai tipi di dati rimanenti solo da altre <definizioni complexType> o <simpleType> .

    Le definizioni dei tipi possono anche fare riferimento ad altre definizioni di tipo definite in altri modelli. Quando si fa riferimento alle definizioni dei tipi all'interno di una direttiva *XSDTypeDefinition creata tramite la direttiva *XSDTypeDefinition, è necessario usare il prefisso dello spazio dei nomi gdl: .

    Se XSD occupa più righe o se viola le regole di sintassi GDL, deve essere racchiuso tra <delimitatori Begin/EndValue> . L'XSD definito in questi delimitatori verrà inserito nello schema XSD generato dal parser GDL. Si noti che le <definizioni complexType> a cui verrà fatto riferimento come ValueType di un attributo GDL non possono dichiarare attributi XML. Nello schema prodotto dal parser GDL lo spazio dei nomi XSD è lo spazio dei nomi predefinito, quindi i nomi degli elementi come <complexType> o <sequence> o <element> non necessitano di un qualificatore dello spazio dei nomi. Lo spazio dei nomi di destinazione è associato al prefisso gdl: .

  • *Complextype? (TRUE) | FALSE) (Facoltativo). Se questa direttiva è TRUE, il parser GDL farà riferimento a questa definizione come <complexContent durante l'estensione di questo tipo di dati. In caso contrario, viene fatto riferimento alla definizione come <simpleContent>>. Se questa direttiva non viene specificata, il parser presuppone che sia FALSE.

  • *ArrayLabel (facoltativo). Se questa direttiva viene specificata, il filtro del parser prevede che i valori di istanza di questo tipo siano racchiusi tra parentesi, preceduti dall'etichetta di matrice specificata.

La sintassi dell'istanza di valore dichiarata come di questo tipo di dati deve essere conforme alla sintassi definita dall'XSD fornita dalla direttiva *XSDTypeDefinition. Il parser fornirà il tag iniziale e finale per l'elemento e i dati dell'istanza del valore devono fornire solo il contenuto dell'elemento. Se la sintassi XML è in conflitto con le regole di sintassi GDL di base, il valore (o solo la parte in conflitto) deve essere racchiuso tra <i costrutti Begin/EndValue:> .

I valori XML con tali sintassi incompatibili o la cui sintassi non è compatibile con la sintassi utilizzata dai tipi di dati composti, non possono essere visualizzati come membri di un tipo di dati composto. Si noti inoltre che il parser GDL non eseguirà l'escape di caratteri XML speciali, ad esempio parentesi di apertura o chiusura (< o >) o di una e commerciale (&). L'autore dell'istanza del valore è responsabile della conformità alla sintassi XML per i dati di tipo carattere.

Si consideri ad esempio il modello seguente.

*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>
}

L'esempio precedente definisce un tipo definito da XSD denominato "USAddress" a cui può fare riferimento un attributo GDL come ValueType. Questo esempio XSD definisce effettivamente due tipi di dati: USAddress e zipCode. Il tipo zipCode non può essere fatto riferimento a un attributo GDL e può essere fatto riferimento solo dall'interno di un'altra definizione del tipo di dati XSD.

Nell'esempio seguente viene fatto riferimento al tipo zipCode nella dichiarazione dell'elemento <zip> . Si noti che viene fatto riferimento usando il prefisso dello spazio dei nomi gdl: . È anche possibile fare riferimento a zipCode da una definizione del tipo di dati XSD in un altro modello.

La definizione del modello precedente causerà la creazione della voce dello schema XML seguente (è il valore di *XSDTypeDefinition invariato).

    <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>

Il parser costruisce automaticamente un altro tipo di dati che definisce un nuovo tipo derivato dal tipo USAddress , ma con attributi XML aggiuntivi che potrebbero essere visualizzati nello snapshot. Se si utilizza il tipo di dati originale, si riceveranno errori di convalida dello schema perché il tipo originale non consentiva la visualizzazione degli attributi XML. Con questo approccio, non è necessario impostare gli attributi XML sintetizzati dal parser hardcode nei modelli e, se vengono aggiunti attributi aggiuntivi alle versioni future dello snapshot, non è necessario modificare i modelli esistenti.

Nell'esempio di codice seguente viene illustrata la definizione aggiuntiva del tipo di dati.

    <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 Il tipo di dati GDLW_USAddress è dichiarato complexContent <> perché il modello per USAddress set *ComplexType?: TRUE.

Si consideri la voce GDL seguente.

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

Si consideri anche il modello ADDRESS, che dichiara *Address GDL aAttribute per avere un *ValueType definito dal modello USAddress, come illustrato nell'esempio di codice seguente.

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

Se la voce GDL precedente viene interpretata usando il modello ADDRESS, si verificherà l'output XML risultante.

    <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>

L'attributo XML xsi:type definisce questa istanza dell'elemento ATTRIBUTE per contenere un tipo di dati definito da XSD denominato GDLW_USAddress. L'intero valore dell'istanza dell'attributo GDL viene inserito come contenuto dell'elemento nell'elemento <GDL_ATTRIBUTE> nello snapshot XML senza alcuna modifica. Pertanto, il valore deve essere XML valido e deve seguire tutte le regole di sintassi XML, ad esempio la rappresentazione di caratteri speciali.