[ ]
//よりも優先度が高くなります(「//」は実際には省略形であり、演算子ではありません)。XPath 1.0仕様によると、これはそうです。
"//は/descendant-or-self:: node()/の略です。"
以降:
「注:ロケーションパスはロケーションパス//para[1]
と同じ意味ではありません/descendant::para[1]
。後者は最初の子孫パラ要素を選択します。前者は親の最初のパラ子であるすべての子孫パラ要素を選択します。」
したがって、XPath式は次のようになります。
//element[@name='same'][2]
意味:
「element」という名前のドキュメント内の任意の要素を選択します。属性は「name」で、値は「same」です。この要素は、その親の2番目の子です。
あなたが欲しいのは:
(//element[@name='same'])[2]
[]の高い優先順位を上書きする角かっこに注意してください。
同様に、そのような最後の1つのノードは、次のXPath式によって選択されます。
(//element[@name='same'])[last()-1]
最後に、必要な警告: "//"の省略形を使用すると、(サブ)ツリー全体がトラバースされるため、非常にコストがかかります。ドキュメントの構造がわかっている場合は常に、より具体的な構成(ロケーションパス)を使用することをお勧めします。