问题是指定输入,我有一个输入,在这个,-0.982983928391353 我想格式化为-0.98298(最多5个小数点)这是下面的示例输入xml。
<rs>
<R>
<C0>vo</C0>
<C1>f_item</C1>
<C2>1</C2>
<C3>4</C3>
<C4>Stores</C4>
<C5>2011-10-13T00:00:00</C5>
<C6>Active</C6>
<C7>Supplier</C7>
</R>
<R>
<C0>SManufacturing</C0>
<C1>KB18759</C1>
<C2>-0.1002345678907564</C2>
<C3>2</C3>
<C4>Stores</C4>
<C5>1999-02-03T00:00:00</C5>
<C6>Active</C6>
<C7>Supplier</C7>
</R>
</rs>
所需的输出是
<rs>
<R>
<C0>vo</C0>
<C1>f_item</C1>
<C2>1.00000</C2>
<C3>4.00000</C3>
<C4>Stores</C4>
<C5>2011-10-13T00:00:00</C5>
<C6>Active</C6>
<C7>Supplier</C7>
</R>
<R>
<C0>SManufacturing</C0>
<C1>KB18759</C1>
<C2>-0.10023</C2>
<C3>2.00000</C3>
<C4>Stores</C4>
<C5>1999-02-03T00:00:00</C5>
<C6>Active</C6>
<C7>Supplier</C7>
</R>
</rs>
我试过这个,但这只适用于正整数。它没有格式-0.1002345678907564 ..
<xsl:template match="node()">
<xsl:copy>
<xsl:apply-templates select="@*| node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match = "*[not(*)][translate(.,'0123456789.*****', '') = '']">
<xsl:copy>
<xsl:value-of select="format-number(number(.), '0.00000')"/>
</xsl:copy>
答案 0 :(得分:1)
'0123456789.*****'
缺少-
。
答案 1 :(得分:1)
我认为您不理解translate()
的用法。第二个参数是单个字符的关键字符串,重复*
是无关紧要的。第三个参数是一串相应的翻译字符,其中没有,所以它只是从输入中删除字符。即使添加-
,您的测试也会接受字符串“123-45.678.9”作为数字。
这不是一个模式匹配器,这是你的帖子隐含的。
如果你想在XSLT 1.0中检查一个元素没有子元素并且是数字的,那么这应该有效:
match="*[not(*)][number(.)=number(.)]"
......这是基于NaN不等于NaN的原则。