XSD-malldatatyper

Den XSD_DEFINED datatypen använder scheman för definitionen av datatypen. Du kan definiera valfri ComplexType eller SimpleType.

*DataType: XSD_DEFINED skapar en datatypsdefinition med hjälp av standardelementen <xsd:complexType> eller < xsd:simpleType> XML. Instansdatavärdet matas ut som innehållet i ett XML-element vars xsi:type anges av värdet för *XMLDataType som visas i den här mallen. Med det här utdata kan du använda XSD för att härleda nya enkla eller komplexa typer och använda dem i GDL-attribut.

Följande direktiv används för att helt definiera XSD_DEFINED datatyp:

  • *XMLDataType (krävs). Namnet (NCName) som har tilldelats till den XSD-datatyp som mallen definierar. Det här namnet är värdet för namnattributet i elementet <complexType> eller <simpleType> som direktivet *XSDTypeDefinition definierar. Det här namnet måste vara unikt för alla XSD_DEFINED- och ENUMERATOR-typer. För att undvika konflikter med datatyper som GDL-parsern definierar bör du undvika namn som börjar med "GDL_" och "GDLW_". XML-standarden definierar syntaxen för ett NCName och kan medföra ytterligare begränsningar.

  • *XSDTypeDefinition (krävs). Den välformade XSD som definierar datatypen. Endast elementen <complexType> eller <simpleType> kan visas i den kontext som är närmast roten. Flera <complexType-> eller <simpleType-element> kan visas som syskon i den mest rotkontexten om bara ett av dem faktiskt refereras som värdetypen för ett GDL-attribut. Namnet på den typ som refereras till som värdetyp för ett GDL-attribut är det som visas i *XMLDataType-direktivet. De återstående datatyperna kan bara refereras inifrån andra <complexType-> eller <simpleType-definitioner> .

    Typdefinitioner kan också referera till andra typdefinitioner som definieras i andra mallar. När du refererar till typdefinitioner i ett *XSDTypeDefinition-direktiv som skapades med hjälp av *XSDTypeDefinition-direktivet måste du använda prefixet gdl: namespace.

    Om XSD upptar flera rader eller om den bryter mot GDL-syntaxregler måste den omges av <Begin/EndValue-avgränsare> . Den XSD som definieras i dessa avgränsare infogas i XSD-schemat som GDL-parsern genererar. Observera att de <complexType-definitioner> som ska refereras till som ValueType för ett GDL-attribut inte kan deklarera några XML-attribut. I det schema som GDL-parsern skapar är XSD-namnområdet standardnamnområdet, så elementnamn som <complexType> eller <sekvens> eller <element> behöver ingen namnområdeskvalificerare. Målnamnområdet är associerat med prefixet gdl: .

  • *ComplexType? (SANT | FALSKT) (Valfritt). Om det här direktivet är TRUE refererar GDL-parsern till den här definitionen som <complexContent> när du utökar den här datatypen. Annars refereras definitionen som <simpleContent>. Om det här direktivet inte anges förutsätter parsern att det är FALSE.

  • *ArrayLabel (valfritt). Om det här direktivet anges förväntar sig parsningsfiltret att instansvärdena för den här typen ska omges av parenteser, föregås av den angivna matrisetiketten.

Syntaxen för den värdeinstans som deklareras vara av den här datatypen måste följa den syntax som definieras av den XSD som *XSDTypeDefinition-direktivet tillhandahåller. Parsern tillhandahåller start- och sluttaggen för elementet och värdeinstansdata ska endast ange elementinnehållet. Om XML-syntaxen står i konflikt med de grundläggande GDL-syntaxreglerna, måste värdet (eller bara den motstridiga delen) omslutas av <Begin/EndValue:>-konstruktioner.

XML-värden med sådana inkompatibla syntaxer, eller vars syntax är inkompatibel med den syntax som sammansatta datatyper använder, kan inte visas som medlem i en sammansatt datatyp. Observera också att GDL-parsern inte kommer att undkomma särskilda XML-tecken som att öppna eller stänga hakparenteser (< eller >) eller ett et-tecken (&). Skaparen av värdeinstansen ansvarar för att följa XML-syntaxen för teckendata.

Tänk till exempel på följande mall.

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

Föregående exempel definierar en XSD-definierad typ med namnet "USAddress" som kan refereras av ett GDL-attribut som dess ValueType. Det här XSD-exemplet definierar faktiskt två datatyper: USAddress och zipCode. ZipCode-typen kan inte refereras till av ett GDL-attribut och kan endast refereras inifrån en annan XSD-datatypdefinition.

I följande exempel refereras zipCode-typen i zip-elementets <> deklaration. Observera att det refereras med hjälp av prefixet gdl: namespace. zipCode kan också refereras från en XSD-datatypsdefinition i en annan mall.

Den föregående malldefinitionen gör att följande XML-schemapost skapas (det är värdet för *XSDTypeDefinition oförändrat).

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

Parsern konstruerar automatiskt en annan datatyp som definierar en ny typ som härleds från USAddress-typen , men som har ytterligare XML-attribut som kan visas i ögonblicksbilden. Om du använder den ursprungliga datatypen får du schemavalideringsfel eftersom den ursprungliga typen inte tillät att xml-attribut visas. Med den här metoden behöver du inte hårdkoda parsersyntetiserade XML-attribut i dina mallar, och om ytterligare attribut läggs till i framtida versioner av ögonblicksbilden behöver du inte ändra de befintliga mallarna.

I följande kodexempel visas den ytterligare datatypsdefinitionen.

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

Obs Datatypen GDLW_USAddress deklareras som <complexContent> eftersom mallen för USAddress har *ComplexType?: TRUE.

Överväg följande GDL-post.

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

Och tänk på ADRESS-mallen, som deklarerar att *Address GDL aAttribute har en *ValueType som definieras av mallen USAddress, som följande kodexempel visar.

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

Om den tidigare GDL-posten tolkas med hjälp av adressmallen skulle resulterande XML-utdata ske.

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

XML-attributet xsi:type definierar den här instansen av ATTRIBUTE-elementet för att innehålla en XSD-definierad datatyp med namnet GDLW_USAddress. Hela värdet för GDL-attributinstansen infogas som elementinnehåll i <GDL_ATTRIBUTE-elementet> i XML-ögonblicksbilden utan någon ändring. Värdet måste därför vara giltigt XML och måste följa alla XML-syntaxregler, till exempel representation av specialtecken.