使用XSLT将数字转换为英语单词 - 含义

时间:2017-07-06 12:21:51

标签: xslt xslt-2.0

我对XSLT非常陌生并且有一个奇怪的要求,我没有找到任何解决方案。服务器端我们有版本2.0的XSLT。

输入数字可以是零(0)到任意值,最多可达8位数。 我需要按照特定格式将其转换为英语单词 - 意思。

如果数字是5位数(例如 - 28651),那么前三组将是5-Astric(*****),然后是2-space,所以总共7位。

如果任何数字的英文单词包含少于5个字母(例如6 SIX则必须后跟2 + 2 = 4个空格,使其相当于5个字母的英文WORD)

对于数字的最后一位数字,后面还必须跟两个空格。

   INPUT       OUTPUT (Without Enclosing Double-Quote)

    9375 = "*****  *****  *****  *****  NINE   THREE  SEVEN  FIVE   "
    8623 = "*****  *****  *****  *****  EIGHT  SIX    TWO    THREE  "
       0 = "*****  *****  *****  *****  *****  *****  *****  ZERO   "
   28651 = "*****  *****  *****  TWO    EIGHT  SIX    FIVE   ONE    "

40378623 = "FOUR   ZERO   THREE  SEVEN  EIGHT  SIX    TWO    THREE  "

我无法使用Java执行以下任何操作。

1。)将任何值分配给现有变量。 2.)取反面数字(345到543) 3.)在任何数组或其他内容中分别取出每个数字。

这就是我的方法。

2 个答案:

答案 0 :(得分:2)

这在XSLT 2.0中实际上并不是很难。请考虑以下示例:

<强> XML

<input>
    <entry>0</entry>
    <entry>12</entry>
    <entry>345</entry>
    <entry>6789</entry>
    <entry>24680</entry>
    <entry>135797</entry>
    <entry>1234567</entry>
    <entry>87654321</entry>
</input>

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="UTF-8" />

<xsl:variable name="strings" select="('ZERO   ', 'ONE    ', 'TWO    ', 'THREE  ', 'FOUR   ', 'FIVE   ', 'SIX    ', 'SEVEN  ', 'EIGHT  ', 'NINE   ')" />

<xsl:template match="/input">
    <xsl:for-each select="entry">
        <!-- padding -->
        <xsl:for-each select="1 to 8 - string-length(.)">
            <xsl:text>*****  </xsl:text>
        </xsl:for-each>
        <!-- digits to strings   -->
        <xsl:for-each select="string-to-codepoints(.)">
            <xsl:variable name="i" select="codepoints-to-string(.) " /> 
            <xsl:value-of select="$strings[number($i) + 1]"/>
        </xsl:for-each>
        <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

<强>结果

*****  *****  *****  *****  *****  *****  *****  ZERO   
*****  *****  *****  *****  *****  *****  ONE    TWO    
*****  *****  *****  *****  *****  THREE  FOUR   FIVE   
*****  *****  *****  *****  SIX    SEVEN  EIGHT  NINE   
*****  *****  *****  TWO    FOUR   SIX    EIGHT  ZERO   
*****  *****  ONE    THREE  FIVE   SEVEN  NINE   SEVEN  
*****  ONE    TWO    THREE  FOUR   FIVE   SIX    SEVEN  
EIGHT  SEVEN  SIX    FIVE   FOUR   THREE  TWO    ONE    

答案 1 :(得分:0)

我在下面写了类似的东西来实现我的要求,这是非常基本的编码方式,因为我对它的语法是新手。但这正是我所需要的。我同意这不是编码的好习惯。

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

      <xsl:template name="digits">

        <xsl:param name="text" />

        <xsl:if test="$text != ''">

          <xsl:variable name="letter" select="substring($text, 1, 1)" />

          <xsl:if test="$letter = '0'">
           <xsl:text>ZERO   </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '1'">
           <xsl:text>ONE    </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '2'">
           <xsl:text>TWO    </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '3'">
           <xsl:text>THREE  </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '4'">
           <xsl:text>FOUR   </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '5'">
           <xsl:text>FIVE   </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '6'">
           <xsl:text>SIX    </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '7'">
           <xsl:text>SEVEN  </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '8'">
           <xsl:text>EIGHT  </xsl:text>
          </xsl:if>
          <xsl:if test="$letter = '9'">
           <xsl:text>NINE   </xsl:text>
          </xsl:if>

          <xsl:call-template name="digits">
            <xsl:with-param name="text" select="substring-after($text, $letter)" />
          </xsl:call-template>

        </xsl:if>

      </xsl:template>

      <xsl:template match="/">
          <xsl:variable name="Vnum">
             <xsl:number value="/Payment/Amount"/>
          </xsl:variable>
          <xsl:variable name="Vlen">
            <xsl:value-of select="string-length($Vnum)" />
          </xsl:variable>

                    <xsl:if test="$Vlen = '1'">
                        <xsl:text>*****  *****  *****  *****  *****  *****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '2'">
                        <xsl:text>*****  *****  *****  *****  *****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '3'">
                        <xsl:text>*****  *****  *****  *****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '4'">
                        <xsl:text>*****  *****  *****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '5'">
                        <xsl:text>*****  *****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '6'">
                        <xsl:text>*****  *****  </xsl:text>
                    </xsl:if>
                    <xsl:if test="$Vlen = '7'">
                        <xsl:text>*****  </xsl:text>
                    </xsl:if>

          <xsl:call-template name="digits">
            <xsl:with-param name="text" select="$Vnum"/>
          </xsl:call-template>
      </xsl:template>
    </xsl:stylesheet>