我对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.)在任何数组或其他内容中分别取出每个数字。
这就是我的方法。
答案 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> </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>