XMLマスターへの道
〜「XMLマスター:ベーシック」試験対策〜

第9回 DTDの実体宣言と記法宣言

内藤一彦
NRIラーニングネットワーク株式会社
2003/9/13

 「第5回 valid XMLとDTDの関係」でDTDの要素型宣言・属性リスト宣言について解説した後、3回連続で「模擬問題」をお届けしましたが、今回からは通常の解説に戻ります。まず、第5回で出題していた予習問題の解答から見ていきましょう。

編集局注:第5回の予習問題と解答は武田栄子氏(ウチダ人材開発センタ)が執筆されています。

第5回 予習問題

(Q1) 以下のXML文書について正しく説明しているものを選択してください(左端の行番号はXML文書に含まれません)。

「XML文書
1 <root xmlns="urn:hoge"
2       xmlns:test="urn:test"/>    
3   <child1 attr="01"/>
4   <test:child2/>
5   <child3 xmlns=""/>
6 </root>

(a) このXML文書は、デフォルトの名前空間を使って記述されている
(b) (1行目) 要素rootが属している名前空間はurn:hogeである
(c) (1行目) 要素rootはどの名前空間にも属さない
(d) (1行目) 要素rootが属している名前空間はurn:testである
(e) (1行目) 要素rootが属している名前空間はtestである
(f) (3行目) 要素child1が属している名前空間はurn:hogeである
(g) (3行目) 要素child1はどの名前空間にも属さない
(h) (3行目) 属性attrが属している名前空間はurn:hogeである
(i) (3行目) 属性attrはどの名前空間にも属さない
(j) (4行目) 要素child2が属している名前空間はtestである
(k)
(4行目) 要素child2が属している名前空間はurn:testである
(l) (5行目) 要素child3はどの名前空間にも属さない
(m) (5行目) 要素child3が属している名前空間はurn:hogeである
(n) (5行目) 要素child3が属している名前空間はurn:testである
 

(Q2) 要素aの内容が10以上20未満となるようにXML Schemaで記述するときに必要な制約ファセットをすべて選択してください。

(a) <xsd:minInclusive value="10"/>
(b) <xsd:minExclusive value="10"/>
(c) <xsd:maxInclusive value="20"/>
(d) <xsd:maxExclusive value="20"/>

(Q3) DOMについて正しく説明しているものをすべて選択してください。

(a) 参照、更新ともに可能である
(b) DOMを利用する場合、Javaでプログラミングする必要がある
(c) Documentは、XML文書全体を表すオブジェクトである
(d) W3Cで策定された仕様である 

第5回 予習問題の解答

 予習問題の解答は次のとおりです。

(Q1) 以下のXML文書について正しく説明しているものを選択してください。

 答えは、(a)(b)(f)(i)(k)(l)です。

 MSXML 3.0 SP2日本語版を使い、JavaScriptで実装したサンプルを用意しました(Q1.htmlQ1.xml)。筆者の環境(Windows 2000 Professional SP3、Internet Explorer 6.0 SP1)で動作確認していますが、MSXML 3.0のインストールが行えていれば画面イメージ図と同じように動作するかと思います。

