ホーム > X-Plus > XML Square >  デベロッパーズコーナー  >  エンジニアのためのXMLスキーマ講座

この記事を送る はてなブックマークに追加する BuzzurlにブックマークBuzzurlにブックマーク Yahoo!ブックマークに登録
テキストリンクコードを取得する

デベロッパーズコーナー:エンジニアのためのXMLスキーマ講座「最終回:スキーマ文書のカスタマイズ」(3)

2002年10月30日作成 

XML Schema達人への道
最終回:スキーマ文書のカスタマイズ
(株)日本ユニテック
奥井 康弘

<この記事はDigital Xpress 2001 Vol.9(6-7月号)に掲載されたものです>

さて、今回はこのシリーズの最終回です。スキーマ文書をカスタマイズするという観点で以下の機能について説明します。
  ●スキーマ文書を分割して管理する方法
  ●構造定義の一部や属性定義の一部を共有する方法
  ●既存のスキーマ文書の構造定義の一部や属性定義の一部を修正する方法
さあ、XML Schema の達人の域まであと一歩です。がんばってください。

<<前ページ「XMLスキーマでの定義の一部共有方法」

既存スキーマ文書の一部修正

ここまでに説明したのは、1 つのスキーマ文書を上手に作るために構造定義の一部や属性のまとまりを共有する機能でした。

次に、既存のスキーマ文書を流用して、しかも、その一部を変えるという手法について説明しましょう。その一部を修正したいスキーマ文書を指定した上で、その中の型定義などを制限あるいは拡張して変更することができます。修正の対象は次の3つです。

    ● モデルグループ定義(xsd:group)
    ● 属性グループ定義(xsd:attributeGroup)
    ● 型定義(xsd:complexType 、xsd:simpleType)

これらの変更はxsd:redefine で行います。

スキーマ文書の一部を制限あるいは拡張してカスタマイズする方法
<xsd:redefine schemaLocation= " 参照するスキーマ文書のURI">
      制限、拡張したxsd:simpleType 、xsd:complexType 、xsd:group 、xsd:attributeGroup
</xsd:redefine>

新しいスキーマ文書では、修正を行ったxsd:redefine 指定だけを入れます。xsd:redefine によって修正されるもの以外は元のスキーマ文書で指定されたものがそのまま使用されます。

モデルグループ定義のカスタマイズ

xsd:group によってモデルグループのカスタマイズを行うと きには、まず、xsd:redefine を指定し、その子として新しく定義するモデルグループxsd:group をname 属性を付けて指定します。そして、その子としてxsd:choice またはxsd:sequence などを指定し、その子として、変更対象となるモデルグループをxsd:group で参照します。変更対象となるモデルグループの名前をxsd:group のref 属性で指定しますが、新しく定義しているモデルグループxsd:group のname 属性もそれと同じ名前にします。

次の例では、さきほどのbook-article2.xsd のモデルグループ "contents" の前にauthor 要素を追加しています。

【モデルグループ定義を変更したスキーマ文書:redefine-group.xsd】

このカスタマイズ版スキーマ文書に従うXML インスタンスは次のようなものです。

<?xml version="1.0"?>
<book xmlns:xsi=
        "http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="redefine-group.xsd">
  <author> 奥井康弘 </author>
  <title>XML の館</title>
  <para> 昔遠い国にXML 城と呼ばれるお城があった。そこには....
</para>
</book>

属性グループ定義のカスタマイズ

属性グループもカスタマイズ可能です。この場合、参照する属性グループに新たな属性を追加することになります。カスタマイズの方法は、モデルグループのカスタマイズと同様に、まず xsd:redefine を指定し、その子として新しく定義する属性グループxsd:attributeGroup をname 属性を付けて指定しま
す。そして、その子として、変更対象となる属性グループをxsd:attributeGroup で指定しますが、このとき、新しく定義している属性グループの名前と変更対照の属性グループの名前を同じにします。さらに、追加する属性の属性宣言を行います。

次の例ではage 属性を追加しています。

【属性グループを変更したスキーマ文書:redefine-attgroup.xsd】

