这种转变:
<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
解释:
Muenchian method for grouping。
Push style of XSLT processing。
更新:OP 没有可用的真正 XSLT 处理器——他的工具没有实现 xsl:key
在这种情况下,以下解决方案(注意——这比 Muenchian 分组效率低得多)仍然可以解决问题并产生确切的所需输出:
<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