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> 元素才能显示在最接近根的上下文中。 如果多个 <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:> 构造中<。

具有此类不兼容语法或其语法与复合数据类型使用的语法不兼容的 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 数据类型定义中引用。

在以下示例中, zip 元素 的 <声明中引用了 zipCode> 类型。 请注意,它通过使用 gdl: 命名空间前缀进行引用。 也可以从另一个模板中的 XSD 数据类型定义引用 zipCode

前面的模板定义将导致创建以下 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 语法规则,例如特殊字符的表示形式。