【変更したスキーマ文書に従うXML インスタンス】
<?xml version="1.0"?>
<CD xmlns:xsi=
    "http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="redefine-attgroup.xsd"
    id="BG1938"
    type="Jazz"
    age="1930S">
  <title> カーネギーホールコンサート完全版</title>
  <artist> ベニー・グッドマン</artist>
</CD>

型定義のカスタマイズ

xsd:complexType 、xsd:simpleType のカスタマイズを行うには、型の制限と拡張を行うxsd:restriction とxsd:extension を使用します。sd:restriction については第2回の記事で型の派生を行うために説明しました。xsd:extension は、要素や属性の追加などを行うために使用されるもので、要素を含む複合型を拡張するときには次のように指定します。

(※複合型の拡張以外にもxsd:extension を使った拡張のパターンがありますが、ここでは説明しません。詳しくは技術評論社「標準XML 完全解説 下巻」をご覧下さい。)

複合型を基準型として拡張した複合型の書き方

<xsd:complexType name=" 新しい複合型の名前">
  <xsd:complexContent>
    <xsd:extension base= " 基準型となる複合型を参照する修飾名">
      基準となる複合型を拡張した指定(xsd:sequence 、xsd:choice 、xsd:all など)
    </xsd:extension>
  </xsd:complexContent>
</xsd:complexType>

※ xsd:complexType をxsd:element の中に直接書くときに
はxsd:complexType のname 属性は使用しません。

次の例では、複合型定義を拡張したものです。まずxsd:redefine を指定し、その子として新しく定義する型定義 xsd:complexType をname 属性を付けて指定します。そして、その子として、内容モデルに要素が入ることを表すxsd:complexContent を指定し、さらにその子として拡張を行うための xsd:extension を指定します。このときbase 属性で、変更対象となる型定義の名前を指定します。これは、新しく定義する型定義の名前と同じものです。そして、その子として追加する要素の宣言を行います。ここでは、name 要素、price 要素という順序を持つ型に対して、最後にcharacteristic 要素
を追加しています。

【変更元のスキーマ文書:complextype.xsd】
<?xml version="1.0"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <xsd:element name="menu">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="liquor"maxOccurs="unbounded"/>
        <xsd:element ref="softDrink"maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

  <xsd:element name="liquor"type="information"/>

  <xsd:element name="softDrink"type="information"/>

  <xsd:complexType name="information">
    <xsd:sequence>
      <xsd:element ref="name"/>
      <xsd:element ref="price"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="name"type="xsd:string"/>
  <xsd:element name="price"type="xsd:string"/>

</xsd:schema>


【型定義を変更したスキーマ文書:redefine-complextype.xsd】


【redefine-complextype.xsd に従うXML インスタンス】
<?xml version="1.0"?>
<menu xmlns:xsi=
      "http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation=     "redefine-complextype.xsd">
  <liquor>
    <name> モスコミュール </name>
    <price>800 円 </price>
    <characteristic> ちょっぴり甘くってちょっぴり酸味がある。女性にお奨め。</characteristic>
  </liquor>
  <softDrink>
    <name> ウーロン茶</name>
    <price>500 円 </price>
    <characteristic> 油っこいお食事のあとに最適。</characteristic>
  </softDrink>
</menu>

まとめ

XML Schema を5回に分けてひととおり説明しました。XML インスタンスの側から見たときの大きな特徴は名前空間への対応です。これについては前回前々回で説明しましたが、その他、構造定義でもDTDの不具合の調整を含め、改善がなされていました。

今後、DTD によるスキーマ開発からXML Schema によるスキーマ開発への移行が予想され、XML Schema を目にする機会も増えるでしょう。あるいは、XML Schema でスキーマ文書を作ることになるかもしれません。そのときに、このシリーズで解説した内容が役立つはずです。さあ、XML Schema の
達人となったみなさん、自信を持って、XML の世界で活躍してください。




関連サービス

XMLスキーマの策定、作成業務



この記事と関連の高い記事

関連キーワード:XMLスキーマ




ページトップへ戻る