複合テンプレート データ型
COMPOSITE データ型は、同じデータ型または異なるデータ型を持つ 1 つ以上の値で構成されます。 複合は、固定長または可変長 (ただし、不定ではない) にすることができます。 このデータ型は、C lLanguage 構造体のデータ型に似ています。
*DataType: COMPOSITE は、メンバーが異なるデータ型である複合データ型を定義するようにテンプレートに指示します。 COMPOSITE データ型のメンバーは、それを囲むコンテキストを表す要素に属する個々の XML 子要素として出力されます。 各子要素がデータ型プリミティブを表す場合、そのデータ型は各要素の XML 属性 xsi:type によって定義されます。 GDL 属性が DataType : COMPOSITE として定義されている場合、それを囲むコンテキストは <GDL_ATTRIBUTE> 要素になります。 各 XML 子要素の要素名は、Directive: *ElementTags で定義される対応するタグになります。
COMPOSITE 自体が別の複合データ型のメンバーである場合、それを囲むコンテキストを表す要素が作成されます。 この親要素の名前は、それを囲む複合データ型に対応するテンプレートによって割り当てられる対応するタグになります。
COMPOSITE データ型を定義するには、次のディレクティブを使用します。
*ElementType (必須)。 各要素のデータ型を定義するテンプレートの名前。 要素ごとに 1 つのデータ型を指定する必要があります。 1 つ以上の要素に同じデータ型を指定できます。 指定される ElementTypes の数は、*ArraySize で指定される ArraySize または Max 値と等しい必要があります。
*RequiredDelimiter (必須)。 各 COMPOSITE 要素を構文的に次の要素から分離する文字列。 2 つの連続する区切り記号は、省略された要素として解釈されます。 末尾の要素の省略を示すのに区切り記号を使用する必要はありません。
区切り記号として、または区切り記号文字列の一部として空白文字を使用する場合は、十分に注意する必要があります。 たとえば、パーサーは余分な空白文字を、省略された要素を示すものとして解釈します。余分な空白が表示されない可能性があるため、奇妙な解析エラーが発生する可能性があります。 また、余分な空白はソース ファイルから定期的に削除され、プリプロセッサ、マクロ、およびコメント処理の結果として、多くの場合、空白が入力ストリームに追加されます。 したがって、解析される実際の文字列の空白文字の数は、最初に指定されたものとは完全に異なる場合があります。 タブ文字は入力処理中に定期的に空白文字に変換されるため、必要な区切り文字の一部として使用しないでください。
*OptionalDelimiter (省略可能)。 *RequiredDelimiter 文字列の隣に表示される *OptionalDelimiter で指定された文字で構成される文字列は、区切り記号の一部と見なされます。
*ElementTags (必須)。 指定されるタグの数は、*ArraySize で指定される ArraySize または Max 値と等しい必要があります。 各メンバーには、対応するタグが付けられます。 このタグ付けは、1 つ以上の要素を省略した場合に便利です。 COMPOSITE 要素を省略すると、省略された要素に対応するタグは使用されません。 クライアントの混乱を避けるために、GDL スナップショット予約済み要素名をタグ名として使用しないでください。 これらの予約名は、CONSTRUCT、ATTRIBUTE、Personality です。
*ArraySize (省略可能)。 このディレクティブを省略すると、固定サイズの COMPOSITE が想定されます。 サイズは、*ElementType 内のテンプレート名の数と同じになります。
2 つの整数を使用して、可変サイズの COMPOSITE に許容される最小サイズと最大サイズを指定します。 最小サイズには 0 を使用できます。 無制限サイズの COMPOSITE データ型は使用できません。 GPD ワイルドカード文字 (*) を使用してサイズまたは最大サイズを指定することはできません。
*ArrayLabel (省略可能)。 このディレクティブを指定する場合は、COMPOSITE 要素の一覧をかっこで囲み、*ArrayLabel ラベルの前に配置する必要があります。 このディレクティブでラベルが指定されていない場合、かっこは省略可能であり、前のラベルは使用できません。
次のテンプレートを考慮してください。
*Template: QUALNAME_EX
{
*Type: DATATYPE
*DataType: COMPOSITE
*ElementType: (SYMBOL, SYMBOL, INTEGER)
*RequiredDelimiter: "."
*ElementTags: (feature, option, resourceID)
}
上記のテンプレートは、2 つの SYMBOL データ型と 1 つの整数の固定サイズの COMPOSITE を定義します。 COMPOSITE はラベル付けされていません。 COMPOSITE 内の各要素には、一意の ElementTag を割り当てます。 これらのタグは、クライアントを支援するために XML 出力内の各要素にラベルを付けます。 各要素は、1 つのピリオド (.) によって次の要素から分離されます。他の文字は区切り記号の一部とは見なされません。 *ArraySize が指定されていないため、固定の COMPOSITE サイズが想定されます。 COMPOSITE サイズは固定されているため、メンバーの省略は許可されません。
*DataType: COMPOSITE テンプレートは、対応するスキーマを生成しません。 代わりに、*ElementType ディレクティブで名前が付けられたテンプレートのスキーマが使用されます。
たとえば、次のように定義されている SYMBOL テンプレートを考えてみましょう。
*Template: SYMBOL
{
*Type: DATATYPE
*DataType: FILTER_TYPE
*ElementType: XML_STRING
*FilterTypeName: "SYMBOLNAME"
}
次の GDL エントリについて考えてみましょう。
*rcNameID: ( RESDLL.stdname.467 )
または、省略可能なかっこがない次の GDL エントリについて考えてみます。
*rcNameID: RESDLL.stdname.467
GDL エントリは、次の RC_NAME_ID テンプレートを使用して解釈されるとします。
*Template: RC_NAME_ID
{
*Name: "*rcNameID"
*Type: ATTRIBUTE
*ValueType: QUALNAME_EX
*Additive: LEAST_TO_MOST_RECENT
}
XML の結果の出力は次のようになります。
<GDL_ATTRIBUTE Name="*rcNameID" >
<feature xsi:type="GDLW_string">RESDLL</feature>
<option xsi:type="GDLW_string">stdname</option>
<resourceID xsi:type="GDLW_int">467</resourceID>
</GDL_ATTRIBUTE>
次の例は、時間間隔を表す DATE データ型のペアを保持する INTERVAL データ型を使用して、入れ子になった複合データ型を示しています。 各 DATE データ型は、MONTH、DAY、YEAR データ型の COMPOSITE です。 INTERVAL データ型は、従業員が不在になる可能性がある期間を表すために、VACATION GDL 属性によって使用されます。 この状況を実現するには、次のテンプレートのコレクションを使用します。
月テンプレート
*Template: MONTHS
{
*Type: DATATYPE
*DataType: ENUMERATOR
*XMLDataType: "months"
*EnumeratorList: (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
}
日テンプレート
*Template: DAY
{
*Inherits: INTEGER
*MinValue: 1
*MaxValue: 31
}
年テンプレート
*Template: YEAR
{
*Inherits: INTEGER
*MinValue: 1900
*MaxValue: 2100
}
日付テンプレート
*Template: DATE
{
*Type: DATATYPE
*DataType: COMPOSITE
*ElementType: (MONTHS, DAY, YEAR)
*RequiredDelimiter: "-"
*ElementTags: (month, day, year)
}
間隔テンプレート
*Template: INTERVAL
{
*Type: DATATYPE
*DataType: ARRAY
*ElementType: DATE
*RequiredDelimiter: "to"
*OptionalDelimiter: "<20 09>"
*ElementTags: (start_date, end_date)
*ArraySize: 2
}
休暇テンプレート
*Template: VACATION
{
*Name: "*VacationDates"
*Type: ATTRIBUTE
*ValueType: INTERVAL
}
次の GDL エントリについて考えてみましょう。
*VacationDates: Dec-20-2001 to Jan-3-2002
この GDL エントリが VACATION テンプレートを使用して解釈される場合、結果の XML 出力は次のようになります。
<GDL_ATTRIBUTE Name="*VacationDates" >
<start_date >
<month xsi:type="GDLW_months">Dec</month>
<day xsi:type="GDLW_int">20</day>
<year xsi:type="GDLW_int">2001</year>
</start_date>
<end_date >
<month xsi:type="GDLW_months">Jan</month>
<day xsi:type="GDLW_int">3</day>
<year xsi:type="GDLW_int">2002</year>
</end_date>
</GDL_ATTRIBUTE>