制約ファセット(2) - 文字列の制約ファセット

2002年7月21日(日)更新


■制約ファセット: lengthなど

たけち: 前回は数値関連の制約ファセットを勉強したから、今回から文字列関連の制約ファセットを勉強しようね。

さらら: えぇ。やさしくね。

たけち: わかってるよ。ねぇ、さららだったら文字列をどう制限したい?

さらら: 数値だと最大値と最小値があったから。。。。。文字列の場合には長さ、つまり文字の数の制限かしら。

たけち: そう、文字列の場合には、長さ、つまり文字の数を制約する制約ファセットが3種類あるんだ。

さらら

長さの制限


■length

さらら: えぇ〜っと。。。それぞれどういう意味なの?

たけち: うん。文字列の場合に、lengthは、きっちりと何文字から成り立っているかを指定する制約ファセットなんだ。

さらら: あっ、そうなの。

たけち: 次に例を載せるね。

さらら

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

<xsd:element name="exString" type="ExStringType" />

<xsd:simpleType name="ExStringType">
<xsd:restriction base="xsd:string">
  <xsd:length value="3" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

たけち: これは3文字からなる文字列を定義したものだね。

さらら: そうなんだぁ。<xsd:length value="3" />で3文字だっていっているのね。


■minLengthとmaxLength

たけち: それから、minLengthは最低何文字の文字列なのかを指定する制約ファセットだしmaxLengthは最高何文字までの文字列なのかを指定する制約ファセットだよ。

さらら: そうなんだぁ。

たけち: 次に例を載せておくね。

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

<xsd:element name="exString" type="ExStringType" />

<xsd:simpleType name="ExStringType">
<xsd:restriction base="xsd:string">
  <xsd:minLength value="1" />
  <xsd:maxLength value="3" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>

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

たけち: よかった。。。。でもね。ここでは、文字列型についてのlengthなどの制約ファセットについて説明したけど、別の型だと文字数の制限とは違う意味になるんだ。

さらら: えっ、別の型?

たけち: あっ、うん。。。今はお話しないけど、リスト型という単純型があるんだ。それにも、lengthなどの制約ファセットが使えるんだけど、文字列型とは意味が違うってことなんだ。

さらら: ふ〜ん。。。

さらら


■制約ファセット: 列挙(enumeration)

たけち: ごめん、ちょっと先走りすぎちゃった (^ ^;) その話はまた後でするね(^ ^;) 。。。それじゃ、次に列挙(enumeration)という制約ファセットを紹介するね。

さらら: 列挙? 列挙ってなぁに?

たけち: さらら。。。 (- -;

さらら: えっ? (^ ^; なっ、なに?

さらら

たけち: 列挙っていうのは、そうだねぇ〜。。。。たとえば、曜日(のデータ)には、Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sundayしかないよね。このようにデータとしてとり得る値がはっきりしている場合に、その値を書き並べることを列挙っていうんだね。英語では、enumerate(列挙する)、enumeration(列挙)って言うんだ。

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

たけち: DTDでは要素の内容として列挙は定義できないけれど、属性値としては列挙というデータ型が定義できたよね、覚えている? 実は「万葉集テキスト」のDTDを考えましょう: その2「属性」の定義の仕方でお話したんだけどね。。。。

たけち

さらら: あっ、そっ、そう言われれば、そういう話があったかも (^ ^;

たけち: たとえば次のような歌の種類についての属性があるとするね。

<poem poemVariety="雑歌">瓜食めば子ども思ほゆ、栗食めばまして偲はゆ、いづくより来りしものぞ、眼交(まなかひ)にもとなかかりて、安寐(やすい)し寝(な)さぬ</poem>

たけち: そうして、その歌の種類についての属性宣言がDTDで次のように書かれているとしよう。

<!ELEMENT poem (#PCDATA)>
<!ATTLIST poem poemVariety (挽歌 | 雑歌 | 譬喩歌| 相聞歌) #REQUIRED>>

たけち: これはpoemVarietyという属性が「挽歌、雑歌、譬喩歌、相聞歌」といった値のどれかを取る、という意味になるんだ。つまり、列挙、だよね。これと同等のXMLスキーマは以下のように書くことができるよ。

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

<xsd:element name="poem" type="PoemType" />

<xsd:complexType name="PoemType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="poemVariety" type="PoemVarietyType" use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

<xsd:simpleType name="PoemVarietyType">

<xsd:restriction base="xsd:string">
<xsd:enumeration value="挽歌" />
<xsd:enumeration value="雑歌" />
<xsd:enumeration value="譬喩歌" />
<xsd:enumeration value="相聞歌" />
</xsd:restriction>

</xsd:simpleType>

</xsd:schema>

さらら: このcomplexTypeとかsimpleContentとかextensionってわからないわ。

たけち: それはもう少し後で説明するから今は無視してね(^^;) 見て欲しいのは、次の個所だよ。

<xsd:restriction base="xsd:string">
<xsd:enumeration value="挽歌" />
<xsd:enumeration value="雑歌" />
<xsd:enumeration value="譬喩歌" />
<xsd:enumeration value="相聞歌" />
</xsd:restriction>

たけち: ここではstring型の範囲を狭めて、「挽歌、雑歌、譬喩歌、相聞歌」といった値のどれかを取るという定義をしているんだね。

さらら: これならわかるわ。

たけち: ちなみにDTDでは属性でしかこういう定義はできなかったけれど、XMLスキーマの単純型は、要素の定義にも属性の定義にも使えるから、XMLスキーマだったら要素にもこういう定義ができるようになったんだよ。

さらら: それだと便利ね。

たけち: じゃあ、今回はこれでおしまい。

さらら: ありがと。これでやっと制約ファセットは終わりなのよね。

たけち: 実はあと一つだけ、とても強力でとても難しい制約ファセットが残っているんだけれど…(^ ^;

さらら: えっ (^ ^;

→ 次回は、制約ファセット(3) - 正規表現によるパターンです。。。。 (^ ^)v


補足: whiteSpace

さらら: whiteSpace ってなぁに?

たけち: 空白や改行をどう解釈するか、ということだよ。例えば、次のドキュメント("空白"を"△"で表しています)

<?xml version="1.0" encoding="Shift_JIS" ?>
<exString>△たけちと△
さららの△△△たのしいXML△</exString>

に対して

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

<xsd:element name="exString" type="ExStringType" />

<xsd:simpleType name="ExStringType">
<xsd:restriction base="xsd:string">
<xsd:whiteSpace value="preserve" />
</xsd:restriction>
</xsd:simpleType>

</xsd:schema>
 という定義だと、<exString>の内容は、

"△たけちと△
さららの△△△たのしいXML△"

 のままとして処理されるんだ。

たけち: それに対して、このwhiteSpaceの値がreplaceになると、TAB文字、改行文字(LF)、復帰文字は(CR)は半角スペースに置き換えられて処理されるんだ。つまりつぎのようになるんだね。

"△たけちと△△さららの△△△たのしいXML△"

たけち: さらにこのwhiteSpaceの値がcollapseになると、最初と最後の半角スペースの連続は削除され、途中の半角スペースの連続は半角スペース1つに置き換えられる。

"たけちと△さららの△たのしいXML"

さらら: ふ〜ん、いろいろとあるのね。でも、ちょっと疲れちゃった。

たけち: あっ、うん。。。。次回も頑張ろうね (^ ^)

さらら: えぇ。

たけち


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