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

时间:2012-01-10 09:53:00

标签: xslt xslt-1.0

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

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

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

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

8 个答案:

答案 0 :(得分:22)

只需使用这个简单的表达

number(.)

以下是完整示例

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

应用于此XML文档

<t>0001295</t>

产生了想要的正确结果

1295

<强> II。使用format-number()

format-number(., '#')

答案 1 :(得分:5)

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

string(number($value)).

否则只需在开头替换0:

replace( $value, '^0*', '' )

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

希望有所帮助。 戴夫

答案 2 :(得分:5)

以下是在XSLT 1.0中可以实现的一种方法。

首先,通过删除当前值

中的所有零元素来查找第一个非零元素
<xsl:variable name="first" select="substring(translate(., '0', ''), 1, 1)" />

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

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

或者,将两个陈述合并为一个

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

所以,给出以下输入

<a>00012095Kb</a>

然后使用以下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>

将输出以下内容

12095Kb

答案 3 :(得分:2)

您可以使用将删除前导零的递归模板:

<xsl:template name="remove-leading-zeros">
    <xsl:param name="text"/>
    <xsl:choose>
        <xsl:when test="starts-with($text,'0')">
            <xsl:call-template name="remove-leading-zeros">
                <xsl:with-param name="text"
                    select="substring-after($text,'0')"/>
            </xsl:call-template>
        </xsl:when>
        <xsl:otherwise>
            <xsl:value-of select="$text"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:template>

像这样调用它:

 <xsl:call-template name="remove-leading-zeros">
        <xsl:with-param name="text" select="/path/to/node/with/leading/zeros"/>
    </xsl:call-template>
</xsl:template>

答案 4 :(得分:2)

作为XSLT 2.0中可以与数字或字母数字输入一起使用的简单替代方法,无论是否带有前导零,您都可以尝试:

replace( $value, '^0*(..*)', '$1' )

这是有效的,因为^0*是贪婪的,(..*)在最后一个前导零之后捕获剩余的输入。 $1指的是捕获的组。

请注意,仅包含零的输入将输出0

答案 5 :(得分:1)

<xsl:value-of select="number(.) * 1"/>

适合我

答案 6 :(得分:1)

XSLT 2.0 从STRING中删除前导零

<xsl:value-of select="replace( $value, '^0+', '')"/>

答案 7 :(得分:0)

所有XSLT1解析器与流行的libXML2's module for XSLT一样,都有registered functions facility ...因此,我们可以假设使用它。假设调用XSLT的语言是PHP:请参阅this wikibook about registerPHPFunctions


内置PHP函数ltrim可以在

中使用
  <?xml version="1.0" encoding="UTF-8"?>
  <xsl:stylesheet version="1.0" 
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
       xmlns:fn="http://php.net/xsl">
   <xsl:output method="xml" encoding="utf-8" indent="yes"/>
   <xsl:template match="test">
       show <xsl:value-of select="fn:function('ltrim',string(.),'0')" />",
   </xsl:template>
  </xsl:stylesheet>

现在想象一个更复杂的问题,ltrim一个数字超过1的字符串,例如。 hello 002 and 021, bye

解决方案是相同的:使用registerPHPFunctions,除了将内置函数更改为用户定义的函数,

function ltrim0_Multi($s) {
    return preg_replace('/(^0+|(?<= )0+)(?=[1-9])/','',$s);
} 

将示例转换为hello 2 and 21, bye