2015-06-11 1 views
-1
<text> 
    <pb n="I"/> 
    <p> 
     <lb/>Lorem ipsum 
     <lb/>Lorem ipsum 
     <lb/>Lorem ipsum 
     <pb n="II"/> 
     <lb/>Lorem gipsum 
     <lb/>Lorem gipsum 
    </p> 
    <p> 
     <lb/>Lorem gipsum 
     <lb/>Lorem gipsum 
     <pb n="III"/> 
     <lb/>Lorem hipsum 
     <lb/>Lorem hipsum 
     <lb/>Lorem hipsum 
     <lb/>Lorem hipsum 
    </p> 
    <pb n="IV"/> 
    <p> 
     <lb/>Lorem dipsum 
    </p> 
</text> 

От такого документа, я пытаюсь получитьПолучить текст между двумя самозакрывающимися элементами и числом следующим/предыдущим элементом

  1. всего текста и элементы между два пбом элементами, когда @n первых пба даются,
  2. и @n из следующих параметров и предыдущего Pb/@ п, когда указано @n из pb.

Может кто-нибудь помочь? Я использую XSLT 2.0 с SaxonCE.

РЕДАКТОРА: @ 2. сразу после и непосредственно предшествующий.

+1

Не могли бы вы дать явный результат? Это поможет вам правильно ответить. –

ответ

1

XPath 2.0 имеет операторы << и >> так что ваш первый вопрос будет переводить в //node()[. >> $pb1 and . << $pb2] (в XSLT коде вам нужно бежать <<, как &lt;&lt;, например //node()[. >> $pb1 and . &lt;&lt; $pb2]). Выбор элемента pb по его атрибуту @n должен быть очевиден: <xsl:variable name="pb1" select="//pb[@n = 'foo']"/>. Определение ключа <xsl:key name="by-n" match="pb" use="@n"/> с <xsl:variable name="pb1" select="key('by-n', 'foo')"/> может быть более эффективным.

Ваш второй вопрос может быть переведен непосредственно на использование оси: $pb1/(preceding::pb | following::pb)/@n. Однако я не уверен, хотите ли вы найти все предыдущие и последующие pb или только непосредственно предшествующие соответственно следующие.