次のようなマークアップがあります:
<div class="foo">
<div><span class="a1"></span><a href="...">...</a></div>
<div><span class="a2"></span><a href="...">...</a></div>
<div><span class="a1"></span>some text</div>
<div><span class="a3"></span>some text</div>
</div>
私はすべてを手に入れることに興味があり<a>
、some text
のみspan
隣接がクラス の場合a1
。したがって、コード全体の最後では、結果は<a>
1 番目div
と3 番目からになるはずです。と が内部にあるか、属性があるsome text
場合は簡単ですが、運が悪かったです。<a>
some text
span
div
class
span
私が今やっていることは、クラスで検索することですa1
:
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]
次に、その親を取得し、query()
その親をコンテキスト ノードとして別の操作を実行します。これは、効率的とは程遠いように見えるため、私の目標を達成するためのより良い方法はあるかどうかが明らかに疑問です。
回答補足
@MarcBによると受け入れられた回答使用する適切なクエリは次のとおりです。
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/..
ただし、<a>
次の方法を使用する方が良いかもしれません。
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/../a
<a>
コンテナの代わりにを取得します。
ベストアンサー1
xpathクエリの優れた点は、基本的にファイルシステムのパスのように扱うことができることです。
//div[contains(@class,'foo')]/div/span[contains(@class,'a1')]/..
^^
.foo ノードの下にあるすべての .a1 ノードを検索し、1 レベル上の a1 ノードの親に移動します。