Reputation: 29
Suppose I have this:
<el class="classname">
...
<el class="classname">
</el>
...
</el>
<el class="classname">
...
<el class="classname">
...
<el class="classname">
</el>
...
</el>
...
</el>
Can I get only the two top-level (without the nested ones), provided this XPath should be relative (i.e. if I matched one of these beforehand I can add the same XPath and it will still work
Upvotes: 2
Views: 442
Reputation: 4834
Lets say your xml looks like this:
<root>
<div>
<div>
<el class="classname" id="a1">
<div>
<el class="classname" id="a2">
<div>
<el class="classname" id="a3">
<div>
<el class="classname" id="a4"/>
</div>
</el>
</div>
</el>
<el class="classname" id="a5">
<div>
<el class="classname" id="a6">
<div>
<el class="classname" id="a7"/>
</div>
</el>
</div>
</el>
</div>
</el>
</div>
</div>
<el class="classname" id="a8">
<div>
<el class="classname" id="a9">
<div>
<el class="classname" id="a10">
<div>
<el class="classname" id="a11"/>
</div>
</el>
</div>
</el>
</div>
</el>
</root>
you can use the count on ancestor's to get the correct level. For the first level use XPath:
//el[@class='classname'][count(ancestor::el[@class='classname'])=0]
will only select el-elements with @id="a1"
and @id="a8"
For the second level use this XPath:
//el[@class='classname'][count(ancestor::el[@class='classname'])=1]
This will select the @id="a2"
, @id="a5"
and @id="a9"
For the third level use :
//el[@class='classname'][count(ancestor::el[@class='classname'])=2]
This will select the @id="a3"
, @id="a6"
and @id="a10"
Upvotes: 4