0

I have the below XML structure

<?xml version="1.0" encoding="UTF-8"?>
    <body>
       <division>
          <Atopic><longtitle>TitleDiv1 Atopic</longtitle></Atopic>
          <Btopic><longtitle>TitleDiv1 Btopic</longtitle></Btopic>
          <Ctopic><longtitle>TitleDiv1 Ctopic</longtitle></Ctopic>
          <division>
             <Atopic><longtitle>TitleDiv1.1 Atopic</longtitle></Atopic>
          </division>
         <Dtopic><longtitle>TitleDiv2 Dtopic</longtitle></Dtopic>
         <Etopic><longtitle>TitleDiv2 Etopic</longtitle></Etopic>
       </division>
    </body> 

I am using `count(ancestor::division[last()]/*[contains(name(), 'topic')]) to get all * topics under body/division element.

My need is if I use my context from body/division/division/Atopic I wanted to get only preceding topics under body/division . So in that case only

<Atopic><longtitle>TitleDiv1 Atopic</longtitle></Atopic>
<Btopic><longtitle>TitleDiv1 Btopic</longtitle></Btopic>
<Ctopic><longtitle>TitleDiv1 Ctopic</longtitle></Ctopic>

and NOT

 <Dtopic><longtitle>TitleDiv2 Dtopic</longtitle></Dtopic>
 <Etopic><longtitle>TitleDiv2 Etopic</longtitle></Etopic>

since it is after the context node.

Pls suggest.

1 Answers1

0

Your context-node: //body/division/division/Atopic

Your pure XPath Expression:

//body/division/division/Atopic
 /ancestor::division[last()]
  /*[contains(name(), 'topic')]
     [
      count(.| //body/division/division/Atopic/ancestor::division[1]/preceding-sibling::*[contains(name(), 'topic')])
      =
      count(//body/division/division/Atopic/ancestor::division[1]/preceding-sibling::*[contains(name(), 'topic')])
     ]

Detailed explanation here: xpath-select-all-elements-between-two-specific-elements

Community
  • 1
  • 1
uL1
  • 2,117
  • 2
  • 17
  • 28