I started off by simplifying your XSLT to this....
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Report">
<html>
<head>
<title>Inventory with Shipping Data</title>
</head>
<body>
<xsl:apply-templates select="Result"/>
</body>
</html>
</xsl:template>
<xsl:key name="byGroup" match="Inventory" use="../Item/Sku[.=current()/Sku]/../Groups/Group[1]" />
<xsl:template match="Result">
<table class="report data">
<tbody>
<xsl:for-each select="Inventory[ count(. | key( 'byGroup', '../Item/Sku[.=current()/Sku]/../Groups/Group[1]')[1]) = 1 ]">
<xsl:element name="tr">
<xsl:apply-templates select="." mode="item"/>
</xsl:element>
<xsl:element name="tr">
<xsl:apply-templates select="." mode="group" />
</xsl:element>
</xsl:for-each>
</tbody>
</table>
</xsl:template>
<xsl:template match="Inventory" mode="item">
<td><xsl:value-of select="../Item/Sku[.=current()/Sku]/../Groups/Group[1]" /></td>
</xsl:template>
<xsl:template match="Inventory" mode="group">
<td><xsl:value-of select="Sku" /></td>
</xsl:template>
</xsl:stylesheet>
The first thing to note is that for each Inventory element in your XML, you output two tr elements, which is why you get six rows in your output. You are always going to get an even number of rows this way. Perhaps you want you want is to output a row for each distinct Item/Groups/Group[1] (of which there are two distinct values), and then output a row for each Inventory which have a matching Sku.
To start with, your key can be simplified to this
<xsl:key name="byGroup" match="Inventory"
use="../Item[Sku=current()/Sku]/Groups/Group[1]" />
But there is a problem with how you use this key...
<xsl:for-each
select="Inventory[ count(. | key( 'byGroup', '../Item/Sku[.=current()/Sku]/../Groups/Group[1]')[1]) = 1 ]">
You should not be using apostrophes for the second argument of the key function, otherwise it will be treated as a literal. You should be doing this.... (Using the simplified key shown above)
<xsl:for-each
select="Inventory[ count(. | key( 'byGroup', ../Item[Sku=current()/Sku]/Groups/Group[1])[1]) = 1 ]">
But even this has a problem. In the xsl:key statement, current() will refer to the Inventory item currently being matched. But in the xsl:for-each statement, current() refers to the node on which you are currently positioned when the xsl:for-each is executed, which is the Result element.
To get around this, define a key to allow you to look up Item elements by Sku
<xsl:key name="itemBySku" match="Item" use="Sku" />
Then, the xsl:for-each can be written like this:
<xsl:for-each
select="Inventory[ count(. | key('byGroup', key('itemBySku', Sku)/Groups/Group[1])[1]) = 1 ]">
Finally, to output all the Inventory elements in the current group, you would then do this:
<xsl:apply-templates
select="key('byGroup', key('itemBySku', Sku)/Groups/Group[1])" mode="group" />
Try this XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/Report">
<html>
<head>
<title>Inventory with Shipping Data</title>
</head>
<body>
<xsl:apply-templates select="Result"/>
</body>
</html>
</xsl:template>
<xsl:key name="byGroup" match="Inventory" use="../Item[Sku=current()/Sku]/Groups/Group[1]" />
<xsl:key name="itemBySku" match="Item" use="Sku" />
<xsl:template match="Result">
<table class="report data">
<tbody>
<xsl:for-each select="Inventory[ count(. | key('byGroup', key('itemBySku', Sku)/Groups/Group[1])[1]) = 1 ]">
<tr>
<xsl:apply-templates select="." mode="item"/>
</tr>
<xsl:apply-templates select="key('byGroup', key('itemBySku', Sku)/Groups/Group[1])" mode="group" />
</xsl:for-each>
</tbody>
</table>
</xsl:template>
<xsl:template match="Inventory" mode="item">
<td><xsl:value-of select="key('itemBySku', Sku)/Groups/Group[1]" /></td>
</xsl:template>
<xsl:template match="Inventory" mode="group">
<tr>
<td><xsl:value-of select="Sku" /></td>
</tr>
</xsl:template>
</xsl:stylesheet>
Possibly this is not actually want you are looking for, but it should at least show you how to simplify your XSLT, and give you something to use as a basis for adding in all the other functionality you need that wasn't related to the underlying issue at hand.