问题是指定的输入,我有一个类似的输入,-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>
我想您不了解translate()
的用法。第二个参数是一个由单个字符组成的键串,复制*
是无关紧要的。第三个参数是一个对应的翻译字符字符串,其中没有,所以它只是从输入中删除这些字符。即使添加了-
,您的测试也会接受字符串"123-45.678.9"作为数字。
这不是一个模式匹配器,这是你的帖子暗示的。
如果您想在XSLT1.0中检查一个元素没有子元素并且是数字的,这应该可以:
match="*[not(*)][number(.)=number(.)]"
其工作原理是NaN不等于NaN。
'0123456789.*****'
缺少-
。