Xslt访问for-each循环的前一个元素

时间:2011-01-27 15:36:02

标签: xslt

假设我们有以下源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 个答案:

答案 0 :(得分:3)

您似乎想要进行分组。

以下是Muenchian方法的简单分组

<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

说明:了解 the Muenchian method for grouping