Odd, I tried it a number of times without success. I even dumped the value stack and the object in question was on the stack but the method was never called in the iterator tag. Maybe it was the method name getErrorCount that was causing the problem, not sure. The code I got working is below. It's not too different from the original code I couldn't get working.
<s:iterator value="%{penaltyBreakdown.fileSubmissionErrors}" status="errorStatus"> <tr> <s:if test="%{!complianceCategory.name.equals(#currentCategory)}"> <s:push value="%{penaltyBreakdown.fileSubmissionErrorCounts[complianceCategory]}"> <td style="vertical-align:top;" rowspan="<s:property/>"> <s:property value="complianceCategory.name"/> </td> </s:push> </s:if> <td> <s:property value=" nonCompliance.dataAggregate.element.name"/> </td> <td> <s:property value="nonCompliance.dataAggregate.countValue" /> </td> <td> <s:property value="errorMessage"/> </td> <s:if test="%{#errorStatus.first}"> <td style="vertical-align:top;" rowspan='<s:property value="penaltyBreakdown.fileSubmissionErrors.size()"/>'> <s:property value="penaltyBreakdown.calcFileSubmissionPenalty()"/> </td> </s:if> </tr> <s:set name="currentCategory" value="complianceCategory.name"/> </s:iterator>