I. 这是著名的XSLT 1.0的Muenchian 分组方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:key name="kDatumByF1" match="datum" use="f1"/>
<xsl:template match=
"datum[generate-id() = generate-id(key('kDatumByF1', f1)[1])]">
<xsl:value-of select="concat('
', f1)"/>
<xsl:apply-templates select="key('kDatumByF1', f1)/f2" mode="inGroup"/>
</xsl:template>
<xsl:template match="f2" mode="inGroup">
- <xsl:value-of select="."/>
</xsl:template>
<xsl:template match="text()"/>
</xsl:stylesheet>
当此转换应用于提供的 XML 文档时:
<doc>
<datum>
<f1>A</f1>
<f2>Monday</f2>
</datum>
<datum>
<f1>A</f1>
<f2>Tuesday</f2>
</datum>
<datum>
<f1>B</f1>
<f2>Wednesday</f2>
</datum>
</doc>
产生了想要的正确结果:
A
- Monday
- Tuesday
B
- Wednesday
二、XSLT 2.0 解决方案,使用xsl:for-each-group
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>
<xsl:template match="/*">
<xsl:for-each-group select="datum" group-by="f1">
<xsl:sequence select="'
', f1"/>
<xsl:apply-templates select="current-group()/f2"/>
</xsl:for-each-group>
</xsl:template>
<xsl:template match="f2">
- <xsl:value-of select="."/>
</xsl:template>
</xsl:stylesheet>