データ型: 単純型のユーザ派生データ型について

2002年7月7日(日)更新


■何らかのデータ型を基準型として派生させる

たけち: 前回は単純型について学習したよね。今回から単純型のユーザ派生データ型の作り方を勉強することにするね。

さらら: お手柔らかにね。ところで、ユーザ派生データ型って言うのは「ユーザが定義するデータ型」という意味なの?

たけち: うん、そうだね。XMLスキーマでは基本原則として派生を使わなければデータ型を自分達が定義することはできないんだ。この「派生」という考え方は、「データ型」と並んでXMLスキーマの中心になる考え方なんだよ。XMLスキーマには、
- 自分でXMLスキーマのデータ型を定義したければ、必ず他の何らかのデータ型を基準型として、そこから派生させるという形をとらない限り、自分でデータ型を定義することはできない
という基本原則があるんだよ。

さらら: へぇ〜、そうなの。

たけち: もっとも、一部ではこれが基本原則というよりは建前に近いものになるのだけれど、でも原則は原則なんだよ。

さらら: ふ〜ん。原則、ねぇ。。。。

さらら


■基準型を制限して派生させる

派生

たけち: まず前回の復習だけれども、ビルトインデータ型の中にも「派生」の関係があったよね。

さらら: あっ、そうそう。例えば、前回の decimal -派生→ integer -派生→ nonNegativeInteger -派生→ positiveInteger という関係よね。

たけち: そう、これを見てもわかるように、派生型は基準型の範囲を制限(restriction)することによって派生しているんだ。この制限(restriction)するということが、派生の一番基本的な考え方になるんだよ。

さらら: なるほど〜。範囲が広いもの(基準型)から範囲が狭いもの(派生型)へ制限することが派生なのね。

たけち: あっ、う〜ん、それはちょっと違うんだけど... (^ ^;

さらら: え〜っ、だっていまそう言ったじゃない!!

たけち: ・・・え〜と (^ ^; 確かに制限(restriction)は派生の一番中心的な考え方なんだけれど、それだけが派生の方法じゃないんだ。

さらら: えっ〜。まだあるの。。。

たけち: 単純型では他にユニオンとかリストという方法によって他のデータ型を派生させることができるんだ。

【単純型のユーザ派生データ型の定義方法】

  1. 制限(restriction)
  2. ユニオン(union)
  3. リスト(list)

たけち


制限(restriction)

さらら: え〜っ、「ユニオン」とか「リスト」って。。。。。制限以外にもまだ他に覚えないといけないの?

たけち: うん。だけど単純型の派生で一番中心的で、一番覚えないといけないことがたくさんあるのは制限(restriction)だけで、ユニオンリストは簡単に覚えられるよ。まず制限(restriction)について学ぼうね。

さらら: えっ、ぇぇ。。。(^ ^;

さらら

たけち: まずは簡単なところで「テストの点数型」というのを作ってみようね。テストの点数は0点から100点までの整数だよ。一応ここでは派生の元となる基準型としてはxsd:intを使ってみることにするね。

さらら: xsd:intは2147483647 〜 -2147483648の範囲を持つ整数よね。それを基準型として、それが取りうる範囲を100 〜 0に制限するということなのね。

たけち: そうだよ。やりたいこととしては、次のようなXMLデータを作るようにしたいんだよね。

<kokugo_test>43</kokugo_test>

これを定義するXMLスキーマは以下のようになるよ。

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="kokugo_test" type="TestPointType" />

<xsd:simpleType name="TestPointType">
<xsd:restriction base="xsd:int">
<xsd:minInclusive value="0" />
<xsd:maxInclusive value="100" />

</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

さらら: う〜ん。知らない言葉が・・・・

たけち: まず、<xsd:element name="kokugo_test" type="TestPointType" /> というのは、わかるよね。kokugo_testという要素はTestPointType型の値をとる要素ですよ、という意味だね。

さらら: えぇ。

たけち: 次にTestPointType型という単純型(Simple Type)を定義したいので、<xsd:simpleType name="TestPointType">という要素がまずきているんだ。これは「TestPointType型という名前の単純型を定義します」という意味なんだ。
そのTestPointType型という単純型は、xsd:intを基準型(Base Type)として、それを制限(restriction)して作るものなので、<xsd:restriction base="xsd:int">という要素が入るんだ。これは「xsd:int型を基準型として、その範囲を制限します」という意味なんだよね。
そして、その<xsd:restriction base="xsd:int">には、「最小値は0ですよ」「最大値は100ですよ」という条件が入る。「最小値は0ですよ」にあたるのが、<xsd:minInclusive value="0" /> の部分で、「最大値は100ですよ」にあたるのが、<xsd:maxInclusive value="100" />なんだ。
以上のことを図示しておくね。

さらら: うん。図をみてゆくとわかる気がするわ。

たけち

ユーザ派生データ型の例


制約ファセット(constraining facet)

たけち: ここで、<xsd:minInclusive value="0" />・・・最小値は0ですよ
<xsd:maxInclusive value="100" />・・・最大値は100ですよ
という部分が一番重要だけれど、こういう「具体的にどう制限するか」ということを表した部分を制約ファセットと呼ぶんだ。単純型における制限(restriction)を使ったユーザ派生データ型の定義をまとめると図のようになるんだ。

たけち

ユーザ派生データ型の定義方法

さらら: うん。やっとわかったわ。

たけち: よかった。。。。次回はいろいろな制約ファセットについて勉強しようね。

さらら: えっ? いろいろな制約ファセットって・・・・ 制約ファセットって「最小値」と「最大値」だけじゃないの? (^ ^;

たけち: もちろんだよ。。。(^ ^; だから、次回も頑張ろうね。

さらら: あっ、は〜い。ありがとね。

→ 次回は、制約ファセット(1): 数値の制約ファセットです。。。。。 (^ ^)v

さらら


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。