

規模の大きなXML文書（データ）を処理するXSLTスタイルシートにおいて、XPathに`//`を使用するのは避けた方が良いというアドバイスをいただいたことがあります．例えば概要の構造で次のようになるXMLファイルに対して`//para[exists(b)]`とするなど．

[code]

    <?xml version="1.0" encoding="UTF-8"?>
    <doc>
        <!--実際には下記の構造が繰り返される-->
        <part>
            <chapter>
                <section>
                    <p>これは<b>あくまで</b>構造を示す<u>サンプル</u>です．</p>
                    <p>これは<i>あくまで</i>構造を示す<u>サンプル</u>です．</p>
                    <p>～</p>
                    <p>～</p>
                    <p>～</p>
                </section>
            </chapter>
        </part>
    </doc>
    
[/code]

これは`/doc/part/chapter/section/p[exists(b)]`とすべきとのことです．

`//`を使用すべきでないとはどのような理由に依るものでしょうか？


CC BY-SA 3.0
2017-12-20T04:12:29.120
40408
2017-12-21T12:38:12.790
2017-12-20T05:00:47.520
9503
9503
question
xml xpath xsl xslt
XPathで//の記述を避ける意味


自己RESです．別の質問を書いていてわかったように思います．

簡略記法の`//para[exists(b)]`は、正確に書けば`(fn:root(self::node()) treat as document-
node())/descendant-or-self::node()/para[exists(b)]`となります．

[3.2 Path Expressions](https://www.w3.org/TR/xpath20/#doc-xpath-PathExpr)

> 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)]`とすれば、要素をたどってゆくので、そのような全ノードの読み込みという事態は避けることができます．

今まで気軽に`//`を使ってきましたが、あまり使うべきではないという意味がやっとわかりました．


CC BY-SA 3.0
2017-12-21T12:38:12.790
40449
2017-12-21T12:38:12.790
9503
40408
answer