我是xslt的新手,我的要求是根据业务规范将xml文件转换为文本文件。我在处理一个字符串格式问题时遇到了问题。如果您有任何想法,请帮忙解决。
这是输入xml数据的一部分: "0001295"
期望的结果打印到文本文件中: 1295
我的主要问题是去除前导零。如果您有任何逻辑/函数,请分享。
只需使用这个简单的表达式:
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(., '#')
有几种方法可以实现这个功能。如果该值完全是数字(例如不是CSV行或产品代码的一部分,如ASN0012345),则可以将其从字符串转换为数字,然后再将其转换回字符串:
string(number($value)).
replace( $value, '^0*', '' )
translate
函数无法处理正则表达式!请参见@TimC的回答。在XSLT1中使用正则表达式和其他好用的函数(例如trim
)的唯一方法是启用调用语言的使用(例如PHP调用XSLT),请参见此PHP编程/XSL注册PHP函数的Wikibook。 - Peter Krauss以下是在XSLT 1.0中实现的一种方法。
首先,通过删除当前值中的所有零元素,找到第一个非零元素。
<xsl:variable name="first" select="substring(translate(., '0', ''), 1, 1)" />
<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>
<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
XSLT 2.0 从字符串中去除前导零
<xsl:value-of select="replace( $value, '^0+', '')"/>
xslt-1.0
。 - michael.hor257kreplace( $value, '^0*(..*)', '$1' )
^0*
是贪婪的,(..*)
捕获最后一个前导零之后的所有输入。$1
指的是捕获的组。0
。xslt-1.0
。 - Sorack<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>
<xsl:value-of select="number(.) * 1"/>
适用于我。
内置的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>
hello 002 and 021, bye
。function ltrim0_Multi($s) {
return preg_replace('/(^0+|(?<= )0+)(?=[1-9])/','',$s);
}
hello 2 and 21, bye
。
hello 002 and 021, bye
),我们无法通过简单的“左修剪”函数来解决...但是,由于我们可以使用注册函数(请参见下面的答案),因此我们可以通过 XSLT1 解决这个问题。 - Peter Krauss