如何在xslt中格式化负十进制数



问题是指定的输入,我有一个类似的输入,-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.*****'缺少-

最新更新