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 範例實際上會定義兩種數據類型: USAddress 和 zipCode。 zipCode 類型無法由 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 語法規則,例如特殊字元的表示法。