myGroup > myProject
 

Specification of mapping definition

English

1. mapping definition の仕様

mapping definition は 大きく分けて3つの部分の定義から構成されます。

  • データ構造
  • プログラミング言語の処理
  • データ構造とプログラミング言語の処理の対応(マッピング)

それぞれの部分を 空間 と呼びます。 mappingSchema の0.4版では、 以下のURIをそれぞれの 空間 に割り当て、 それぞれに対して接頭辞を対応させています。

定義 名前空間 URI 名前空間接頭辞
データ構造 http://ums.isas.jaxa.jp/0.4/dat dat
C言語 http://ums.isas.jaxa.jp/0.4/clng clng
プログラミング言語の処理 Java http://ums.isas.jaxa.jp/0.4/java java
Perl http://ums.isas.jaxa.jp/0.4/perl perl
マッピング http://ums.isas.jaxa.jp/0.4 (接頭辞なし)
Note
このサイトに示す定義では、慣習に従い XML 名前空間 のプリフィクスの定義を省略します。

1.1 データ構造の定義

データ構造を定義するためには、 byte 要素bit 要素list 要素の子に、 data 要素または value 要素を記述します。

以下の定義は、1バイトの符号あり整数からなるデータ構造を表します。 この定義に登場する いずれの XML 要素 も データ構造の空間に属しています。

<dat:byte enocde="signed" length="1">
 <dat:data type="byte"/>
</dat:byte>

1.2 プログラミング言語の処理の定義

現在、プログラミング言語の処理の定義として二つの syntax が存在します。

  • XML-XML syntax
  • XML-language syntax

データ構造の記述に XML-XML syntax XML-language syntax の区別はありません。

1.2.1 プログラミング言語の処理の定義(XML syntax)

XML syntax において、プログラミング言語の処理を定義するためには、 'lang:value-of'要素 の子に、 'lang:data'要素 または 'lang:value'要素 を記述します。

以下の定義は、1バイトのデータの値を持つ変数 var を表します。 この定義に登場する いずれの XML 要素 も 言語の空間に属しています。

<lang:value-of select="var">
 <lang:data type="byte"/>
</lang:value-of>

1.2.2 プログラミング言語の処理の定義(Language syntax)

Language syntax において、言語での処理を定義するためには、 変数の代入式の形式で、 'lang:data'要素 または 'lang:value'要素 を記述します。

以下の定義は、1バイトのデータの値を持つ変数 var を表します。 この定義に登場する XML 要素 、XML 要素の外側に書かれた 部分のいずれも言語の空間に属しています。

var = <lang:data type="byte"/>;

<lang:data type="byte"/> = var;

1.3 データ構造とプログラミング言語の処理の対応の定義

データ構造の定義と、プログラミング言語の処理の定義を組み合わせ、両者の対応を定義します。

1.3.1 データ構造とプログラミング言語の処理の対応の定義(XML syntax)

XML syntax において、データ構造とプログラミング言語の処理の対応を定義するためには、 byte 要素bit 要素list 要素の子に lang:value-of 要素 を記述し、この要素の子に、 lang:data 要素 または lang:value 要素 を記述します。

以下の定義は、1バイトのデータの値を持つ変数 var に1バイトの符号あり整数からなる データ構造を対応させています。 この定義に登場する dat:byte 要素 は データ構造の空間、 lang:value-of 要素 は 言語の空間、 data 要素 は マッピングの空間に属しています。

<dat:byte enocde="signed" length="1">
 <lang:value-of select="a">
  <data type="byte"/>
 </lang:value-of>
</dat:byte>

XML syntax の、デコード/エンコードについての mapping definition は以下のようになります。

定義 data value
データ構造
<dat:byte enocde="signed" length="1">
  <dat:data type="byte"/>
</dat:byte>
<dat:byte enocde="signed" length="1">
  <dat:value type="byte">1</dat:value>
</dat:byte>
プログラミング言語の処理
<lang:value-of select="var">
  <lang:data type="byte"/>
</lang:value-of>
<lang:value-of select="var">
  <lang:value type="byte">1</lang:value>
</lang:value-of>
マッピング
<dat:byte enocde="signed" length="1">
  <lang:value-of select="a">
    <data type="byte"/>
  </lang:value-of>
</dat:byte>
<dat:byte enocde="signed" length="1">
  <lang:value-of select="a">
    <value type="byte"></value>
  </lang:value-of>
</dat:byte>
Note
マッピング定義 をXSLで処理する場合は、 XML-language syntax に比べ XML-XML syntax の方が便利です。 XML-XML syntax マッピング定義 XML-language syntax による記述に変換することができます。

1.3.2 データ構造とプログラミング言語の処理の対応の定義(Language syntax)

Language syntax において、データ構造とプログラミング言語の処理の対応を定義するためには、 byte 要素bit 要素list 要素の子に 変数の代入式の形式で、 lang:data 要素 または lang:value 要素 を記述します。

以下の定義は、1バイトのデータの値を持つ変数 var に1バイトの符号あり整数からなるデータ構造を対応させています。 このパターンに登場する dat:byte 要素 は データ構造の空間、 data 要素 は マッピングの空間、その他の部分が言語の空間に属しています。

