如何使用XSLT将小数值修剪为小数点后面的四个位置

时间:2015-08-24 17:11:53

标签: xslt trim bpel

在我的ORACLE SOA BPEL流程中,我们收到一个值为字符串@ 10.2345678956,但对于目标系统,我们只需要发送最多4个十进制位,如10.2345。你能否告诉我如何使用xslt实现这一目标。

如果源系统发送的值甚至是10,那么在目标系统中我们需要发送10.0000(总是4位十进制数)

2 个答案:

答案 0 :(得分:0)

您没有指定使用的是哪个版本的XSLT,但在XSLT 1.0中,您应该“手动”执行此操作,如下所示:

  

注意:正如Michael在评论中所说,您可以在XSLT 1.0中使用format-number。但是,选择的四舍五入还不清楚。虽然这有效,但请参阅迈克尔的答案,以获得更为简单的解决方案。

>>> s = """<?xml version="1.0"?>
... <h:html xmlns="http://www.w3.org/2002/xforms" xmlns:ev="http://www.w3.org/2001/xml-events" xmlns:h="http://www.w3.org/1999/xhtml" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
...   <h:head>
...     <h:title>A title</h:title>
...   </h:head>
...   <h:body>
...     <group ref="blabla">
...       <label>Group 1</label>
...       <input ref="blabla">
...         <label>Field 1</label>
...       </input>
...     </group>
...   </h:body>
... </h:html>"""
>>> import xml.etree.ElementTree as ET
>>> root = ET.fromstring(s)
>>> root.findall(".//{http://www.w3.org/1999/xhtml}input[@ref]")
>>> root.findall(".//{http://www.w3.org/2002/xforms}input[@ref]")
[<Element '{http://www.w3.org/2002/xforms}input' at 0x02288EA0>]

在XSLT 2.0和3.0中,您只需执行以下操作:

<xsl:template match="/">
    <xsl:variable name="input" select="10.23456789" />

    <xsl:call-template name="truncate">
        <xsl:with-param name="val" select="$input" />
    </xsl:call-template>
</xsl:template>

<xsl:template name="truncate">
    <xsl:param name="val" />
    <xsl:variable name="adj">
        <xsl:value-of select="$val"/>
        <xsl:if test="not(contains($val, '.'))">.</xsl:if>
        <xsl:text>0000</xsl:text>
    </xsl:variable>
    <xsl:variable name="before" select="substring-before($adj, '.')" />
    <xsl:variable name="after" select="substring-after($adj, '.')" />
    <xsl:value-of select="$before" />
    <xsl:text>.</xsl:text>
    <xsl:value-of select="substring($after, 1, 4)" />        
</xsl:template>

但是这会向上舍入(一半是偶数),即输入它会给你<xsl:value-of select="format-number($input, '#.0000')" /> 。如果这是不合需要的,您可以使用技巧suggested by fvu

10.2346

上面的XSLT 1.0和XSLT 2.0 / 3.0版本都会将最多四个必要的零附加。

答案 1 :(得分:0)

要截断(即将 down )数字精确到4位小数,您可以这样做:

floor($number * 10000) div 10000

要将结果格式化为始终显示4位小数:

format-number(floor($number * 10000) div 10000, '0.0000')

这适用于XSLT 1.0和XSLT 2.0。

如果您不关心舍入的方向,那么只需:

format-number($number, '0.0000')

并完成它。