抽出操作
Eが抽出式のとき、extract(a, E) は次のように評価される。
- aとEから決まる検索範囲のノードセット(XPathで言う軸)をSとする。Sが空のときもある。
- Eから決まるパターンをPとする。
概念的には(実装とは違う)、検索範囲Sをスキャンして配列として結果を得て、その配列の特定項目またはスライスを最終結果とする。よって、全配列を求めるアルゴリズムを示す。
- 結果配列rを r = [] と初期化する。
- 検索範囲Sが空のときは[]を結果として終わり。
- x(カレントノード)を検索範囲Sの最初のノードとする。
- eval(x, P) を評価する。
- 値がundefined(つまりパターンマッチングが失敗)のときは、次のノードに移り、新しいノードをx(カレントノード)とする。
- 値がundefined以外(つまりパターンマッチングが成功)のときは、得られた値をrにアペンドして、成功時の次のノードに移り、新しいノードをxとする。
- 次のノードがなくなったら、その時点のrを結果とする。
失敗時の「次のノード」と成功時の「次のノード」は違うかもしれない。その点は「ツリーの水平順序とパターンの侵入性 - 檜山正幸のキマイラ飼育記 メモ編」を参照。
eval(x, P) では、パターンマッチが成功したなら、パターンの内容を新しい評価環境で評価する。内容の評価で再びextractが使われるので、evalとextractは相互再帰的に呼び出し合う。