Q1の解答サンプル(Q1.htmlQ1.xml

 この問題で使用しているXML文書では、ルート要素でデフォルトおよび名前空間接頭辞testの名前空間を宣言しています。デフォルトの名前空間を適用した要素から名前空間のスコープが適用されます。

 ただし、デフォルトの名前空間が適用されている範囲であっても、属性で名前空間接頭辞が指定されていなければ、その属性はどの名前空間にも属さないことになります。属性を任意の名前空間に属させたい場合、明示的に名前空間接頭辞を付加する必要があります。どの名前空間にも属さないようにしたい場合、適用したい要素にxmlns=""を記述してください。

 名前空間のスコープに関する問題は出題頻度が高いので、

  • 名前空間を宣言した要素における取り扱い
  • デフォルトの名前空間における取り扱い
  • 属性における取り扱い
  • 名前空間の取り消しにおける取り扱い

を整理しておきましょう。

(Q2) 要素aの内容が10以上20未満となるようにXML Schemaで記述するときに必要な制約ファセットをすべて選択してください。

 答えは、(a)(d)です。

 xxxInclusiveの場合、値の範囲が「以下」「以上」となるように制約します。xxxExlusiveの場合、値の範囲が「未満」「より大きい」となるように制約します。

(Q3) DOMについて正しく説明しているものをすべて選択してください。

 答えは、(a)(c)(d)です。

 Q1のサンプルであるQ1.htmlQ1.xmlはJavaScriptで実装していますが、DOMを使う場合、JavaやVBなどほかの言語でも実装でき、実装言語を特定していません。DOMはXMLやHTMLへのアクセスを提供するAPIで、W3Cの勧告です。SAX(Simple API for XML)は、XML文書をシーケンシャルにアクセスするAPIで、W3Cの仕様ではありません。プロフェッショナル試験でもDOMとSAXとの比較を問われることが多いので、整理しておくとよいでしょう。

DTDの実体宣言・記法宣言

 ここからは今回のテーマであるDTDの実体宣言・記法宣言について解説していきます。

今回の問題
(Q1) 次の宣言で定義される外部実体の参照方法として正しいものをすべて選んでください。

「実体宣言」
<!ENTITY detail SYSTEM "detail.txt">

「外部ファイルの内容」
<?xml version="1.0" encoding="Shift_JIS" ?>
「XMLマスター・ベーシック」試験の合格に必要なスキルを身に付けます。

(a)
<コース>
  <コース名>XMLマスター・ベーシック対策</コース名>
  <コース詳細>&detail; </コース詳細>
</コース>
(b)
<コース>
  <コース名>XMLマスター・ベーシック対策</コース名>
  &detail;
</コース>
(c)
<コース コース詳細="&detail;">
  <コース名>XMLマスター・ベーシック対策</コース名>
</コース>

(d)
<コース>
  <コース名>XMLマスター・ベーシック対策</コース名>
  %detail;
</コース>


(Q2) JPGファイル形式の外部ファイルの外部解析対象外実体としての参照方法として正しいものをすべて選んでください(要素名、属性名については考慮する必要はありません)。

「実体宣言」
<!ENTITY imgFile SYSTEM "img.jpg" NDATA JPG>

(a)
<IMG>&img;</IMG>
(b)
<IMG>%img;</IMG>
(c)
<IMG src="&imgFile;" />
(d)
<IMG src="imgFile" /> ただし、src属性はENTITY型


 今回は、この問題に解答するうえで必要となる下記の内容について解説します。

  • 実体宣言
      実体の種類
      実体宣言の記述形式
  • 記法宣言

実体宣言

実体の種類

 繰り返し使われるような文字列に簡単な名前を付けておき、XML中でその名前を指定することにより実際の文字列を参照することができます。この場合の実際の文字列が「実体」です。実体としては文字列のほかに、外部ファイル(テキストファイル、非テキストファイル)を参照することができます。

 実体には、次の分類法があります。

一般実体 or パラメータ実体
一般実体 XML文書本体で参照を行う
パラメータ実体 DTDで参照を行う
内部実体 or 外部実体
内部実体 参照する実体が文字列
外部実体 参照する実体が外部ファイル
解析対象 or 解析対象外
解析対象 参照する実体をXMLパーサで解析できる(テキストデータ)
解析対象外 参照する実体はXMLパーサで解析できない(バイナリデータ)

 実体の種類は上記分類の組み合わせで決まり、実体の種類によって実体宣言や実体参照の記述形式が異なります。

実体宣言の記述形式

内部一般実体
 これは、XML文書本体で文字列を参照するタイプの実体です。

<!ENTITY 実体名 "文字列">

内部一般の実体宣言の構文

&実体名;

実体の参照

<!DOCTYPE EMPLOYEES [
  <!ENTITY DEPT1 "IT Education Services Dept.">
]>
<EMPLOYEES>
  <EMPLOYEE empid="A001">
    <Name>Kazuhiko Naito</Name>
    <Dept deptid="d10">&DEPT1;</Dept>
  </EMPLOYEE>
</EMPLOYEES>
リスト1 実体宣言・内部実体参照を行っているXML(EMPLOYEE1.xml)

 このXMLドキュメントをInternet Explorerで表示すると次のようになります。

画面1 実体名が参照する文字列に置き換わった

 DEPT要素の値が実体に置換されていることが確認できます。実体の参照・置換は、XMLドキュメントがXMLパーサに解析される際に行われます。

外部一般実体
 これは外部ファイル(外部サブセット)を参照し、その中に記述されているテキストデータを参照するタイプの実体です。

<!ENTITY 実体名 SYSTEM "外部ファイルのURI">

外部実体宣言の構文

 上述の構文では外部ファイルの参照にSYSTEMキーワードを使用していますが、外部サブセットのDTDを参照するのと同様のPUBLICキーワードを使用する形式も取れます(「第5回 valid XMLとDTDの関係」の「DTDの記述場所」を参照)。

<!ENTITY 実体名 PUBLIC "公開識別子" "外部ファイルのURI">

PUBLICキーワードを使用した外部実体宣言の構文

&実体名;

実体の参照

<!DOCTYPE EMPLOYEES [
  <!ENTITY DEPT1 SYSTEM "dept1.txt">
]>
<EMPLOYEES>
  <EMPLOYEE empid="A001">
    <Name>Kazuhiko Naito</Name>
    <Dept deptid="d10">&DEPT1;</Dept>
  </EMPLOYEE>
</EMPLOYEES>
リスト2 実体宣言・外部実体参照を行っているXML(EMPLOYEE2.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
IT Education Services Dept.
リスト3 外部実体として参照される外部ファイル(dept1.txt

 このXMLドキュメントをInternet Explorerで表示すると次のようになります。

画面2 外部実体参照により実体が文字列に置き換わった

 外部実体を使用する場合、外部実体となる外部ファイル内の記述と外部参照の使用場所に注意が必要です。

 まず、外部ファイルの文字エンコーディングにUTF-8/16以外を使用している場合、外部サブセットのDTDと同様にテキスト宣言を記述してください(「第5回 valid XMLとDTDの関係」の「DTDの記述場所」を参照)。また、外部ファイルはXML形式である必要はありません。

 次に、外部参照の使用場所についてですが、属性値として外部実体を参照することはできません。例えば、次の例を見てみましょう。

<!DOCTYPE EMPLOYEES [
  <!ENTITY EMP1 SYSTEM "emp1.txt">
]>
<EMPLOYEES>
  <EMPLOYEE empid="&EMP1;">
  </EMPLOYEE>
</EMPLOYEES>
リスト4 実体宣言・内部実体参照を行っているXML(EMPLOYEE3.xml

<?xml version="1.0" encoding="Shift_JIS" ?>
A001
リスト5 外部実体として参照される外部ファイル(emp1.txt

 このXMLドキュメントをInternet Explorerで表示すると次のようになります。

画面3 属性値に外部実体を参照するとエラーになる

 表示されるメッセージからも分かるように、属性値として参照することができません。要素の内容として参照しましょう。


パラメータ実体
 これは、DTDで参照するタイプの実体です。DTD内で繰り返し使用する文字列を置換するのに便利です。

<!ENTITY % 実体名 "文字列">

パラメータ実体宣言の構文

%実体名;

実体の参照

 パラメータ実体の宣言や参照には、“%”を使用します。実体宣言で、“%”と実体名の間には区切り文字(半角スペースやタブ)が必要ですので注意しましょう。

<!ENTITY % string "(#PCDATA)">
<!ELEMENT EMPLOYEES (EMPLOYEE)>
<!ELEMENT EMPLOYEE (Name,Dept)>
<!ELEMENT Name %string;>
<!ELEMENT Dept %string;>
リスト6 パラメータ実体を使用しているDTD

 このDTDでは、(#PCDATA)という文字列に対して、stringという名前を使用しています。

外部解析対象外実体
 これは、テキストファイルでない外部ファイル(イメージファイルなど)を参照する場合に使用します。参照するとはいえ、前述までの実体とは異なり外部ファイルの内容に置換されるわけではありません。あくまでも、非テキストファイルを参照するがXMLパーサでは解析できないことを宣言するものです。

 外部解析対象外宣言の形式は、外部一般実体宣言とよく似ています。宣言の後方に「NDATA 記法名」を追加します。

<!ENTITY 実体名 SYSTEM "外部ファイルのURI" NDATA 記法名>

外部解析対象外実体宣言の構文

 上記の記法名は、記法宣言(後述)で定義した名前です。

 実体の参照方法は、いままでのものとまったく異なります。専用のENTITY型属性を使用し、その属性値で実体名を指定します。

 次のXMLでは、社員の顔写真画像ファイルを外部ファイルとして参照しています。

<!ELEMENT EMPLOYEE (Name,Dept)>
<!ATTLIST EMPLOYEE img ENTITY #IMPLIED>
<!ENTITY img1 SYSTEM "img1.jpg" NDATA 記法名>
リスト7 外部解析対象外実体を使用するDTDの一部

<EMPLOYEE img="img1">
  <Name>Kazuhiko Naito</Name>
  <Dept>IT Education Services Dept.</Dept>
</EMPLOYEE>
リスト8 外部解析対象外実体を参照するXMLの一部

記法宣言

 記法とは、解析対象外とする外部ファイルの形式を宣言するものです。外部解析対象外実体を使用するときに、実体宣言とともに宣言が必要となります。

<!NOTATION 記法名 SYSTEM "記法のURI">

記法宣言の構文

 記法のURIには、外部ファイルを処理するためのプログラムファイル名やアプリケーション名を指定します(だからといって、そのアプリケーションが起動し外部ファイルを開くわけではありません)。

 外部解析対象外実体の宣言と併せて記法宣言を記述している例です。

<!ELEMENT EMPLOYEE (Name,Dept)>
<!ATTLIST EMPLOYEE img ENTITY #IMPLIED>
<!ENTITY img1 SYSTEM "img1.jpg" NDATA JPG>
<!NOTATION JPG SYSTEM "Internet Explorer">
リスト9 解析対象外とする外部ファイルとその記法宣言の記述例

今回の問題の解答

(Q1) 次の宣言で定義される外部実体の参照方法として正しいものをすべて選んでください。

 答えは、(a)と(b)です。

 この問題に関して参考になる解説は、「実体宣言の記述形式」です(外部一般実体、パラメータ実体)。

 問題に使用されているのは、外部一般実体です。実体は、&実体名;と記述することにより参照できます。ただし、外部実体の場合、属性値として参照できないので、(c)は誤りとなります(仮にこの実体が内部一般実体であれば可能)。

(Q2) JPGファイル形式の外部ファイルの外部解析対象外実体としての参照方法として正しいものをすべて選んでください(要素名、属性名については考慮する必要はありません)。

 答えは、(d)です。

 この問題に関して参考になる解説は、「実体宣言の記述形式(外部解析対象外実体)」「記法宣言」です。

 外部解析対象外実体の参照は、属性値で実体名を指定することにより行います。ただし、その属性はENTITY型で宣言されている必要があります。この属性がCDATA型などほかの型で宣言されている場合、その属性値は単なる文字列としてしか扱われません。

 この問題で使用される例では、実体宣言以外には次の宣言が必要となります。

<!ELEMENT IMG (#PCDATA)>
<!ATTLIST IMG src ENTITY #IMPLIED>
<!NOTATION JPG SYSTEM "Internet Explorer">

<!ENTITY imgFile SYSTEM "img.jpg." NDATA JPG>
リスト10 赤字は本来必要となる宣言

次回の予習問題

 次回のためにの予習問題を掲載します。XMLの構造変換を行うためのXSLTの基本構造について解説していく予定です。

予習問題

(Q1) 次のXSLT要素のうちトップレベル要素となれるものをすべて選択してください。

(a) xsl:attribute-set
(b) xsl:param
(c) xsl:template
(d) xsl:copy
(e) xsl:value-of
(f) xsl:apply-templates

(Q2) 次のXSLTスタイルシートが処理されるとき、最初に実行されるテンプレートはどれでしょう。

「XML文書

<xsl:stylesheet
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
 version="1.0" >
<xsl:template match="/">
 <HTML>
    <HEAD></HEAD>
    <BODY>
       <TABLE BORDER="1">
           <TR>
              <TD>社員番号</TD>
              <TD>社員名</TD>
           </TR>
           <xsl:for-each select="/EMPLIST/EMPLOYEE">
           <TR>
             <TD>
               <xsl:value-of select="@id"/>
             </TD>
             <TD>
               <xsl:apply-templates select="NAME"/>
             </TD>
           </TR>
           </xsl:for-each>
       </TABLE>
  </BODY>
 </HTML>
</xsl:template>

<xsl:template match="*">
    <xsl:apply-templates/>
</xsl:template>

<xsl:template match="text()">
    <xsl:value-of select="."/>
</xsl:template>

</xsl:stylesheet>

(a) <xsl:template match="/">のテンプレート
(b) <xsl:template match="*">のテンプレート
(c) <xsl:template match="text()">のテンプレート
(d) 変換を行う際に明示的に指定する

まとめノート:DTDの実体宣言と記法宣言

○今回の試験対策のポイント

  • 実体宣言
    • 実体の種類
    • 実体宣言の記述形式
      • 内部一般実体
      • 外部一般実体
      • パラメータ実体
      • 外部解析対象外実体
  • 記法宣言

○今回の学習内容で出題範囲となる仕様

○今回の学習内容で実機確認を行うときに役立つフリーツール

○今回の学習内容で参考になる@ITの記事

○今回の学習内容で参考になるXML用語集 @IT XML用語事典より)

(10)XSLTの基本構造を理解する

Index
連載:XMLマスターへの道
  (1)XMLマスター:ベーシック試験のレベルは?
  (2)XMLの概要と起源、関連規格
  (3)XML文書の要素、エンコーディング、宣言
  (4)すべてのXM文書は整形式である
  (5)valid XMLとDTDの関係
  (6)模擬問題:XMLの基本
  (7)模擬問題:W3C XML Schema
  (8)模擬問題:DOM
(9)DTDの実体宣言と記法宣言
  (10)XSLTの基本構造を理解する
  (11)XSLTで必須の制御命令を覚える
  (12)XPathによるノードの指定法を理解する
  (13)名前空間を理解しDOMの概要をつかむ
  (14)XML Schemaを利用したスキーマ定義
  (最終回)XML Schema―型の再利用と名前空間


連載:XMLマスターへの道


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間