共用方式為


XSD 樣本數據類型

XSD_DEFINED數據類型會針對數據類型的定義使用架構。 您可以定義任何 ComplexType 或 SimpleType。

*DataType:XSD_DEFINED使用標準 <xsd:complexType 或 < xsd:simpleType>> XML 元素來建立數據類型定義。 實例數據值會輸出為 XML 元素的內容,其 xsi:type 是由出現在此範本中的 *XMLDataType 值所指定。 此輸出可讓您使用 XSD 來衍生新的簡單或複雜類型,並在 GDL 屬性中使用它們。

下列指示詞可用來完全定義XSD_DEFINED數據類型:

  • *XMLDataType (必要) 。 已指派給此範本所定義之 XSD 資料類型的名稱 (NCName) 。 這個名稱是 *XSDTypeDefinition 指示詞所定義 complexType> 或 <simpleType> 元素中 <name 屬性的值。 此名稱對所有XSD_DEFINED和 ENUMERATOR 類型都必須是唯一的。 為了避免與 GDL 剖析器所定義的數據類型發生衝突,您應該避免開頭為 「GDL_」 和 「GDLW_」 的名稱。 XML 標準會定義 NCName 的語法,而且可能會施加額外的限制。

  • *XSDTypeDefinition (必要) 。 定義數據類型之格式正確的 XSD。 <只有 complexType 或 <simpleType>> 元素可以出現在最接近根的內容中。 如果最多只有其中一個元素實際參考為 GDL 屬性的實值型別,則多個 <complexType 或 <simpleType>> 元素可以在根內容顯示為同層級。 以 GDL 屬性實值型別參考的類型名稱,就是出現在 *XMLDataType 指示詞中的類型。 其餘數據類型只能從其他 <complexType> 或 <simpleType> 定義中參考。

    類型定義也可以參考其他範本中定義的其他類型定義。 當您在 *XSDTypeDefinition 指示詞中參考使用 *XSDTypeDefinition 指示詞所建立的類型定義時,您必須使用 gdl: 命名空間前置詞。

    如果 XSD 佔用多行,或違反 GDL 語法規則,則必須以 <Begin/EndValue> 分隔符括住。 在這個分隔符中定義的 XSD 將會插入 GDL 剖析器產生的 XSD 架構。 請注意, <將參考為 GDL 屬性 ValueType 的 complexType> 定義無法宣告任何 XML 屬性。 在 GDL 剖析器產生的架構中,XSD 命名空間是預設命名空間,因此 complexType> 或 sequence 或 <<元素>等<專案>名稱不需要命名空間限定符。 目標命名空間與 gdl: 前置詞相關聯。

  • *ComplexType? (TRUE | FALSE) (選擇性) 。 如果此指示詞為 TRUE,則 GDL 剖析器會在擴充此數據類型時將此定義參考為 <complexContent> ;否則,會將定義參考為 <simpleContent>。 如果未指定此指示詞,剖析器會假設它是 FALSE

  • *ArrayLabel (選擇性) 。 如果指定這個指示詞,剖析器篩選條件預期此類型的實例值會以括弧括住,前面加上指定的陣列標籤。

宣告為屬於此數據類型之實值實例的語法必須遵守 *XSDTypeDefinition 指示詞所提供的 XSD 所定義的語法。 剖析器會提供項目的開始和結束標記,而值實例數據應該只提供元素內容。 如果 XML 語法與基本 GDL 語法規則衝突,則值 (或只有衝突部分) 必須包含在 <Begin/EndValue:> construct 中。

具有這類不相容語法的 XML 值,或其語法與複合數據類型使用的語法不相容,無法顯示為複合數據類型的成員。 另請注意,GDL 剖析器不會逸出特殊 XML 字元,例如開頭或右括號 (< 或 >) 或連字元 (&) 。 值實例的建立者負責符合字元數據的 XML 語法。

例如,請考慮下列範本。

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

上述範例會定義名為 「USAddress」 的 XSD 定義型別,該類型可由 GDL 屬性作為其 ValueType 參考。 這個 XSD 範例實際上會定義兩種數據類型: USAddresszipCodezipCode 類型無法由 GDL 屬性參考,而且只能從另一個 XSD 資料類型定義中參考。

在下列範例中,zipCode 類型是在 zip> 元素的<宣告中參考。 請注意,它會使用 gdl: 命名空間前置詞加以參考。 zipCode 也可以從另一個範本中的 XSD 資料類型定義參考。

上述範本定義會導致建立下列 XML 架構專案, (它是 *XSDTypeDefinition 的值未變更) 。

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

剖析器會自動建構另一個數據類型,該數據類型會定義衍生自 USAddress 類型的新類型,但該類型具有可能出現在快照集中的其他 XML 屬性。 如果您使用原始數據類型,則會收到架構驗證錯誤,因為原始類型不允許任何 XML 屬性出現。 使用此方法時,您不需要在範本中硬式撰寫剖析器合成的 XML 屬性,而且如果將其他屬性新增至未來的快照集版本,就不需要修改現有的範本。

下列程式代碼範例顯示其他數據類型定義。

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

注意GDLW_USAddress數據類型宣告為 <complexContent>,因為 USAddress 的範本設定了 *ComplexType?:TRUE

請考慮下列 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>

並考慮 ADDRESS 範本,它會宣告 *Address GDL aAttribute 以擁有 由範本 USAddress 定義的 *ValueType,如下列程式代碼範例所示。

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

如果使用 ADDRESS 範本解譯先前的 GDL 專案,則會產生 XML 輸出。

    <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 屬性 xsi:type 會定義 ATTRIBUTE 元素的這個實例,以保存名為 GDLW_USAddress 的 XSD 定義資料類型。 GDL 屬性實例的整個值會插入為 XML 快照集的 GDL_ATTRIBUTE> 元素內容<,而不需修改。 因此,值必須是有效的 XML,而且必須遵循所有 XML 語法規則,例如特殊字元的表示法。