Pretty simple question, how can I transform a number (1, 2, 3, etc) into a print friendly ordinal number (1st, 2nd, 3rd, etc) using xslt?

Currently the following works for 1-20 but we may be seeing larger sets of entities getting ranked soon:

```
<xsl:template name="FormatRanking">
    <xsl:param name="Value"></xsl:param>

    <xsl:choose>
        <xsl:when test="$Value = '1'">
            <xsl:value-of select="$Value"/>st
        </xsl:when>
        <xsl:when test="$Value = '2'">
            <xsl:value-of select="$Value"/>nd
        </xsl:when>
        <xsl:when test="$Value = '3'">
            <xsl:value-of select="$Value"/>rd
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$Value"/>th
        </xsl:otherwise>
    </xsl:choose>

</xsl:template> 

```

The only way I would know how to do this would be to change the xsl:when's:

```
<xsl:when test="$Value = '1'">
<xsl:when test="$Value = '2'">
<xsl:when test="$Value = '3'">

```

to (not even sure if this is correct):

```
<xsl:when test="$Value = '1' or $Value = '21' or $Value = '31' ...">
<xsl:when test="$Value = '2' or $Value = '22' or $Value = '33' ...">
<xsl:when test="$Value = '3' or $Value = '22' or $Value = '33' ...">

```

I'd like to do something similar to this [Is there an easy way to create ordinals in C#?](https://stackoverflow.com/questions/20156/ordinals-in-c#) but I'm not sure if it's possible in Xslt.

At this point we only need an English solution.