2011-01-27 7 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

그룹화를 수행하려는 것으로 보입니다.

<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 문서 (제공된 비 잘 형성된 조각을 배치)에 대해 수행된다 : 여기서

그룹핑에 대한 Muenchian 방법의 단순한 사용이다

<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 

설명 : 에 대해 읽으십시오.

+0

+1 우수한 코드 해석. –

관련 문제