Это преобразование :
<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="kAccByDept" match="accident" use="dep"/>
<xsl:template match=
"accident
[generate-id()
=
generate-id(key('kAccByDept', dep)[1])
]">
<xsl:if test="position() > 1"> ; </xsl:if>
<xsl:value-of select=
"concat('dep ', dep, ' : ',
count(key('kAccByDept', dep)), ' accidents')
"/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
при применении к предоставленному XML-документу :
<accidents>
<accident>
<org>1</org>
<com>194</com>
<dep>010</dep>
<grav>0.64</grav>
</accident>
<accident>
<org>1</org>
<com>194</com>
<dep>420</dep>
<grav>0.54</grav>
</accident>
<accident>
<org>1</org>
<com>44</com>
<dep>010</dep>
<grav>0.4</grav>
</accident>
</accidents>
создает искомое, правильный результат :
dep 010 : 2 accidents ; dep 420 : 1 accidents
Объяснение :
мюнхенский метод группировки .
Push-стиль обработки XSLT .
Обновление : OP не имеет настоящего XSLT-процессора - его инструмент не реализует xsl:key
В этом случае следующее решение (примечание - это гораздо менее эффективно, чемMuenchian grouping) все еще решает проблему, и производит точный требуемый вывод :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match=
"accident
[not(dep
=
preceding-sibling::*/dep
)
]
">
<xsl:value-of select=
"concat('dep ', dep, ' : ',
count(following-sibling::*[dep = current()/dep]) +1,
' accidents')
"/>
<xsl:if test=
"following-sibling::*/dep
[not(. = current()/dep)
and
not(.
=
../preceding-sibling::*/dep)
]"> ; </xsl:if>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
при применении к тому же документу XML (выше), то же самое,правильный результат получается:
dep 010 : 2 accidents ; dep 420 : 1 accidents