Skip to content

Latest commit

 

History

History
285 lines (214 loc) · 11.2 KB

Xdef_Specification.md

File metadata and controls

285 lines (214 loc) · 11.2 KB

xdefの言語仕様

これは、xdefの言語仕様を説明するドキュメントです。 XMLとXML Schemaの知識を持っている方を対象読者とします。

用語

ノード

XMLにおける要素と属性の総称をノードと呼びます。 ノードは、値・子ノードを持つことができます。

例えば、下記のelm要素の値はelmValueattr属性の値はattrValueです。

<elm attr="attrValue">elmValue</elm>

下記は、parent要素が子ノードとしてchild1属性とchild2要素を持っています。

<parent child1="hoge">
  <child2>piyo</child2>
</parent>

要素は、値と子ノードを同時に持つことができますが、値を持つ場合は、属性のみ子ノードとして持てます。 属性は、子ノードを持つことはできず、値だけを持つことができます。

許容される

あるスキーマに対して、XML・ノード・値が妥当であることを許容されると呼びます。

ノードの内容として、許容される値の定義をと呼びます。

宣言

許容されるノードの定義を、宣言と呼びます。

Xdefとは

Xdefは、XML Schemaを簡潔に記述するために作られた言語です。 XML Schemaの主要な機能を、Xdefで表現できます。 Xdefのファイル形式は、.xdefです。 エンコーディング形式は、UTF-8のみが許されています。

ノードの宣言

ノードの宣言をすることによって、許容されるXMLのノードを定義できます。

単純型要素の宣言

下記のようなxdefがあるとします。

Root : string

このxdefは、下記のようなXMLを許容します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>Hello World!</Root>

Xdefファイル中の、Rootは許容される要素の名前です。 : stringは、Root要素が文字列を定義するstring型であることを表します。 このように子ノードを持たない要素の宣言を、単純型要素の宣言と呼びます。

複雑型要素の宣言

下記のようなxdefがあるとします。

Root
  Child : string

このxdefファイルは、下記のようなXMLを許容します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
  <Child>
    Hello World!
  </Child>
</Root>

ChildRootの子要素です。 このようにインデントを使用することで、ノードの階層を表現できます。 半角スペース2つで、一つのインデントを表します。 このように子ノードを持つ要素の宣言を、複雑型要素の宣言と呼びます。

下記のように、複雑型要素の宣言は、要素の宣言以外に、属性の宣言を入れ子にすることもできます。

Root
  @Attr : string
  Child : string

このxdefファイルは、下記のようなXMLを許容します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root Attr="attrValue">
  <Child>
    Hello World!
  </Child>
</Root>

パーティクルの指定

複雑型要素の宣言では、::を使用することでパーティクルを指定できます。 パーティクルの指定をすることで、子ノードの出現や順番を指定できます。 パーティクルの指定は省略可能です。その場合は、sequenceを指定したことになります。 パーティクルの指定には、下記の種類があります。

パーティクルの指定
sequence
choice
all

例えば、下記はパーティクルの指定として、allを使用しています。

Root :: choice
  Child1 : string
  Child2 : string

このxdefファイルは、下記の2つXMLをどちらも許容します。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
  <Child1>
    Hello World!
  </Child1>
</Root>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
  <Child2>
    Hello World!
  </Child2>
</Root>

パーティクルの指定に関しての詳しい情報は、ModelGroupsを参照してください。

出現回数の指定

要素の宣言・パーティクルの指定には、出現回数を指定できます。

記号 説明
なし 出現回数の指定がない場合は、宣言の対象となるノードは必須になります。
? 省略可能を表します。
* 任意回数を表します。
+ 一つ以上を表します。
[n..m] nとmには自然数を指定します(例: [0..10]) n以上m以下を表します。nかmに * を指定した場合は、無制限になります。

例えば、下記は、Root要素の出現回数を1個から3個と指定しています。

Root[1..3]
  Child : string

要素に対してではなく、パーティクルに対しての出現回数の指定は下記のように行います。

Root :: sequence[1..3]
  Child : string

要素の宣言に対する出現回数の指定は、XML Schemaでは、minOccurs属性maxOccurs属性として表現されます。 属性の宣言では、use属性として表現されます。

ノードの宣言において、:で型を指定できます。 XML Schemaで定義済みの型(単純型)が、そのまま使用できることに加え、制限型というrestrictionを使用するような型を表現できます。 下記は、それぞれの使用方法を説明します。

単純型

単純型は、XML Schemaで定義済みの型を表します。 使用できる型は、Built-in datatypesを参照してください。

制限型

制限型は、XML Schemaのrestrictionによって、制限される型を表します。

下記は、その種類と例です。

種類
正規表現 /\w+/
文字列列挙 `("aaa"
範囲指定整数 [0, 100) [0, 100]
可変長文字列 char[1..100] char[1..*]
固定長文字列 char char[100]

固定型

固定型は、単一の値のみ許容される型を表します。

下記は、その種類と例です。

種類
文字列 "hoge"
真偽 true false
整数 -100 0 100
浮動小数点数 -100.001 100.001
バイト -100y 0y 100y

XML Schemeのfixedや、単一のenumerationによって表現されます。

型の定義

=を使用することで再利用可能な型を定義できます。 型の定義には、単純型と複雑型の2種類があります。

単純型の定義

単純型の定義は、下記のように行います。

MyString = char[100]

この例は、MyStringという型を定義しています。 この型の定義はchar[100]なので、長さ100の固定長文字列です。

複雑型の定義

複雑型の定義は、下記のように行います。

MyType =
  ChildA : string

この例は、MyTypeという型を定義しています。 この型は、子要素の宣言としてChildAを持ちます。

MyTypeのパーティクルを明示的に指定するには下記のようにします。

MyType :: choice =
  ChildA : string

省略されている場合は、sequenceになります。

ノードジェネレータ

通常のノードの宣言では任意の要素を許容するanyを宣言できません。 この例のように、通常のノード宣言では表せないノードを宣言をしたい場合は、ノードジェネレータを使用します。 ノードジェネレータは、下記のように!を使用して呼び出すことができます。

!any

xdefでは、anyの他にも数種類のノードジェネレータが用意されています。 例えばincludeノードジェネレータは、XML Schemaのincldueを表現します。

下記のように使用します。

!include "http://www.w3.org/2001/xml.xsd"

includeノードジェネレータは固定文字列型の引数を1つ受け取ります。

下記は、使用できるノードジェネレータの説明です。

ノードジェネレータ名 説明 引数 出現回数 子ノード
include XML Schemaのincldueを表現します。 固定文字列 受け取らない 受け取らない
targetNamespace XML SchemaのtargetNamespaceを表現します。 固定文字列 受け取らない 受け取らない
choice 入れ子になるchoiceを表現します。 受け取らない 受け取る 受け取る
any XML Schemaのanyを表現します。 受け取らない 受け取る 受け取らない
element 定義済みである要素の宣言を名前を指定して宣言します。 固定文字列 受け取る 受け取る

コメント

ノードの宣言にはコメントをつけることができます。 下記の例のように行末に--をつけます。

Root : string -- コメントです。