2017-07-06 60 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>