tisen
tisen

Reputation: 29

XPath do not select nested matches

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

Answers (1)

Siebe Jongebloed
Siebe Jongebloed

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

Related Questions