2016-09-20 1 views
0

Ich habe die unten XML-StrukturCount Nur Vorstehende Themen: Xpath

<?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> 

Ich benutze `count (Vorfahre :: division [last()]/* [enthält (Name(), 'Thema') ]) um alle * Themen unter body/division zu bekommen.

Mein Bedarf ist, wenn ich meinen Kontext von body/division/division/Atopic verwende Ich wollte nur vorherige Themen unter body/division bekommen. Also in diesem Fall nur

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

und NICHT

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

, da es nach dem Kontextknoten ist.

Pls vorschlagen.

+0

Beitrag XSLT, was Sie bisher versucht haben .... –

+0

Gebrauch '. ./precedes-sibling :: * ' –

+0

Ich benutze Arbortext-Editor und nicht XSLT. –

Antwort

0

Ihr kontext Knoten: //body/division/division/Atopic

Ihre reine 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')]) 
    ] 

Ausführliche Erklärung hier: xpath-select-all-elements-between-two-specific-elements