It's probably best to avoid repeated code where you can. It is not clear if you are only ever going to have "Consultancy" and "Expenses Incurred", but it may be safe to assume not. I am also going to assume you can have multiple Item elements per InvoiceLine (although the solution given still work if this is not the case).
Anyway, you would start off by grouping Item elements by their AdditionalItemIdentification. This would create your groups for "Consultancy" and "Expenses Incurred"
<xsl:for-each-group select="cac:InvoiceLine/cac:Item"
group-by="cac:AdditionalItemIdentification/cbc:ID">
Then, the title of each group would done by simply outputting the name
<xsl:value-of select="cbc:Name" />
Now, within the current group (of Item) elements, you then need to group by description
<xsl:for-each-group select="current-group()"
group-by="cbc:Description">
Finally, in this group (still of Item) you want to group by SellersItemIdentification, although you probably need an extra check because not all Item elements have them (in the case of "Expenses Incurred"
<xsl:for-each-group select="current-group()[cac:SellersItemIdentification/cbc:ID != '']"
group-by="cac:SellersItemIdentification/cbc:ID">
Outputing the current "seller" would them be a case of using the grouping-key, and other fields:
<xsl:value-of select="current-grouping-key()" />
<xsl:value-of select="cac:StandardItemIdentification/cbc:ID" />
As I don't know XSL-FO very well, the XSLT provided as an example will just output vague "table" and "row" elements, but it should give you the general idea.
Try this XSLT:
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"
xmlns:cac="cac" xmlns:cbc="cbc" exclude-result-prefixes="cac cbc">
<xsl:output indent="yes"/>
<xsl:template match="Invoice">
<xsl:for-each-group select="cac:InvoiceLine/cac:Item" group-by="cac:AdditionalItemIdentification/cbc:ID">
<table>
<row><xsl:value-of select="cbc:Name" /></row>
<xsl:for-each-group select="current-group()" group-by="cbc:Description">
<row><xsl:value-of select="cbc:Description" /></row>
<xsl:for-each-group select="current-group()[cac:SellersItemIdentification/cbc:ID != '']" group-by="cac:SellersItemIdentification/cbc:ID">
<row>
<xsl:value-of select="current-grouping-key()" /> - <xsl:value-of select="cac:StandardItemIdentification/cbc:ID" />
</row>
</xsl:for-each-group>
</xsl:for-each-group>
</table>
</xsl:for-each-group>
</xsl:template>
</xsl:stylesheet>
This should output the following (based on your provided sample, which only includes Groucho, and not poor old Zeppo or Harpo)
<table>
<row>CONSULTANCY</row>
<row>Snide Remarks</row>
<row>Groucho - 2014-02-24</row>
</table>
<table>
<row>EXPENSES INCURRED</row>
<row>Cigars</row>
</table>