連載
» 2003年07月16日 10時00分 公開

XMLテクニック集(3):DTDで要素型宣言を定義する (2/3)

[山田祥寛,@IT]

DTDで属性リスト宣言を定義する

アイコン

DTDは、XML文書をある一定の構文に従ってルール付けするためのものです。ここでは属性値のデータ型やデフォルト値などを定義することができる属性リスト宣言について解説します。

カテゴリ DTD
関連要素 <!ATTLIST>
関連記事 DTDで要素型宣言を定義する

 「DTDで要素型宣言を定義する」でもご紹介したように、DTD(Document Type Definition)はXML文書において使用することのできる要素や属性の種類、また、その並び(順番)、登場回数などを規定する場合に、コンパクトに構造を表現する手段を提供します。

 本稿では、要素型宣言と並んで使用する機会が多い「属性リスト宣言」について、紹介することにしましょう。属性リスト宣言では、属性値のデータ型やデフォルト値、属性の種類などを定義できます。

 早速、具体的なサンプルをみてみることにしましょう。

[books_dtd.xml]
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE books [
  <!ELEMENT books (book+)>
  <!ELEMENT book (title,author,published,price,publishDate,description)>
  <!ELEMENT title (#PCDATA)>
  <!ELEMENT author (#PCDATA)>
  <!ELEMENT published (#PCDATA)>
  <!ELEMENT price (#PCDATA)>
  <!ELEMENT publishDate (#PCDATA)>
  <!ELEMENT description (#PCDATA|keyword)*>
  <!ELEMENT keyword (#PCDATA)>
  <!ATTLIST book isbn CDATA #REQUIRED>
]>
 
<books name="書籍情報一覧">
  <book isbn="ISBN4-7981-0189-3">
    <title>10日でおぼえるJSP/サーブレット入門教室</title>
    <author>Y.Yamada</author>
    <published>翔泳社</published>
    <price>2800</price>
    <publishDate>2002/05/17</publishDate>
    <description>サーバーサイド技術の雄「<keywd>JSP/サーブレット</keywd>」をJava初心者でもわかる10日間のセミナー形式で紹介。</description>
  </book>
  ……中略……
</books>

 サンプル中の以下の行に注目してみましょう。

<!ATTLIST book isbn CDATA #REQUIRED>

 これは<book>要素に属するisbn属性を宣言する一文です。「CDATA」は属性値のデータ型を、「#REQUIRED」はisbn属性の特性(この場合はisbn属性が必須である)を表します。

 属性リスト宣言の一般的な構文は、以下のとおりです。

<!ATTLIST 要素名 属性名 属性のデータ型 属性の特性>


 属性のデータ型、特性としては、それぞれ以下のものを指定することが可能です。

データ型 概要
CDATA 任意の文字データ
ENTITY 実体参照名(「実体参照を利用して、XML文書を分割管理する」を参照)
ENTITIES 半角スペース区切りのENTITY集合
ID 要素を一意に判別するための識別子。必ずユニークでなければならない
IDREF ID型の属性に対応する識別子参照。同一のXML文書内に対応するID値が存在しなければならない
NMTOKEN 名前トークン。アルファベット(A-Z)、数字(0-9)、アンダースコア(_)、ハイフン(-)、コロン(:)、ピリオド(.)、ひらがな、カタカナ、漢字から構成される文字列
NMTOKENS 半角スペース区切りのNMTOKENS集合
候補オプション パイプ区切りで属性値として指定できる値セットを定義
属性のデータ型

 NMTOKENSは別名「名前文字」とも呼ばれ、要素名や属性名で使用することのできる文字集合のことをいいます。実際には、1文字目は文字(アルファベット、ひらがな、カタカナ、漢字)、コロン、アンダースコアで始まらなければなりません。2文字目以降は上記表で示した一連の文字を使用することができます。

 ただし、名前文字にコロンを使用することは推奨されません。なぜなら、コロン(:)は名前空間との区切り(<xsl:template>のように)を表す文字であり、名前そのものとしてコロンを使用することは大変紛らわしいからです。

 また、NMTOKENには「xml〜」で始まる名前は使用できない点にも注意してください。なぜなら、「xml〜」で始まる名前は、今後のXML仕様の拡張のために予約されている文字列だからです。

特性:概要、用例

  • デフォルト値: データ型が候補オプションである場合にのみ使用可能。無指定の場合のデフォルト値を指定する
    用例:<!ATTLIST book cdrom (yes|no) "no">
  • #REQUIRED: 属性が必須であることを示す
    用例:<!ATTLIST book isbn CDATA #REQUIRED>
  • #IMPLIED: 属性が任意であることを示す
    用例:<!ATTLIST book isbn CDATA #IMPLIED>
  • #FIXED: 属性値を設定値で固定。「#FIXED "設定値"」の形式で指定
    用例:<!ATTLIST option selected CDATA #FIXED "selected">
属性の特性

 「#FIXED」が指定された場合、該当する属性が指定された固定値以外をとれないことを意味します。例えば、HTMLにおけるnowrap属性(<td>要素)やselected属性(<option>要素)などは「#FIXED」指定の典型的な例です。

<td nowrap="nowrap">……
<option selected="selected">……

 HTMLではこうした「#FIXED」属性は属性値を省略することができましたが、XML文書においては値まできちんと記述しなければならない点に注意してください。

 なお、属性リスト宣言では「リスト」とあるように、ある要素に属する複数の属性をまとめて定義することも可能です。その場合、属性名以降を列記して、以下のように記述します。

<!ATTLIST book isbn CDATA #IMPLIED
               cdrom (yes|no) "no">

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。