格式化字符串(删除前导零)

Har*_*ari 14 xslt xslt-1.0

我是xslt的新手.我的要求是根据业务规范将xml文件转换为文本文件.我遇到了一个字符串格式问题.如果您有任何想法,请帮帮我.

以下是输入xml数据的一部分:"0001295"

打印到文本文件的预期结果:1295

我的主要问题是删除前导零.如果您有任何逻辑/功能,请分享.

Dim*_*hev 23

只需使用这个简单的表达:

number(.)
Run Code Online (Sandbox Code Playgroud)

这是一个完整的例子:

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

 <xsl:template match="t">
      <xsl:value-of select="number(.)"/>
 </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

应用于此XML文档时:

<t>0001295</t>
Run Code Online (Sandbox Code Playgroud)

产生了想要的正确结果:

1295
Run Code Online (Sandbox Code Playgroud)

II.使用format-number()

format-number(., '#')
Run Code Online (Sandbox Code Playgroud)


det*_*e02 6

有几种方法可以做到这一点.如果值完全是数字(例如,不是CSV行或产品代码的一部分,例如ASN0012345),则可以将字符串转换为数字并再次转换为字符串:

string(number($value)).
Run Code Online (Sandbox Code Playgroud)

否则只需在开始时替换0:

replace( $value, '^0*', '' )
Run Code Online (Sandbox Code Playgroud)

'^'是必需的(标准正则表达式语法)或值001201将被替换为121(删除所有零).

希望有所帮助.戴夫

  • 啊对了,替换是 XSLT 2.0 使用 translate 代替它应该可以正常工作: translate( $value, '^0*', '' ) (2认同)

Tim*_*m C 6

这是在XSLT 1.0中可以实现的一种方法.

首先,通过删除当前值中的所有零元素来查找第一个非零元素

<xsl:variable name="first" select="substring(translate(., '0', ''), 1, 1)" />
Run Code Online (Sandbox Code Playgroud)

然后,您可以在第一个字符之前找到子字符串,然后使用substring-after获取此后的非零部分

<xsl:value-of select="substring-after(., substring-before(., $first))" />
Run Code Online (Sandbox Code Playgroud)

或者,将两个语句合并为一个

<xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />
Run Code Online (Sandbox Code Playgroud)

所以,给出以下输入

<a>00012095Kb</a>
Run Code Online (Sandbox Code Playgroud)

然后使用以下XSLT

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/a">
      <xsl:value-of select="substring-after(., substring-before(., substring(translate(., '0', ''), 1, 1)))" />
   </xsl:template>
</xsl:stylesheet>
Run Code Online (Sandbox Code Playgroud)

将输出以下内容

12095Kb
Run Code Online (Sandbox Code Playgroud)