Partilhar via


Tipos de dados de modelo XSD

O tipo de dados XSD_DEFINED usa esquemas para a definição do tipo de dados. Você pode definir qualquer ComplexType ou SimpleType.

*DataType: XSD_DEFINED cria uma definição de tipo de dados usando os elementos XML xsd:complexType> ou < xsd:simpleType> padrão<. O valor de dados da instância será gerado como o conteúdo de um elemento XML cujo xsi:type é especificado pelo valor de *XMLDataType que aparece neste modelo. Essa saída permite que você use o XSD para derivar novos tipos simples ou complexos e usá-los em atributos GDL.

As seguintes diretivas são usadas para definir completamente o tipo de dados XSD_DEFINED:

  • *XMLDataType (Obrigatório). O nome (NCName) que foi atribuído ao tipo de dados XSD que este modelo está definindo. Esse nome é o valor do atributo name no <elemento complexType> ou <simpleType> que a diretiva *XSDTypeDefinition define. Esse nome deve ser exclusivo para todos os tipos XSD_DEFINED e ENUMERATOR. Para evitar conflitos com tipos de dados definidos pelo analisador GDL, você deve evitar nomes que começam com "GDL_" e "GDLW_". O padrão XML define a sintaxe de um NCName e pode impor restrições adicionais.

  • *XSDTypeDefinition (Obrigatório). O XSD bem formado que define o tipo de dados. Somente os <elementos complexType> ou <simpleType> podem aparecer no contexto mais próximo da raiz. Vários <elementos complexType> ou <simpleType> podem aparecer como irmãos no contexto mais raiz se, no máximo, apenas um deles for realmente referenciado como o tipo de valor de um atributo GDL. O nome do tipo referenciado como o tipo de valor de um atributo GDL é aquele que aparece na diretiva *XMLDataType. Os tipos de dados restantes só podem ser referenciados de dentro de outras <definições complexType> ou <simpleType> .

    As definições de tipo também podem referenciar outras definições de tipo definidas em outros modelos. Ao referenciar definições de tipo em uma diretiva *XSDTypeDefinition que foram criadas usando a diretiva *XSDTypeDefinition, você deve usar o prefixo de namespace gdl: .

    Se o XSD ocupar várias linhas ou se violar regras de sintaxe GDL, ele deverá ser colocado entre <delimitadores Begin/EndValue> . O XSD definido nesses delimitadores será inserido no esquema XSD gerado pelo analisador GDL. Observe que as <definições complexType> que serão referenciadas como ValueType de um atributo GDL não podem declarar nenhum atributo XML. No esquema que o analisador GDL produz, o namespace XSD é o namespace padrão, portanto, nomes de elementos como <complexType> ou <sequência> ou <elemento> não precisam de um qualificador de namespace. O namespace de destino está associado ao prefixo gdl: .

  • *Complextype? (TRUE | FALSE) (Opcional). Se essa diretiva for TRUE, o analisador GDL fará referência a essa definição como <complexContent> ao estender esse tipo de dados; caso contrário, a definição será referenciada como <simpleContent>. Se essa diretiva não for especificada, o analisador assumirá que é FALSE.

  • *ArrayLabel (opcional). Se essa diretiva for especificada, o filtro de analisador espera que os valores de instância desse tipo sejam colocados entre parênteses, precedidos pelo rótulo de matriz especificado.

A sintaxe da instância de valor declarada como desse tipo de dados deve seguir a sintaxe definida pelo XSD fornecida pela diretiva *XSDTypeDefinition. O analisador fornecerá a marca de início e de término para o elemento, e os dados da instância de valor devem fornecer apenas o conteúdo do elemento. Se a sintaxe XML entrar em conflito com as regras básicas de sintaxe GDL, o valor (ou apenas a parte conflitante) deverá ser colocado entre <constructos Begin/EndValue:> .

Valores XML com tais sintaxes incompatíveis ou cuja sintaxe é incompatível com a sintaxe que os tipos de dados compostos usam, não podem aparecer como membros de um tipo de dados composto. Observe também que o analisador GDL não escapará de caracteres XML especiais, como abrir ou fechar colchetes (< ou >) ou um e comercial (&). O criador da instância de valor é responsável por estar em conformidade com a sintaxe XML para dados de caractere.

Por exemplo, considere o modelo a seguir.

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

O exemplo anterior define um tipo definido por XSD chamado "USAddress" que pode ser referenciado por um atributo GDL como seu ValueType. Este exemplo XSD realmente define dois tipos de dados: USAddress e zipCode. O tipo zipCode não pode ser referenciado por um atributo GDL e pode ser referenciado somente de dentro de outra definição de tipo de dados XSD.

No exemplo a seguir, o tipo zipCode é referenciado na declaração do <elemento zip> . Observe que ele é referenciado usando o prefixo de namespace gdl: . ZipCode também pode ser referenciado de uma definição de tipo de dados XSD em outro modelo.

A definição de modelo anterior causará a criação da seguinte entrada de esquema XML (é o valor de *XSDTypeDefinition inalterado).

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

O analisador constrói automaticamente outro tipo de dados que define um novo tipo derivado do tipo USAddress, mas que tem atributos XML adicionais que podem aparecer no instantâneo. Se você usar o tipo de dados original, receberá erros de validação de esquema porque o tipo original não permitia que nenhum atributo XML aparecesse. Com essa abordagem, você não precisa usar atributos XML sintetizados por analisador de código rígido em seus modelos e, se atributos adicionais forem adicionados a versões futuras do instantâneo, você não precisará modificar os modelos existentes.

O exemplo de código a seguir mostra a definição de tipo de dados 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 O tipo de dados GDLW_USAddress é declarado como <complexContent> porque o modelo para USAddress set *ComplexType?: TRUE.

Considere a seguinte entrada 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>

E considere o modelo ADDRESS, que declara o *Address GDL aAttribute como um *ValueType definido pelo modelo USAddress, como mostra o exemplo de código a seguir.

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

Se a entrada GDL anterior for interpretada usando o modelo ADDRESS, a saída XML resultante ocorrerá.

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

O atributo XML xsi:type define essa instância do elemento ATTRIBUTE para conter um tipo de dados definido por XSD chamado GDLW_USAddress. Todo o valor da instância do atributo GDL é inserido como conteúdo do elemento no <elemento GDL_ATTRIBUTE> no instantâneo XML sem nenhuma modificação. Portanto, o valor deve ser XML válido e deve seguir todas as regras de sintaxe XML, como representação de caracteres especiais.