2017-07-06 18 views
-2

我对XSLT非常陌生,并且有一个奇怪的要求,对此我还没有找到任何解决方案。服务器端我们有2.0版的XSLT。将数字转换为英文Word-Meaning using XSLT

输入数字可以从零(0)到任何值最多8位数字。 我需要按照特定的格式将其转换为英文单词含义。

如果数量是5位(实施例 - 28651)的然后前三组之后,将2-空间5-Astric(*****),所以总7.

如果英语字任何数字包含少于5个字母(例如6 SIX然后它必须跟着2 + 2 = 4个空格使它相当于5个字母英文WORD)

对于数字的最后一个数字还必须跟着2个空格如上。

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.)分别取出每个数字或任何数组中的每个数字。

这就是我在想它的方法。

+1

问与工作分配的帮助是好的,前提是你已经证明你已经尝试过什么特别你被困在那里 - 不只是张贴规范,并希望有人会为你做它。 – kjhughes

+1

关于您列出的方法,您应该考虑更多的功能比程序上。例如,请参阅[*如何更改或重新分配XSLT中的变量?](https://stackoverflow.com/q/19255139/290085) – kjhughes

+0

感谢@kjhughes的回复。是的,你是对的,我应该事先准备一些事情来要求任何特别的疑问,但是我没有做好任何准备。 但是在你的动机之后,我写了下面这样的东西来达到我的要求,这是非常基本的编码方式,因为我是其语法的新手。 –

回答

1

这实际上在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  
+0

非常感谢您的卓越努力,这正是我一直在寻找的。 我没有意识到所有这些标准库函数和语法都可以用它的复杂性级别来创建最好的代码。 再次感谢让我思考不同的方向。 下面是我的代码来实现,但这不是编码的最佳做法。 –

0

我刨光e就像下面这样达到我的要求,这是非常基本的编码方式,因为我是其语法的新手。但是,这正在以我需要的方式工作。我同意这不是一个好的编码习惯。

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