ユニオン(union)データ派生型

2002年8月4日(日)更新


■ユニオン(union)

たけち: 今まで単純型のユーザー派生データ型の作り方として 制限(restriction)ばかりを勉強していたよね。

さらら: そうね。覚えないといけないことがあって大変だったわ。

たけち: ところが、単純型のユーザー派生データ型の作り方は「制限(restriction)」だけじゃないんだ。以前も説明したけれど、1.制限(restriction) 2.ユニオン(union) 3.リスト(list)の方法があるんだ。ユニオンとリストを説明していないから、今回と次回はそれらを勉強しようね。

たけち

ユーザ派生データ型の作り方

さらら: 難しいのかしら?

たけち: そんなことは、ないよ。まずユニオン(union)からだけれど、こんな例を考えてみようか。
歌会を開くことにして、参加者には一つの歌を作ってもらい、それを皆が人気投票で順位をつけるとするよね。この場合、1位、2位、3位…という正の整数(xsd:positiveInteger)になるよね。

さらら: そうね。わざわざユーザー派生データ型を作らなくても、最初から用意されているxsd:positiveIntegerを使えばいいわ。

たけち: ところが、参加者が作った歌の中に、他の人が作った歌を盗作したものがあったらどうなるかな。

さらら: えっ、そんなのは失格だわ。

さらら

たけち: そう、この場合は失格になって、順位はつけられないよね。となると、取りうる値は「1,2,3,4,5…」といった正の整数か、もしくは「失格(英語ではdisqualification)」という言葉のどちらかということになるね。

さらら: そうね、こういうデータ型を作るには、前回習った正規表現を使えばいいのかしら?

たけち: あっ、そうそう。もちろんその方法でもできるけれども、別の方法もあるんだよ。次のスキーマを見てごらん。。

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

<xsd:element name="ranking" type="RankingType" />

<xsd:simpleType name="RankingType">
<xsd:union memberTypes="DisqualifiedType xsd:positiveInteger" />
</xsd:simpleType>

<xsd:simpleType name="DisqualifiedType">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="失格" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

たけち: まず列挙(enumeration)を使って「失格」という言葉しか値として取らないDisqualifiedTypeというのを定義している。これはいいよね。

さらら: えぇ。

たけち: 次に、
<xsd:union memberTypes="DisqualifiedType xsd:positiveInteger" />
と書くことによって、「失格」という言葉を取るか、それとも正の整数(xsd:positiveInteger)を取るか、どちらでもとれるように統合(union)して、それをRankingTypeという名前のデータ型にしているんだよ。

さらら: なるほど、わかったわ。

たけち: ユニオンはこういうふうに、数値と文字列といった異質なものを統合(union)したい場合に便利に使える派生のさせ方なんだよ。まとめると、次のように書けばいいんだよ。

さらら

ユニオンデータ型の書き方

さらら: 上の例の場合だと、RankingTypeDisqualifiedTypeのユーザー派生データ型を元に、さらにRankingTypeというユーザー派生データ型を作っているのね。

たけち: そう、今まで派生の元になるものとしてビルトインデータ型を使う例ばかり見てきたけれど、基準の派生型になるのは必ずしもビルトインデータ型でなくてもよくて、自分で作ったユーザー派生データ型を基準型にして派生させてもいいんだよ。

さらら: なるほど〜。こういうこともできるのね。

たけち: オブジェクト指向では「多重継承」に近い形…あっ…(^ ^;

さらら: えっ。... (^ ^; (まさか、またJavaの話?)

たけち: 次回は単純型の最後、リストについて説明するね (^ ^;

さらら: は〜い。。。(^ ^* (よかった.....)

→ 次回はリスト(list)データ派生型です。。。。 (^ ^)v

さらら


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