次の方法で共有


XSD テンプレート データ型

XSD_DEFINEDデータ型は、データ型の定義にスキーマを使用します。 任意の ComplexType または SimpleType を定義できます。

*DataType: XSD_DEFINEDは、標準の<xsd:complexType> または < xsd:simpleType> XML 要素を使用してデータ型定義を作成します。 インスタンス データ値は、このテンプレートに表示される *XMLDataType の値によって xsi:type が指定される XML 要素の内容として出力されます。 この出力を使用すると、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> 要素は、最大で 1 つだけが GDL 属性の値型として実際に参照されている場合、最ルートコンテキストで兄弟として表示できます。 GDL 属性の値型として参照される型の名前は、*XMLDataType ディレクティブに表示される名前です。 残っているデータ型は、他の <complexType> 定義または <simpleType> 定義内からのみ参照できます。

    型定義は、他のテンプレートで定義されている他の型定義を参照することもできます。 *XSDTypeDefinition ディレクティブを使用して作成された *XSDTypeDefinition ディレクティブ内で型定義を参照する場合は、gdl: 名前空間プレフィックスを使用する必要があります。

    XSD が複数行を占有している場合、または GDL 構文規則に違反している場合は、<Begin/EndValue> 区切り記号で囲む必要があります。 この区切り記号で定義されている XSD は、GDL パーサーが生成する XSD スキーマに挿入されます。 GDL 属性のValueType として参照される <complexType> 定義では、XML 属性を宣言できないことに注意してください。 GDL パーサーが生成するスキーマでは、XSD 名前空間が既定の名前空間であるため、<complexType> や<シーケンス>や<要素>などの要素名には名前空間修飾子は必要ありません。 ターゲットの名前空間は、gdl: プレフィックスに関連付けられます。

  • ComplexType", (TRUE | FALSE) (省略可能)。 このディレクティブが TRUE の場合、GDL パーサーは、このデータ型を拡張するときにこの定義を <complexContent> として参照します。それ以外の場合、定義は <simpleContent> として参照されます。 このディレクティブが指定されていない場合、パーサーは FALSE であると見なします。

  • *ArrayLabel (省略可能)。 このディレクティブを指定した場合、パーサー フィルターはこの型のインスタンス値が指定された配列ラベルの前に括弧で囲まれていることを期待します。

このデータ型として宣言されている値インスタンスの構文は、*XSDTypeDefinition ディレクティブが提供する XSD で定義されている構文に従う必要があります。 パーサーは要素の開始タグと終了タグを提供し、値インスタンス データは要素の内容のみを提供する必要があります。 XML 構文が基本的な GDL 構文規則と競合する場合は、値 (または競合する部分のみ) を <Begin/EndValue:> コンストラクト内に囲む必要があります。

このような互換性のない構文を持つ XML 値、または構文が複合データ型で使用される構文と互換性がない 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 の例では、実際には USAddresszipCode の 2 つのデータ型を定義しています。 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 データ型は、USAddress のテンプレートが *ComplexType?: TRUE に設定されているため、<complexContent> として宣言されています。

次の 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 GDL aAttribute を宣言し、テンプレート USAddress によって定義された *ValueType を持つ ADDRESS テンプレートについて考えてみましょう。

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

前の GDL エントリが ADDRESS テンプレートを使用して解釈された場合、結果の 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 構文規則に従う必要があります。