Предположим, у нас есть следующий источник xml.
<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.Таким образом, после сортировки событие под вторыми данными попадает между событиями первых данных.Внутри цикла, пока второй элемент обрабатывается, мы можем получить доступ к первому элементу, используя предыдущий индекс, но когда третий элемент обрабатывается, мы не можем получить доступ ко второму элементу, используя предыдущий индекс.Это потому, что второй элемент находится в дереве ниже, чем третий элемент?Любое предложение, как мы могли бы решить эту проблему?
Может кто-нибудь помочь?