質問: 規模の大きなXML文書(データ)を処理するXSLTスタイルシートにおいて、XPathに`//`を使用するのは避けた方が良いというアドバイスをいただいたことがあります.例えば概要の構造で次のようになるXMLファイルに対して`//para[exists(b)]`とするなど. ``` これはあくまで構造を示すサンプルです. これはあくまで構造を示すサンプルです. ~ ~ ~ ``` これは`/doc/part/chapter/section/p[exists(b)]`とすべきとのことです. `//`を使用すべきでないとはどのような理由に依るものでしょうか?
回答: 自己RESです.別の質問を書いていてわかったように思います. 簡略記法の`//para[exists(b)]`は、正確に書けば`(fn:root(self::node()) treat as document-node())/descendant-or-self::node()/para[exists(b)]`となります. 3.2 Path Expressions > > A "//" at the beginning of a path expression is an abbreviation for the initial steps (fn:root(self::node()) treat as document-node())/descendant-or-self::node()/ (however, "//" by itself is not a valid path expression [err:XPST0003].) The effect of these initial steps is to establish an initial node sequence that contains the root of the tree in which the context node is found, plus all nodes descended from this root. > > > つまり、コンテキストがなんであれ 1. ドキュメントノードにさかのぼり 2. ドキュメントノードを含むすべての子孫ノードをセレクトし 3. それの子のp(子にbを持つ)を選択する ことになります.つまり2.で入力ドキュメントのすべてのノード(テキストノードであれ、コメントノードであれなんでも!)をなめることになります.これは全文書の読み込みを意味するでしょう.時間がかかってもいたしかたありません. これに対して`/doc/part/chapter/section/p[exists(b)]`とすれば、要素をたどってゆくので、そのような全ノードの読み込みという事態は避けることができます. 今まで気軽に`//`を使ってきましたが、あまり使うべきではないという意味がやっとわかりました.