Выбор первого и второго узла в XSLT - PullRequest
0 голосов
/ 20 марта 2011

Учитывая следующую структуру, как скопировать первый и второй узлы со всеми их элементами из документа на основе предиката в XSLT:

<list>
  <slot>xx</slot>
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data>      
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
</list> 
<list>
  <slot>xx</slot>
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
   <data>
       <name>xxx</name>
       <age>xxx</age>  
   </data> 
</list> 

Как выбрать первое и второе вхождение данных (без самого элемента данных, только имя, возраст) из списка, где интервал равен другой переменной, т.е. первый список имеет slot=02, но мне нужны данные из второго списка, где slot=01. Но на самом деле не имеет значения порядок списка по слоту, пока slot=$slotvariable.

Я попробовал следующее утверждение, но оно не дало никаких результатов:

<xsl:element name="{'Lastdata'}">
  <xsl:copy-of select="list/data[position()=1 and slot = $slotvariable]" />
</xsl:element>
<xsl:element name="{'prevdata'}">
  <xsl:copy-of select="list/data[position()=2 and slot = $slotvariable]" />
</xsl:element>

Будем благодарны за любые рабочие предложения

Ответы [ 2 ]

5 голосов
/ 20 марта 2011

Если я правильно понял ваш вопрос, то:

<Lastdata>
  <xsl:copy-of select="list[slot=$slotvariable]/data[1]/*" />
</Lastdata>
<prevdata>
  <xsl:copy-of select="list[slot=$slotvariable]/data[2]/*" />
<prevdata>

Подсказки:

  • Не используйте <xsl:element>, если у вас нет динамического имени, основанного на выражении.
  • [1] является сокращением для [position() = 1]
0 голосов
/ 20 марта 2011

Следующая таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:variable name="slot" select="'slot1'"/>
    <xsl:template match="/lists/list">
        <xsl:copy-of select="data[../slot=$slot][position()&lt;3]/*"/>
    </xsl:template>
</xsl:stylesheet>

Применительно к этому источнику:

<lists>
    <list>
      <slot>slot1</slot>
       <data>
           <name>George</name>
           <age>7</age>  
       </data> 
       <data>
           <name>Bob</name>
           <age>22</age>  
       </data> 
       <data>
           <name>James</name>
           <age>77</age>  
       </data> 
    </list> 
    <list>
      <slot>slot2</slot>
       <data>
           <name>Wendy</name>
           <age>25</age>  
       </data> 
    </list> 
</lists>

Дает следующий результат:

<name>George</name>
<age>7</age>
<name>Bob</name>
<age>22</age>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...