1

问题在于指定的输入,我有一个类似这样的输入,-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>

4

2 回答 2

1

'0123456789.*****'失踪了-

于 2013-08-22T12:23:45.997 回答
1

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

它不是您的帖子所暗示的模式匹配器。

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

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

...它的工作原理是 NaN 不等于 NaN。

于 2013-08-22T14:27:42.050 回答