XHTML 2.0 の私案…見出しとセクション

現行の仕様

XHTML 2.0 の仕様

新しい XHTML の仕様では、セクション明示の手段として section 要素が、見出しの要素として h 要素が、それぞれ提案されています。 ただし、個人的には、この方法にはいささか不具合を感じます。

ISO-HTML の仕様を採り入れる

個人的には、セクションと見出しの明示には、 ISO-HTML の仕様を採り入れるのが最も自然かと考えられます。 見出しを含めたセクション s1, s2, …各要素でも、 見出しを除いた本文セクション div1, div2, …各要素、いずれでも構いません。

方法… sn 要素を用いる方法

XHTML 2.0 と類似した方法です。

DTD を用いた表記

%block は、見出しやセクション各要素を除いた一般的なブロック要素を示すとします。

<!ELEMENT body ((%block;)*,s1,(%block;)*) >
<!ELEMENT s1 (h1,(%block;|s2)*) >
....

RELAX-NG を用いた表記

<element name="body">
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
 <ref name="s1.qname"/>
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
</element>

<define name="s1.qname">
<element name="s1">
 <ref name="h1.qname"/>
 <zeroOrMore>
  <choice>
   <ref name="block.elements"/>
   <ref name="s2.qname"/>
  </choice>
 </zeroOrMore>
</element>
</define>

....

方法… divn 要素を用いる方法

ISO-HTML の「Pre-HTML」で用いられた方法を、ほぼそのまま採用すれば良いと考えられます。

DTD を用いた表記

%block は、見出しやセクション各要素を除いた一般的なブロック要素を示すとします。

<!ELEMENT body ((%block;)*,h1,div1,(%block;)*) >
<!ELEMENT div1 ((%block;)*,(h2,div2)*,(%block;)*) >
....

RELAX-NG を用いた表記

<element name="body">
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
 <ref name="h1.qname"/>
 <ref name="div1.qname"/>
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
</element>

<define name="div1.qname">
<element name="div1">
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
 <zeroOrMore>
  <ref name="h2.qname"/>
  <ref name="div2.qname"/>
 </zeroOrMore>
 <zeroOrMore>
  <ref name="block.elements"/>
 </zeroOrMore>
</element>
</define>

....

利点

「セクションの明示」の重要性

シンプルで、かつ人間が見て分かりやすいソースを記述するためならば、セクションの明示は「全くしない」方が良いと考えられます。また、見出しを正しく使っていさえすれば、それだけで既に「セクションの明示」になり得ます。見出し階層から実際のセクションを類推することは、機械的に困難では無いと考えられます。

ただ、現行の XML や DOM をはじめとした XML 各種仕様が「データベースを前提とした」作りになっている以上、何らかのセクション要素でセクションの明示をするのはやむを得ない処置であると思います。実際、セクションの明示が無い XHTML 文書の中から、 DOM を用いてセクションの内容を抽出するのは、それほど容易なことではありません。

だからこそ、メンテナンス性を向上させる上でも「人間が見ても分かる」セクションの明示方法を摸索する必要があるのでは、と考えるわけです。