XSLT1.0 でこれを行うには、Muenchian Grouping を使用します。あなたの場合、最初の先行する大小の要素の組み合わせによって時間要素をグループ化しています。これは、次のキーを定義することから始めることを意味します
<xsl:key
name="pairs"
match="Time"
use="concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1])" />
次に、特定のキーのグループで最初に表示されるTime要素が必要になります。これは次のように行います。
<xsl:apply-templates
select="element/Time[
generate-id()
= generate-id(
key(
'pairs',
concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1])
)[1])]" />
次に、たとえば、グループ内のすべての要素の値であるsmallnum値を取得するには、単純にこれを実行します。ここで、 $keyは次のように定義されます。concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1])
<xsl:value-of select="count(key('pairs', $key))" />
totsmalltime要素には、count の代わりに sum を使用します。
ここに完全な XSLT があります
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:key name="pairs" match="Time" use="concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1])"/>
<xsl:template match="/root">
<root>
<xsl:apply-templates select="element/Time[generate-id() = generate-id(key('pairs', concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1]))[1])]"/>
</root>
</xsl:template>
<xsl:template match="Time">
<xsl:variable name="small" select="preceding-sibling::small[1]"/>
<xsl:variable name="Large" select="preceding-sibling::Large[1]"/>
<xsl:variable name="key" select="concat($Large, '|', $small)"/>
<element>
<xsl:copy-of select="$small"/>
<xsl:copy-of select="$Large"/>
<smallnum>
<xsl:value-of select="count(key('pairs', $key))"/>
</smallnum>
<totsmalltime>
<xsl:value-of select="sum(key('pairs', $key))"/>
</totsmalltime>
</element>
</xsl:template>
</xsl:stylesheet>
XML に適用すると、以下が出力されます。
<root>
<element>
<small>a</small>
<Large>B</Large>
<smallnum>2</smallnum>
<totsmalltime>623</totsmalltime>
</element>
<element>
<small>b</small>
<Large>A</Large>
<smallnum>2</smallnum>
<totsmalltime>575</totsmalltime>
</element>
<element>
<small>c</small>
<Large>B</Large>
<smallnum>1</smallnum>
<totsmalltime>325</totsmalltime>
</element>
</root>
編集: XSLT2.0 では、カウントと合計を行うときにcurrent-group()と共にxsl:for-each-group要素を使用できます。
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/root">
<root>
<xsl:for-each-group select="element/Time" group-by="concat(preceding-sibling::Large[1], '|', preceding-sibling::small[1])">
<element>
<xsl:copy-of select="preceding-sibling::small[1]"/>
<xsl:copy-of select="preceding-sibling::Large[1]"/>
<smallnum>
<xsl:value-of select="count(current-group())"/>
</smallnum>
<totsmalltime>
<xsl:value-of select="sum(current-group())"/>
</totsmalltime>
</element>
</xsl:for-each-group>
</root>
</xsl:template>
</xsl:stylesheet>
これも同じ XML を出力するはずです。