7

XPather でさまざまな XPath クエリを試してみました (古いバージョンの Firefox でのみ動作します)。次のクエリの結果の違いに気付きました。

これはいくつかの結果を示しています

//div[descendant::table/descendant::td[4]] 

これは空のリストをリストします

//div[//table//td[4]]

それらはいくつかのルールのために異なるのでしょうか、それとも XPath インタープリターの特定の実装の誤動作ですか? (FF エンジンから使用されているようです。XPather はクエリ用の優れたシンプルな GUI です)

4

2 に答える 2

10

XPath 1.0//では の省略形で/descendant-or-self::node()/あるため、最初のパスは です/descendant-or-self::node()/div[descendant::table/descendant::td[4]]が、2 番目のパスは とはかなり異なり/descendant-or-self::node()/div[/descendant-or-self::node()/table/descendant-or-self::node()/td[4]]ます。したがって、主な違いは、最初の述語内ではdiv要素に相対的な子孫を調べ、2 番目の述語ではルート ノード/(ドキュメント ノードとも呼ばれます) からの子孫を調べることです。//div[.//table//td[4]]2 番目のパス式を最初の式に近づけたい場合があります。

[編集] ここにサンプルがあります:

<html>
  <body>
    <div>
      <table>
        <tbody>
          <tr>
            <td>1</td>
          </tr>
          <tr>
            <td>2</td>
          </tr>
          <tr>
            <td>3</td>
          </tr>
          <tr>
            <td>4</td>
          </tr>
        </tbody>
      </table>
    </div>
  </body>
</html>

そのサンプルでは、​​4 番目の子孫を持つ子があるため、パスは要素を//div[descendant::table/descendant::td[4]]選択します。divtabletd

しかし、どれが for の略//div[.//table//td[4]]かを探しても、4 番目の子要素を持つ要素はありません。//div[./descendant-or-self::node()/table/descendant-or-self::node()/td[4]]//div[./descendant-or-self::node()/table/descendant-or-self::node()/child::td[4]]td

これで違いが説明できることを願っています。使用する//div[.//table/descendant::td[4]]と、元のフォームと同じ結果が得られるはずです。

于 2012-04-07T11:15:48.767 に答える