DTD を読む

文書型定義 (Document type Definition (DTD)) は、拡張可能マークアップ言語 (Extensible Markup Language (XML)) タグの内容と階層を記述します。組織は、この XML タグを使用してプラットフォーム全体で共有するデータを定義します。DTD は、次の項目から構成されます。

DTD のさまざまな宣言の完全なリストと説明については、XML Standard Recommendations の Web サイト (http://www.w3.org/TR/REC-xml) を参照してください。

どのテキストエディタを使用しても Domino DTD ファイルを表示できます。Notes をインストールする際にデフォルト値を受け入れた場合、このファイルのパスは Notes/domino_6_0.dtd です。

要素

要素はタグです。次のように定義されます。

<!ELEMENT tagname ( content-model ) >

tagname はタグの名前です。タグの名前は大文字と小文字を区別します。content-model は要素内に表示できる内容を説明します。ネストされたタグを含めることもできます。要素は開始タグと終了タグの間で使用されます。例えば Domino DTD の viewentry 要素は、次のように定義されています。

<!ELEMENT viewentry ( entrydata* ) >

この要素は XML の出力では次のように使用されます。

<viewentry children="3">

<entrydata columnnumber="1">

<text> Joe Smith </text>

</entrydata>

</viewentry>

内容モデルを構築するとき、次の演算子を使用します。

次の例は、内容モデルを構築するときの演算子の使い方を示しています。

<!ELEMENT acl ( role*, aclentry+, logentry* )>

この例では、<acl> 要素には、任意の数の <role> 要素、続いて 1 つ以上の <aclentry> 要素、続いて任意の数の <logentry> 要素が含まれます。

次は演算子の別の例です。

<!ELEMENT text ( #PCDATA | break )* >

この場合、<text> 要素には、任意の数のプレーンテキストまたは <break> 要素が任意の順序で含まれます。#PCDATA は解析済みの文字データです。つまり、この文字データは余分な空白を認識しないプレーンテキストであり、例えばアンパーサンド (&) などの文字は、&amp; のように文字エンティティで表す必要があります。次の表に、内部エンティティ文字を示します。これらの文字は XML で事前定義されており、解析済み文字データに使用するときは指定された XML 形式で表す必要があります。

文字

XML 表現

< (より小)

&lt;

> (より大)

&gt;

' (アポストロフィ)

&apos;

" (引用符)

&quot;

& (アンパーサンド)

&amp;

属性

要素の属性は、次の規則に従って宣言します。

<!ATTLIST tagname

attr1

type1

default_value1

attr2

type2

default_value2

 

...

 

tagname 要素に対する属性が、種類とデフォルト値とともに定義されています。

次の例では、タグ名が book である要素を定義します。

<!ATTLIST book

title

CDATA

#REQUIRED

isbn

CDATA

#IMPLIED

cover

(hard|paper)

#IMPLIED

format

( bound|looseleaf|scroll|parchment )

"bound"

上記の例では、<book> 要素に対して title、isbn、cover、format の 4 つの許可された属性が定義されています。<book> に対して他に ATTLIST 宣言がない場合は、これらの属性だけが許可された属性となります。 他はいずれも不正な属性です。title 属性には任意の値を設定できますが、default_value が #REQUIRED であるため、必須の値です。title 属性のない <book> 要素は、この DTD によると無効です。 isbn 属性には任意の値を設定できますが、省略可能です。cover 属性は、「hard」または「paper」のいずれかの値を取ります。その他の値は不正ですが、属性を省略することもできます。format 属性は 4 つのうちいずれかの値を取ります。省略された場合は、妥当性を検証するパーサーによって "bound" が値として与えられます。これは format="bound" が XML の内容に実際に表示されたのと同じです。

すべての属性は、次の表にあるように、本来は文字列です。

属性値

説明

CDATA

未解析の文字データ。任意のテキスト文字列を意味します。

NMTOKEN

英字、数字、ハイフン、アンダースコア、コロンから構成される単一の名前トークン。

NMTOKENS

空白で区切られた名前トークンのリスト。

ID

文書内の要素のインスタンス識別名。2 つの ID が同じ名前を共有することはできません。

( a | b | c )

"a" または "b" または "c"。デフォルト値として次のいずれかを指定します。

  • "a" のように、列挙されている選択肢の中の 1 つ。
  • #REQUIRED。文書では列挙されている選択肢の中から 1 つを指定しなければならないことを意味します。
  • #IMPLIED。値を指定する必要がないことを意味します。

#IMPLIED

オプション。値を指定する必要はありません。アプリケーションによりデフォルト値が指定されます。

#REQUIRED

文書では値を指定しなければなりません。デフォルト値はありません。

'literal'

文書で値が指定されない場合に使用するデフォルト値。

#FIXED 'literal'

使用するデフォルト値。文書で値が指定される場合、その値はこの固定値に等しくなければなりません。

属性値は文字列であるため、XML では常に引用符で囲みます。ATTLIST 宣言の属性は順不同です。(これは XML データで順番がないのと同じです)。DTD を読みやすくするために空白が使用されます。

Entities

XML エンティティには 3 つの種類があります。

XML 文書では内部エンティティの参照が可能です。例えば、DTD で次のような内部エンティティを宣言します。

<!ENTITY productName "2000 Calendar">

このとき、この内部エンティティを .xml ファイルで次のように参照します。

<response>Thank you for purchasing the &productName; from us.</response> 

これは、2001 年 1 月に DTD を更新して & productName; エンティティの値を "2001 Calendar" に変更すれば、このエンティティを参照するすべての XML 文書にその変更が反映されることを意味します。

Domino DTD で定義されるエンティティは、パラメータエンティティです。パラメータエンティティは、DTD の内部だけで参照するために作成されるエンティティです。このエンティティを使用することでコードの再利用性が高まり、DTD のサイズが縮小されます。.xml ファイルではパラメータエンティティを参照できません。

Domino DTD エンティティは、次に示すように、宣言されたマクロとして機能します。

<!ENTITY macroname "macrocontent" >

以下に例を示します。

<!ENTITY

% string

"CDATA" >

<!ENTITY

% book.formats

"bound|looseleaf|scroll|parchment" >

<!ENTITY

% book.covers

"hard|paper" >

上記のエンティティは、次のように使用されます。

<!ATTLIST book

title

%string;

#REQUIRED

isbn

%string;

#IMPLIED

cover

( %book.covers; )

#IMPLIED

format

( %book.formats; )

"bound"

%book.formats; エンティティはフォーマットオプションのリストとして定義されており、book 要素の属性リスト定義内のリストを置換します。エンティティの名前はパーセント記号とセミコロンで囲まれ、内容は C 言語のマクロのように挿入されます。エンティティを使用してフォーマットオプションのリストを表すと、このエンティティを複数回使用できるため、DTD の効率が向上します。例えば、この DTD の中に book 要素のほかに manual 要素がある場合、マニュアルがソフトカバーでのみ提供される点だけが異なり、使用できるフォーマットオプションは同じであれば、manual 要素の属性リストを定義するときに %book.formats; エンティティを再利用できます。

コメント

DTD 内のコメントは、次のように記号で囲みます。

<!-- comment text, anything except two dashes. -->