2011-01-27 31 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を使用して要素を並べ替えます。したがって、ソート後、2番目のデータの下のイベントは、最初のデータのイベントの間に入ります。ループの内部では、2番目の要素が処理されている間、前のインデックスを使用して最初の要素にアクセスできますが、3番目の要素が処理されているときは、前のインデックスを使用して2番目の要素にアクセスできません。これは、2番目の要素が3番目の要素よりもツリーの下位にあるためですか?どのように私たちは問題を解決できるか提案?

誰かが助けることができますか?

+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 

説明:およそthe Muenchian method for groupingをお読みください。

+0

+1優秀なコードの解釈。 –

関連する問題