Maybe it is too early for general observations. I was just comparing:
<xsl:value-of select="string-pad('!', @risk * @severity)" />
with
<xsl:value-of select="string-pad('!', xs:integer(@risk *
@severity))" />
False comparison: you need to compare it with
<xsl:for-each select="(//node())[position() <= (@risk*(_at_)severity))]">
<xsl:text>!</xsl:text>
</xsl:for-each>
Michael Kay
Software AG
home: Michael(_dot_)H(_dot_)Kay(_at_)ntlworld(_dot_)com
work: Michael(_dot_)Kay(_at_)softwareag(_dot_)com
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list