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]]
選択します。div
table
td
しかし、どれが 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]]
と、元のフォームと同じ結果が得られるはずです。