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

时间:2013-08-22 12:16:51

标签: xslt format decimal xslt-1.0 xslt-2.0

问题是指定输入,我有一个输入,在这个,-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>

2 个答案:

答案 0 :(得分:1)

'0123456789.*****'缺少-

答案 1 :(得分:1)

我认为您不理解translate()的用法。第二个参数是单个字符的关键字符串,重复*是无关紧要的。第三个参数是一串相应的翻译字符,其中没有,所以它只是从输入中删除字符。即使添加-,您的测试也会接受字符串“123-45.678.9”作为数字。

这不是一个模式匹配器,这是你的帖子隐含的。

如果你想在XSLT 1.0中检查一个元素没有子元素并且是数字的,那么这应该有效:

match="*[not(*)][number(.)=number(.)]"

......这是基于NaN不等于NaN的原则。