<dat:byte enocde="signed" length="1">
 a = <data type="byte"/>;
</dat:byte>

<dat:byte enocde="signed" length="1">
 <data type="byte"/> = a;
</dat:byte>

Language syntax の、デコードについての mapping definition は以下のようになります。

定義 data value
データ構造
<dat:byte enocde="signed" length="1">
  <dat:data type="byte"/>
</dat:byte>
<dat:byte enocde="signed" length="1">
  <dat:value type="byte">1</dat:value>
</dat:byte>
プログラミング言語の処理
<lang:data type="byte"/> = a;
<lang:value type="byte">1</lang:value> = a;
マッピング
<dat:byte enocde="signed" length="1">
  <data type="byte"/> = a;
</dat:byte>
<dat:byte enocde="signed" length="1">
  <value type="byte">1</value> = a;
</dat:byte>

エンコードについての mapping definition は以下のようになります。

定義 data value
データ構造
<dat:byte enocde="signed" length="1">
  <dat:data type="byte"/>
</dat:byte>
<dat:byte enocde="signed" length="1">
  <dat:value type="byte">1</dat:value>
</dat:byte>
プログラミング言語の処理
a = <lang:data type="byte"/>;
<lang:value type="byte">1</lang:value> = a;	
マッピング
<dat:byte enocde="signed" length="1">
  a = <data type="byte"/>;
</dat:byte>
<dat:byte enocde="signed" length="1">
  a = <value type="byte">1</value>;
</dat:byte>
Note
ある向きの動作を記述する場合 XML-XML syntax に比べ XML-language syntax の方が 若干コンパクトです。また、プログラマには馴染みやすいかもしれません。 XML-language syntax を用いると、 プログラミング言語 の機能の一部を直接用いることができます。 XML-language syntax マッピング定義 は必ずしも XML-XML syntax による記述 に変換できるとは限りません。

2. RELAX NG との違い? - 2005/06/28追記

RELAX NG は XML 文書に "限定" して使用するものです。 mappingSchema は、より広い文書で使用するためのものです。 第1に、このことにより差が生じます。

2つ目の違いは、"実装" をどう意識するかで生じます。 複数の実装が存在する場合、その相互運用のために、適用範囲を絞りこむ必要が出てきます。 - 今のところ - mappingSchema には、そういう制約は設けておらず、 適用範囲を明示するのはツールの義務であり、使用範囲を選択するのはユーザに任されています。

これらの違いの多くは "制約" の違いとなって現れます。 - 今のところ - mappingSchema の文法自身は"制約" を極力設けないないようにしています。 以下には、mappingSchema では許容されるが RELAX NG では 許容されないパターンの例を列挙します。

2.1 注釈 (外来の属性及び要素の取り扱い) - 2005/07/21追記

RELAX NG では外来の属性及び要素は取り除かれます (see RELAX NG 4.1)。 mappingSchema では外来の属性及び要素は「無視されます」。以下の例は

<element name="A">
 <other:comment>
  <element name="B">
   <text/>
  </element>
 </other:comment>
</element>

RELAX NG では

<element name="A"/>

と、等価ですが mappingSchema では

<element name="A">
 <element name="B">
  <text/>
 </element>
</element>

と、等価になります。

2.2 難解な書式 - 2005/08/01更新

mappingSchema では下記の記述が「可能」です。

<byte encode="txt">
 <data type="int"/>
</byte>
<byte encode="txt">
 <data type="int"/>
</byte>

たとえば、これは '123456' という文字列にマッチします。 2 つのデータ項目がそれぞれどの部分文字列にマッチするかは 一意に決まりません。以下の 5 通りの可能性があります。

  • '12345' 及び '6'
  • '1234' 及び '56'
  • '123' 及び '456'
  • '12' 及び '3456'
  • '1' 及び '23456'

このようなデータのデコードには労力がかります。 そして、なにより、取り扱える処理系が限られてきてしまうため、 使うべきではありません。

なお、下記のパターンは RELAX NG (see 7.2) でも mappingSchema でも許容されません (list の子として現れる場合を除く)。

<data type="int"/>
<data type="int"/>

3. 制約事項

umsCodeGenerator で処理するにあたり、mapping definition では以下の制約があります。

  • optional 要素、oneOrMore 要素、zeroOrMore 要素のネストの深さは、最大 32 です。
  • list 要素のネストの深さは、最大 32 です。
  • define/ref の再帰定義はできません。
  • define 要素の子孫に、optional 、oneOrMore、zeroOrMore を記述することはできません。
  • dat:*//ums:* という経路は許されません。
  • XML syntax において、デコード/エンコード関数のインターフェースは固定です。
  • Language syntax においてコード記述可能な部分は、XML syntax の <package>、<class>、<function>、<arg>、<return>、<var>、<array>、 <value-of>、<callFunction>の部分です。 $TABLETOOLS_HOME/sample/tutorial に含まれる Language syntax の例を参考にしてください。