混合内容を必要とする文化圏も1つではありませんが、テキスト文書やワープロ文書の延長としてXML文書を扱いたい立場から言うと、混合内容を「テキストノードと要素ノード(その他の有象無象は無視)が混じって並んだもの」と見るのもうまくないのです。
混合内容文化圏(のひとつ)においても、テキストノードという概念は実は歓迎されません。なぜならDOMのテキストノードは:
- 長さ0の文字列をデータとするテキストノードは、あってもなくても同じ
- 2つのテキストノードが隣接するなら、それらの文字列データを連接したデータを持つ1つのテキストノードと同じ
といった“構造の不定性”を持ちます。この不定性はうれしくありません。
そもそも伝統的な文書では、テキストノードを基本単位にするのがふさわしくないのです。文書の処理単位は“文字”です。だから混合内容は、テキストエディタのテキストバッファのように、文字を詰め込む容器と考えるべきです。文字列のところどころに要素が混じり込んでいるのです。
概念的には:
ということです。
mixed-content ::= (character | element)*
例えば、
におけるpの内容は、次のようなバッファだと考えられます(番号は1からはじめる)。
<p>これ<br/>とても<em>重要</em>。</p>
[1] 'こ'
[2] 'れ'
[3] <br/>
[4] 'と
[5] 'て'
[6] 'も'
[7] <em>重要</em>
[8] '。'
このバッファに対してinsertBefore(3, 'は') すれば、「これは…」となるし、remove(3) すれば改行が消えます。カーソル移動は、forward, backward 以外に、要素へのenter-intoとか要素からのleave-fromが必要になります。
(続く)