In your question the ordering you've asked for is consistent with alphabetical order, so a plain <xsl:sort select="@result" /> should work correctly. But in cases where a non-alphabetic fixed ordering is required I tend to use the following trick.
First define the order in a variable, with entries delimited by some character that is not part of any of the options:
<xsl:variable name="sortOrder" select="'|Passed|Failed|Ignored|'" />
Then use
<xsl:sort data-type="number" select="string-length(
substring-before($sortOrder, concat('|', @result, '|')))" />
The trick here is that substring-before($sortOrder, concat('|', @result, '|')) will be the empty string when @result is Passed, the string "|Passed" when @result is Failed, and the string "|Passed|Failed" when @result is Ignored. Thus sorting numerically by the length of these strings will produce the ordering given by $sortOrder.
In this particular case you don't even need the concat, just
<xsl:sort data-type="number" select="string-length(
substring-before($sortOrder, @result))" />
will do the job. The concat is there in the general case to handle situations where one item in the ordering is a substring of another. For example, for an ordering of '|Passed|Pass|Failed|Fail|' the concat is required otherwise "Pass" would be treated the same as "Passed" rather than being consistently sorted after it.