Jintrick.netagenda2003年04月アーカイブ → 2003年04月20日

正規化、正規化、また正規化

.例えばh2要素の内容をラベルとしてメタデータファイルに保持しておきたいとします。

<h2><abbr title="Document Object Model">DOM</abbr> と XPath</h2>

このようなh2要素の場合、「DOM と Xpath」という文字列をラベルにします。h2要素がコンテクストノードであるなら、string(self::node())がそれを表します。ところが次のようにソース整形のための空白文字(改行含む)が入っていると、その空白文字が含まれた別の値になってしまいます。

<h2>
	<abbr title="Document Object Model">DOM</abbr>
	と XPath
</h2>

normalize-space関数を使って正規化すれば同じ値になります。(normalize-space(string(self::node()))

DOMのnormalizeメソッド

XPathのnormalize-space()関数による正規化の際にはこのような処理が行われるわけですが、DOM1のElementインターフェイス(DOM2では確かNodeインターフェイス)のnormalizeメソッドによる正規化は異なります。「隣接するテキストノードを一つにする」だけで、空白文字については何の処理もしてくれません。DOMで操作した直後のツリー構造と、文書を読み込んだ時のツリー構造が異なってしまうのを防ぐためにあるメソッドです(多分)。

これらをdataとしたテキストノードをある空要素hに連続してappendChildしたとします。この段階では、hをコンテクストノードとしたロケーションパス: child::text()[1]は「No War」で、child::text()[2]が「No peace」になっています。しかしh要素をnormalizeすると、二つの隣接したテキストノードは連結され、child::text()[1]は「No war No peace 」になります。

……と、あまり関係ない話ですが、normalize-space()関数の動作と混同している人を見かけたので一応書いておきました。


webmaster@jintrick.net
公開: 2003年04月20日
カテゴリ: DOM ,XPath