假设我们有以下源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对元素进行排序。因此,在排序之后,第二个数据下的事件进入第一个数据的事件之间。在循环内部,在处理第二个元素时,我们可以使用先前的索引访问第一个元素,但是当处理第三个元素时,我们无法使用前一个索引访问第二个元素。这是因为第二个元素在树中位于比第三个元素更低的位置?有什么建议我们如何解决这个问题?
有人可以帮忙吗?
答案 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>
</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