.例えば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()))
)
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()
関数の動作と混同している人を見かけたので一応書いておきました。