2011-01-27 3 views
3

Предположим, что у нас есть следующий источник xml.Xslt доступ к предыдущему элементу цикла for-each

<Data Key="SS_001PG" 
     OC:DataId="001PG" 
     OC:UniqueIdentifier="01-003" 
     OC:Status="available" 
     OC:DateOfBirth="2010-06-29" 
     OC:Sex="m"> 
    <Event EventOID="123" 
      OC:EventLocation="we" 
      OC:StartDate="2010-07-12" 
      OC:Status="started" 
      OC:Age="0" 
      EventRepeatKey="1"></Event> 
    <Event EventOID="123" 
      OC:StartDate="2010-07-14" 
      OC:Status="started" 
      OC:Age="0" 
      EventRepeatKey="2"></Event> 
</Data> 
<Data Key="SS_1" 
     OC:DataId="1" 
     OC:UniqueIdentifier="1" 
     OC:Status="available" 
     OC:DateOfBirth="2010-07-14" 
     OC:Sex="m"> 
    <Event EventOID="123" 
      OC:StartDate="2010-07-16" 
      OC:EndDate="2010-07-14" 
      OC:Status="started" 
      OC:Age="-1" 
      EventRepeatKey="1"></Event> 
</Data> 

У нас есть следующий xslt-код для его обработки.

<xsl:variable name="repeatedEvents" select="//Event[@EventOID='123']"/> 
<xsl:for-each select="$repeatedEvents"> 
    <xsl:sort select="@EventRepeatKey" data-type="number"/> 
    <xsl:variable name="prevIndex" select="position()-1"/> 
    <xsl:variable name="prevEvent" 
        select="$repeatedEvents[position()=$prevIndex]"/> 
    <xsl:choose> 
     <xsl:when test="position()=1"> 
      <xsl:value-of select="@EventRepeatKey"/> 
     </xsl:when> 
     <xsl:otherwise> 
      <xsl:if test="$prevEvent/@EventRepeatKey != @EventRepeatKey"> 
       <xsl:value-of select="@EventRepeatKey"/> 
      </xsl:if> 
     </xsl:otherwise> 
    </xsl:choose> 
</xsl:for-each> 

Теперь, как вы можете видеть, мы выбираем все события, имеющие одинаковую EventOID, а затем отсортировать элементы, используя EventRepeatkey. Итак, после сортировки Событие под вторым Данным происходит между событиями первых Данных. Внутри цикла, в то время как второй элемент обрабатывается, мы можем получить доступ к первому элементу с использованием предыдущего индекса, но когда третий элемент обрабатывается, мы не можем получить доступ ко второму элементу, используя предыдущий индекс. Это потому, что второй элемент находится в нижнем положении дерева, чем третий элемент? Любое предложение, как мы могли бы решить проблему?

Может кто-нибудь помочь?

+0

В чем проблема? Просьба привести простейший возможный пример. –

+0

Хороший вопрос, +1. См. Мой ответ за очень короткое и эффективное, полное решение проблемы, которую вы на самом деле пытаетесь решить. :) –

ответ

3

Кажется, что вы хотите выполнить группировку.

Вот простое использование Muenchian метода для группировки:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output method="text"/> 
<xsl:strip-space elements="*"/> 

<xsl:key name="kEvByRepK" match="Event[@EventOID='123']" 
      use="@EventRepeatKey"/> 

<xsl:template match= 
    "Event[@EventOID='123' 
      and 
      generate-id() 
      = 
       generate-id(key('kEvByRepK', @EventRepeatKey)[1]) 
      ]"> 
    <xsl:value-of select="@EventRepeatKey"/> 
    <xsl:text>&#xA;</xsl:text> 
</xsl:template> 
</xsl:stylesheet> 

, когда выполняется это преобразование на следующем документе XML (оберточной предоставленный не-хорошо сформированную фрагмент):

<t xmlns:OC="my:OC" > 
    <Data Key="SS_001PG" OC:DataId="001PG" OC:UniqueIdentifier="01-003" 
OC:Status="available" OC:DateOfBirth="2010-06-29" OC:Sex="m"> 
     <Event EventOID="123" OC:EventLocation="we" OC:StartDate="2010-07-12" 
OC:Status="started" OC:Age="0" EventRepeatKey="1"/> 
     <Event EventOID="123" OC:StartDate="2010-07-14" OC:Status="started" 
OC:Age="0" 
     EventRepeatKey="2"/> 
    </Data> 
    <Data Key="SS_1" OC:DataId="1" OC:UniqueIdentifier="1" OC:Status="available" 
OC:DateOfBirth="2010-07-14" OC:Sex="m"> 
     <Event EventOID="123" OC:StartDate="2010-07-16" OC:EndDate="2010-07-14" 
OC:Status="started" OC:Age="-1" EventRepeatKey="1"/> 
    </Data> 
</t> 

разыскиваемый, правильный результат получается:

1 
2 

Объяснение: Читайте о the Muenchian method for grouping.

+0

+1 Отличная интерпретация кода. –

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