昨日私はDOM実装の話題について議論に巻き込まれ、Text.splitTextとElement.normaliseの振る舞いに関する興味深い質問が出てきました。 DOM Level 1 CoreでIDを与えるためにDOM splitTextとnormalizeを作成する必要がありますか?
、Text.splitText指定兄弟の両方のツリーに保ち、オフセット2つのテキスト・ノードにこのテキストノード
ブレーク...として定義されます。このノードには、オフセットポイントまでのすべてのコンテンツのみが含まれます。このノードの次の兄弟として挿入される新しいTextノードには、オフセットポイント以降のすべてのコンテンツが含まれます。ノーマライズは
...
は、「通常の」形態のみマークアップ(例えば、タグ、コメント、処理中にこの素子の下のサブツリーの全深さにあるすべてのテキストノードを置きます命令、CDATAセクション、およびエンティティ参照)は、テキストノードを区切ります。つまり、隣接するテキストノードはありません。これは、ドキュメントのDOMビューが保存され再ロードされた場合と同じであることを保証するために使用され、特定のドキュメントツリー構造に依存する操作(XPointerルックアップなど)が使用される場合に便利です。だから、
、私はtextNodeで参照の "Hello World" を含むテキストノードを、取り、
textNode.splitText(3)
textNodeは今コンテンツ "こんにちは"、および "World" を含む新しい兄弟を持っていない場合
私はその後、
textNode.parent.normalize()
textNode何ですか?この仕様では、textNodeが以前の親の子である必要があることを明確にしていません。隣接するすべてのテキストノードを含むように更新されただけです(削除されます)。隣接するすべてのテキストノードを削除し、値の連結を持つ新しいノードを再作成し、textNodeがツリーの一部ではないものを指し示すようにすることは、コンコンロールの動作のようです。あるいは、splitTextと同じ方法でtextNodeを更新することができるので、ツリー位置を保持して新しい値を取得します。
動作の選択は実際にはまったく異なりますが、どちらが正しいのか、これが仕様上の見落としであるかはわかりません(レベル2またはレベル3では明確ではないようです)。そこにDOM/XMLの教祖はいくつかの光を放つことができますか?