我是xslt的新手。我的要求是根据业务规范将xml文件转换为文本文件。我遇到了一个字符串格式问题。如果您有任何想法,请帮帮我。
以下是输入xml数据的一部分: “0001295”
打印到文本文件的预期结果: 1295
我的主要问题是删除前导零。如果您有任何逻辑/功能,请分享。
答案 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
。