Xslt доступ к предыдущему элементу цикла for-each - PullRequest
3 голосов
/ 27 января 2011

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

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

1 Ответ

3 голосов
/ 27 января 2011

Похоже, что вы хотите выполнить группировку.

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

<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

Объяснение: Читайте о мюнхенском методе группировки .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...