在XSLT 1.0中使用前导零填充数字

Our*_*nas 7 xml string-formatting msxml6 xslt-1.0

我们有一个XML数字,可以在一个大的XML文件中最多3个数字,必须转换为固定长度的文本,以便加载到另一个系统.

我需要在输出中用前导零填充这个长度为15(这是固定长度的文本)

例子:

 - 1 becomes   000000000000001
 - 11 becomes  000000000000011
 - 250 becomes 000000000000250
Run Code Online (Sandbox Code Playgroud)

我试过这个:

<xsl:value-of select="substring(concat('000000000000000', msg:BankAccount/msg:Counter), 12, 15)"/>
Run Code Online (Sandbox Code Playgroud)

在开头获取15个零并获取子字符串,但我必须在子字符串中犯了一个错误,因为在结果中我得到了

0000000000000000000000009LLOYDS BANK PLC
00000000000000000000000010LLOYDS BANK PLC
Run Code Online (Sandbox Code Playgroud)

我也试过,format-number但它返回NaN

<xsl:value-of select="format-number(msg:BankAccount/msg:Counter, '000000000000000')"/>
Run Code Online (Sandbox Code Playgroud)

返回'NaN'

那么我做错了什么,最好的办法是什么?

Tom*_*lak 12

我需要在输出中用前导零填充这个长度为15(

那就是

substring(
  concat('000000000000000', msg:BankAccount/msg:Counter), 
  string-length(msg:BankAccount/msg:Counter) + 1, 
  15
)
Run Code Online (Sandbox Code Playgroud)


Mic*_*Kay 10

另一种方法是

substring(string(1000000000000000 + $x), 2)
Run Code Online (Sandbox Code Playgroud)

  • 是的,我假设$ x是一个数字,或者是一个将转换为数字的值(细节取决于它是XPath 1.0还是2.0). (3认同)
  • 非常优雅的解决方案 (2认同)

小智 8

它也可以使用字符串格式完成

<xsl:value-of select="format-number(msg:BankAccount/msg:Counter, '000000000000000')" />
Run Code Online (Sandbox Code Playgroud)

一般来说:

<xsl:value-of select="format-number(number_you_would_like_to_padd, 'string_how_much_zeros_you_would like')" />
Run Code Online (Sandbox Code Playgroud)


Dan*_*ley 5

另一种选择是xsl:number...

<xsl:number value="number_to_format" format="000000000000001"/>
Run Code Online (Sandbox Code Playgroud)

完整示例...

XML输入

<doc>
    <test>1</test>
    <test>11</test>
    <test>250</test>
</doc>
Run Code Online (Sandbox Code Playgroud)

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="text"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="test">
    <xsl:number value="." format="000000000000001"/>
    <xsl:text>&#xA;</xsl:text>
  </xsl:template>

</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

输出

000000000000001
000000000000011
000000000000250
Run Code Online (Sandbox Code Playgroud)

小提琴:http://xsltfiddle.liberty-development.net/pPzifpg