文書型定義 (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 は解析済みの文字データです。つまり、この文字データは余分な空白を認識しないプレーンテキストであり、例えばアンパーサンド (&) などの文字は、& のように文字エンティティで表す必要があります。次の表に、内部エンティティ文字を示します。これらの文字は XML で事前定義されており、解析済み文字データに使用するときは指定された XML 形式で表す必要があります。
文字 |
XML 表現 |
---|---|
< (より小) |
< |
> (より大) |
> |
' (アポストロフィ) |
' |
" (引用符) |
" |
& (アンパーサンド) |
& |
要素の属性は、次の規則に従って宣言します。
<!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"。デフォルト値として次のいずれかを指定します。
|
#IMPLIED |
オプション。値を指定する必要はありません。アプリケーションによりデフォルト値が指定されます。 |
#REQUIRED |
文書では値を指定しなければなりません。デフォルト値はありません。 |
'literal' |
文書で値が指定されない場合に使用するデフォルト値。 |
#FIXED 'literal' |
使用するデフォルト値。文書で値が指定される場合、その値はこの固定値に等しくなければなりません。 |
属性値は文字列であるため、XML では常に引用符で囲みます。ATTLIST 宣言の属性は順不同です。(これは XML データで順番がないのと同じです)。DTD を読みやすくするために空白が使用されます。
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. -->