2016-09-20 2 views
0

У меня есть ниже структура XMLграф только Предшествующие тема: 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> 

Я использую `подсчет (предок :: деление [последний()]/* [содержит (название(), 'темы') ]), чтобы получить все * темы под элементом body/division.

Мне нужна, если я использую свой контекст из body/division/division/Atopic Я хотел получить только предшествующие темы под телом/делением. Так что в этом случае только

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

и НЕ

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

, поскольку она является после узла контекста.

Pls предложить.

+0

Сообщение XSLT, что вы пробовали до сих пор .... –

+0

использование '. ./preceding-sibling :: * ' –

+0

Я использую редактор Arbortext, а не XSLT. –

ответ

0

Ваш контекст узла: //body/division/division/Atopic

Ваш чистый XPath выражение:

//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')]) 
    ] 

Подробное описание здесь: xpath-select-all-elements-between-two-specific-elements

Смежные вопросы