Предположим, что у нас есть следующий источник 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. Итак, после сортировки Событие под вторым Данным происходит между событиями первых Данных. Внутри цикла, в то время как второй элемент обрабатывается, мы можем получить доступ к первому элементу с использованием предыдущего индекса, но когда третий элемент обрабатывается, мы не можем получить доступ ко второму элементу, используя предыдущий индекс. Это потому, что второй элемент находится в нижнем положении дерева, чем третий элемент? Любое предложение, как мы могли бы решить проблему?
Может кто-нибудь помочь?
В чем проблема? Просьба привести простейший возможный пример. –
Хороший вопрос, +1. См. Мой ответ за очень короткое и эффективное, полное решение проблемы, которую вы на самом деле пытаетесь решить. :) –