在我的ORACLE SOA BPEL流程中,我们收到一个值为字符串@ 10.2345678956,但对于目标系统,我们只需要发送最多4个十进制位,如10.2345。你能否告诉我如何使用xslt实现这一目标。
如果源系统发送的值甚至是10,那么在目标系统中我们需要发送10.0000(总是4位十进制数)
答案 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')
并完成它。