混在内容

2002年10月13日(日)更新


■HTMLでの混在内容の例

たけち: 今回は、混在内容について勉強しようね。

さらら: 混在内容って?

たけち: 要素の内容として、テキストと要素が混在していることを言うんだよ。例えばHTMLではよくこんな書き方をしたよね。

<p><u>雑歌</u>、<u>挽歌</u>、<u>相聞歌</u>は万葉集の<font color="red">三大部立</font>と言われます。また相聞歌の中で<strong>譬喩表現</strong>が使われているものを特に<u>譬喩歌</u>と呼びます。</p>

さらら: あ、そうそう、こんな書き方よくしたわ (^ ^;)

たけち: こんなふうに要素の内容として、テキストと要素が混在しているもののことを言うんだ。この例題ではfont要素なんか使っているところがちょっと古いけれど (^ ^;)
一応わかりやすい例題ということで、こういうXMLの文書を考えてみようね。それと、本来のHTMLはこれらの要素がお互いにネストしてもいい関係にあるけれど、ここでは話を簡単にするために、p要素の中で、ネストはされずに、u要素、font要素、strong要素などが出てくることを考えようね。
そういった場合には、このDTDはどうやって書けたかな。

さらら: え〜ん、DTDも覚えていないといけないのね...(^ ^; ..... こんな感じじゃないかしら。。

たけち

<!ELEMENT p (#PCDATA | u | font | strong)* >
<!ELEMENT u (#PCDATA)>
<!ELEMENT font (#PCDATA)>
<!ELEMENT strong (#PCDATA)>
<!ATTLIST font color NMTOKEN #IMPLIED>

たけち: そうだね。ここで見てもらいたいのは、

    <!ELEMENT p (#PCDATA | u | font | strong)* >

 の部分だよ。ここでは#PCDATAと他の要素のどれかが出現し、それが0回から無制限に並んでいる、という意味になるよね。

さらら: そうね。

たけち: さてこれをXML Schemaではどのように書くかなんだけれど...

さらら: 全然見当もつかないわ! (キッパリ)

たけち: そっ、そうだよね (^ ^;) これはこんなふうに書くんだよ。。。。

たけち

■混在内容を定義したXML Schemaの例
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="p" type="PType" />

<xsd:complexType name="PType" mixed="true">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="u" />
        <xsd:element ref="font" />
        <xsd:element ref="strong" />
    </xsd:choice>

</xsd:complexType>

<xsd:element name="u" type="xsd:string" />
<xsd:element name="font" type="FontType" />
<xsd:element name="strong" type="xsd:string" />

<xsd:complexType name="FontType">
    <xsd:simpleContent>
    <xsd:extension base="xsd:string">
    <xsd:attribute name="color" type="xsd:NMTOKEN" />
    </xsd:extension>
    </xsd:simpleContent>
</xsd:complexType>

</xsd:schema>


■mixed="true"

たけち: この中で見てほしいのは、

<xsd:complexType name="PType" mixed="true">
    <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element ref="u" />
        <xsd:element ref="font" />
        <xsd:element ref="strong" />
    </xsd:choice>

</xsd:complexType>

 の部分で、xsd:complexType要素のmixed属性の mixed="true" という部分だよ。これがもしなければ、これはDTDでいうと、

     <!ELEMENT p (u | font | strong)*>

 と同じ意味になるよね。

さらら: あっ、そうね。これだと、#PCDATAが無いのと同じね。

たけち: それを、

<!ELEMENT p (#PCDATA | u | font | strong)* >

 の意味に変えているのが、この mixed="true" の部分なんだよ。この mixed="true" があることにより、これらの要素の並びの間や前後に、テキストが挟まっていても良い、という意味になるんだ。

さらら: そうなんだ。。。DTDとは全然違うのね。

たけち: そうだね。まったくDTDと指定する方法が違うから注意しないといけないね。そしてこういう指定の仕方をしているから、今までDTDでは決められなかったような混在内容の指定の仕方もできるんだ。例えば、さっきのPTypeの定義を以下のように書き換えてみるね。

さらら

■choiceをsequenceに変更してみると・・・
<xsd:complexType name="PType" mixed="true">
    <xsd:sequence>
        <xsd:element ref="u" />
        <xsd:element ref="font" />
        <xsd:element ref="strong" />
    </xsd:sequence>

</xsd:complexType>

さらら: choiceをsequenceに変更したのね。これだと、どうなるの?

たけち: こう書き換えると、 u → font → strong の順番で1つずつだけこれらの要素が出現し、それらの要素の間にテキストが入っていてもかまわない、という意味になるんだ。だから次のようなXMLデータに合致するんだよ。

<p><u>雑歌、挽歌、相聞歌</u>は万葉集の<font color="red">三大部立</font>と言われます。また相聞歌の中で譬喩表現が使われているものを特に<strong>譬喩歌</strong>と呼びます。</p>

さらら: うんうん。p要素の中に、u要素→テキスト→font要素→テキスト→strong要素→テキスト、が順に出てきているわ。やはりXML Schemaだと、DTDとはかなり違ったことが定義できるのね。

たけち: 今回はこれでおしまい。次回は「名前付きモデルグループ」について説明するね。

さらら: は〜い。

次の名前付きモデルグループにつづきます 。。。。 (^ ^*


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