この人気のあるStackOverflowの質問は、CSSセレクターが右から左に解析される理由を説明しています。 XPathクエリは同じ方法で評価されますか?これが実装に依存している場合は、libxml2がどのように実行するかを知っていただければ幸いです。
3 に答える
右から左へのパス式を評価することは無意味でほとんど不可能です:
/name1/name2/name3/name4
定義上、これは、という名前の最上位要素の子である任意の要素の子である任意の要素の子であるすべてのname4
要素を選択します。name3
name2
name1
このチェーン内のすべてのステートメントは、次のステートメントが真であることに依存しています。したがって、必然的に、評価はから/name1
へ/name1/name2
、/name1/name2/name3
そして最後にへと進む必要があります。/name1/name2/name3/name4
これは、 W3CXPath1.0仕様で明示的に指定されています。
相対ロケーションパスは、/で区切られた1つ以上のロケーションステップのシーケンスで構成されます。相対ロケーションパスのステップは、左から右に一緒に構成されます。各ステップは、コンテキストノードに関連するノードのセットを順番に選択します。ステップの最初のシーケンスは、次のステップと一緒に構成されます。ステップの最初のシーケンスは、コンテキストノードに関連するノードのセットを選択します。 そのセット内の各ノードは、次のステップのコンテキストノードとして使用されます。そのステップで識別されたノードのセットは、一緒に結合されます。ステップの構成によって識別されるノードのセットは、この結合です。たとえば、コンテキストノードの要素の子 の要素の子を
child::div/child::para
選択します。つまり、para
div
para
親grandchildren
を持つ要素。div
あなたはあなたが参照するその質問のために受け入れられた答えでもう一度注意深く読むべきです。
CSSセレクターは、ブラウザーに単一の要素があり、CSSスタイルシートのどのセレクターがそれに適用されるかを決定しようとする特定のシナリオの実装の詳細として右から左に評価されます。この場合、ブラウザが右から左に評価する理由は、候補セレクターをより迅速に削除できるためです。
CSSセレクターに固有の、右から左または左から右への評価を要求するものはありません。実際、答えが示すように、jQueryまたははquerySelectorAll
左から右に評価します。
言い換えると:
- 要素が1つあり、セレクターがそれに一致するかどうかをテストする場合、通常、最適化として右から左に評価する方が高速です。
- ただし、一致するすべての要素が必要な場合は、通常、左から右に評価する方が高速です。
シナリオ1は、スタイル設定する要素(CSS)またはXSLスタイルシートtemplate match="??"
(XPath)があり、テストするセレクターまたはXPathが多数ある場合に最適です。querySelectorAll
シナリオ2は、単一のセレクターまたはXPathがあり、DOMを使用または照会する場合のように、一致するすべての要素が必要な場合に最適です。
XPath式はCSSセレクターよりもはるかに複雑になる可能性があるため、右から左への短絡評価が不可能または簡単ではないXPathが存在する可能性がありますが、概念的にはXSLTエンジンは確かにそれを試みることができます。あるかどうかはわかりません。
理解しておくべき最も重要なことは、CSSセレクターまたはXPathが評価される場合でも、ドキュメントツリー全体で左から右に評価された場合と同じ答えを返す必要があるということです。したがって、左から右に評価する必要はありませんが、仕様でこのように定義されているため、評価したかのように行動する必要があります。
XSLTがmatch="a / b / c"の形式のパターンを使用する場合、特定のノードがパターンに一致するかどうかをテストすることに関心があります。これを行う最も簡単な方法は、右から左です。ただし、XPathがselect = "a / b / c"の形式の式を使用する場合、一致するすべてのノードを見つけることに関心があります。これを行う最も簡単な方法は、左から右です。ただし、プロセッサは(どちらの場合も)そのように動作する義務はなく、特定のプロセッサが式を他の形式に最適化する場合もあります。たとえば、XPath式// a // bが与えられた場合、プロセッサはこれを同等の// b [ancestor :: a]として書き直す可能性があります。これは、事実上、右から左への評価です。