如何使用xslt将数字(1,2,3等)转换为序数(第1,第2,第3等)

时间:2009-07-29 19:42:14

标签: xslt

非常简单的问题,如何使用xslt将数字(1,2,3等)转换为打印友好的序数(第1,第2,第3等)?

目前以下内容适用于1-20,但我们可能会看到更多的实体即将排名:

<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> 

我知道如何做到这一点的唯一方法就是改变xsl:when's:

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

to(甚至不确定这是否正确):

<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' ...">

我想做类似于Is there an easy way to create ordinals in C#?的事情,但我不确定它是否可以在Xslt中使用。

此时我们只需要一个英语解决方案。

3 个答案:

答案 0 :(得分:9)

以下是来自"Is there an easy way to create ordinals in C#?"的解决方案,转换为XSLT:

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

  <xsl:value-of select="$Value"/>

  <!-- a little parameter sanity check (integer > 0) -->
  <xsl:if test="
    translate($Value, '0123456789', '') = ''
    and
    $Value > 0
  ">
    <xsl:variable name="mod100" select="$Value mod 100" />
    <xsl:variable name="mod10"  select="$Value mod 10" />

    <xsl:choose>
      <xsl:when test="$mod100 = 11 or $mod100 = 12 or $mod100 = 13">th</xsl:when>
      <xsl:when test="$mod10 = 1">st</xsl:when>
      <xsl:when test="$mod10 = 2">nd</xsl:when>
      <xsl:when test="$mod10 = 3">rd</xsl:when>
      <xsl:otherwise>th</xsl:otherwise>
    </xsl:choose>
  </xsl:if>
</xsl:template>

答案 1 :(得分:5)

我不是说在xslt中执行此操作是个好主意,但是......

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

    <xsl:choose>
            <xsl:when test="substring($Value,string-length($Value)-1) = '11'">
                    <xsl:value-of select="$Value"/>th
            </xsl:when>
            <xsl:when test="substring($Value,string-length($Value)-1)  = '12'">
                    <xsl:value-of select="$Value"/>th
            </xsl:when>
            <xsl:when test="substring($Value,string-length($Value)-1)  = '13'">
                    <xsl:value-of select="$Value"/>th
            </xsl:when>
            <xsl:when test="substring($Value,string-length($Value)) = '1'">
                    <xsl:value-of select="$Value"/>st
            </xsl:when>
            <xsl:when test="substring($Value,string-length($Value))  = '2'">
                    <xsl:value-of select="$Value"/>nd
            </xsl:when>
            <xsl:when test="substring($Value,string-length($Value))  = '3'">
                    <xsl:value-of select="$Value"/>rd
            </xsl:when>
            <xsl:otherwise>
                    <xsl:value-of select="$Value"/>th
            </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

编辑:或者更简洁的解决方案:

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

    <xsl:variable name="penultimateChar" select="substring($Value,string-length($Value)-1, 1)"/>
    <xsl:variable name="lastChar" select="substring($Value,string-length($Value))"/>

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

答案 2 :(得分:0)

你能使用XSLT扩展吗?我知道EXSLT有很大范围的date and time extensions