DFDL を使用してデータをモデル化する方法の第 2 段階は、設定した論理構造に DFDL 注釈を追加することです。
DFDL 注釈は、コンポーネントの物理形式を記述します。
- すべてのエレメント (単純および複合)
- エレメントに区切り文字 (イニシエーターまたはターミネーター) は存在するか。
存在する場合、エンコード方式は何か。
また、エレメントが空または nil のときにそれが存在するか。 この特性によって、dfdl:initiator、dfdl:terminator、dfdl:encoding、および関連プロパティーが決まります。
- エレメントの内容はどのようにして確立されるか。 この特性によって、dfdl:lengthKind および関連プロパティーが次のように決まります。
- explicit (固定長の場合)。
- prefixed (長さ接頭部が存在する場合)。
- delimited (区切り文字によって分けられている場合)。
- pattern (正規表現を使用する場合)。
- implicit (長さが、そのタイプによって決まる場合)
- endOfParent (親によって分けられている場合)。
- エレメントがオプションまたは配列である場合は、どのようにして出現回数が確定するか。 この特性によって、dfdl:occursCountKind および関連プロパティーが決まります。
- 適用する位置合わせのルールは存在するか。 この特性を持つものは、通常、バイナリー・データのみです。
この特性によって、dfdl:alignment、dfdl:fillByte、および関連プロパティーが決まります。
- nil 値はどのように記述されるか。 この特性によって、dfdl:nilKind、dfdl:nilValue、および関連プロパティーが決まります。
- エレメントが存在するかどうかを確定するために表明または判別は必要か。
- 単純エレメント
- エレメントはテキスト表記かバイナリー表記か。
表記および単純タイプによって、他のどのプロパティーを設定する必要があるかが決まります。
- テキストの場合、プロパティーは、dfdl:encoding およびいくつかの DFDL テキスト関連プロパティーです。
- バイナリーの場合、プロパティーは、dfdl:byteOrder およびいくつかの DFDL バイナリー関連プロパティーです。
- テキスト形式の場合、エスケープ・スキームは必要か。 この特性によって、dfdl:defineEscapeScheme 注釈が必要かどうかが決まり、必要な場合にはそれを参照する dfdl:escapeSchemaRef も決まります。
- グローバル単純タイプを指定する場合は、エレメントではなくいくつかのプロパティーを単純タイプに格納できるかどうかを決定し、再利用可能な物理タイプを作成します。
- Sequence
- シーケンスは順序付けられているか。それとも順序付けられていないか。 この特性によって、dfdl:sequenceKind プロパティーが決まります。
- 子エレメントを区切るために使用されるセパレーターはあるか。
ある場合、セパレーターの位置は infix、prefix、または postfix のいずれか。
セパレーターが抑制されることはあるか (例えば、オプションのエレメントが欠落している場合など)。 これらの特性によって、dfdl:encoding、dfdl:separator、dfdl:separatorPosition、および
dfdl:separatorSuppressionPolicy プロパティーが決まります。
- シーケンスのすべての子エレメントに、子エレメントの存在を識別できる固有のイニシエーターはあるか。 この特性によって、dfdl:initiatedContent プロパティーが決まります。
- シーケンス自体にイニシエーターまたはターミネーターはあるか。 この特性によって、dfdl:initiator、dfdl:terminator、dfdl:encoding、および関連プロパティーが決まります。
- 選択項目
- その選択項目では、すべての分岐が同じ長さである必要があるかどうか。 この特性によって、dfdl:choiceLengthKind および関連プロパティーが決まります。
- 選択項目のすべての分岐に、分岐の出現を識別できる固有のイニシエーターがあるか。 この特性によって、dfdl:initiatedContent プロパティーが決まります。
- どれが出現するかを確定するために、分岐に判別が必要か。
- 選択項目そのものにイニシエーターまたはターミネーターはあるか。 この特性によって、dfdl:initiator、dfdl:terminator、dfdl:encoding、および関連プロパティーが決まります。
引き続き、従業員レコードからなるファイルの例を使用します。
このファイルのデータはすべて、dfdl:encoding が ASCII のテキストです。
- employees エレメントにはイニシエーターもターミネーターもないため、dfdl:initiator および dfdl:terminator は空ストリング '' に設定されます。
このエレメントの長さは、子エレメントによって決まります。
したがって dfdl:lengthKind は implicit です。
- employees のシーケンスの dfdl:sequenceKind は ordered です。これは、子コンポーネントが常に指定の順序で出現するためです。
- employeeRecords エレメントは { で始まるため、dfdl:initiator は {{ です (DFDL イニシエーターが誤って DFDL 式として解釈されないように、左中括弧を 2 つ ({{) 指定する必要があります)。
エレメントの終わりは } および CR/LF であるため、dfdl:terminator は }%CR;%LF; です (代わりの方法として、} および CR/LF を親シーケンスのセパレーターとしてモデル化することもできます)。
この場合も、子エレメントによって長さが決まります。したがって dfdl:lengthKind は implicit です。
- このシーケンスの dfdl:sequenceKind は ordered です。
- 各単純エレメントの dfdl:representation は text です。
それぞれに、dfdl:initiator として使用される固有の開始タグがあります。
それぞれ、「,」で区切られた可変長の値を持ちます (ただし、レコードの最後のエレメントである場合は } および CR/LF で区切られます)。
その結果、dfdl:lengthKind は delimited になります。
- 区切り文字「,」は、エレメントの dfdl:terminator としてではなく、親シーケンスの dfdl:separator としてモデル化するのが最適です。
dfdl:separatorPosition は infix です。
これは、「,」がシーケンス内の子エレメントの間にのみ出現することを意味します。
- すべての単純エレメントにイニシエーターがあるため、親シーケンスで dfdl:initiatedContent yes を設定する必要があります。
これは、パーサーがイニシエーターを使用して各エレメントを積極的に識別することを意味します。
- salary エレメントはオプションですが、DFDL 判別は必要ありません。これは、DFDL パーサーが employeeRecord ターミネーターを検出したとき、このエレメントが欠落していると推測するためです。
salary が欠落している場合は、その前の「,」が抑制されることに注目してください。
これは、親シーケンスの dfdl:separatorSuppressionPolicy trailingEmpty を使用してモデル化されます。
- それぞれの単純エレメントに関して、他にもいくつかのテキスト関連プロパティーを設定する必要があります。
これらのプロパティーは、埋め込みやトリミングを行うかどうか、データ文字が区切り文字として解釈されないようにエスケープ・スキームを使用するかどうかを制御します。
- それぞれの単純エレメントに関して、タイプ固有のプロパティーを他にもいくつか設定して、データ値の解釈を制御する必要があります。
例えば、permanent エレメントは、タイプが xs:boolean であるため、dfdl:textBooleanTrueRep が Y で、dfdl:textBooleanFalseRep が N である必要があります。
次の段階は、DFDL モデルを編成することです (
DFDL モデルの編成)。