Your code works for me. With this stylesheet, using Saxon 8.9.0.3
<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
version="2.0">
<xsl:template match="worksheet">
<xsl:for-each-group select="user" group-by="tokenize(cell[@name='role'],';')">
<xsl:element name="list">
<xsl:element name="group">
<xsl:value-of select="current-grouping-key()" />
</xsl:element>
<xsl:for-each select="current-group()/cell[@name='User Name'] ">
<xsl:element name="user">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:element>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
I get this output:
<?xml version="1.0" encoding="UTF-8"?>
<list>
<group>developer</group>
<user>Suzy Smith</user>
<user>John Gerrard</user>
</list>
<list>
<group>project_manager</group>
<user>Tom Case</user>
<user>Ian Lloyd</user>
<user>John Gerrard</user>
</list>
<list>
<group>team_leader</group>
<user>Tom Case</user>
<user>Ian Lloyd</user>
</list>
Michael Kay
http://www.saxonica.com/
Author, XSLT Programmer's Reference and XPath 2.0 Programmer's Reference