XSLT 1.0 Удалить начальные нули и добавить десятичную точку к значению - PullRequest
0 голосов
/ 05 ноября 2018

Я работаю с XSLT 1.0 и пытаюсь удалить все начальные нули и добавить десятичную точку перед последними 2 числами. Количество символов всегда будет одинаковым.

Примеры:

  • 0001094125 нужно перевести на 10941.25
  • 0000042000 нужно перевести на 420,00
  • 0000040458 нужно перевести на 404,58
  • 0000153800 нужно перевести на 1538,00

Я читаю с использованием format-number (), но я не хочу, чтобы происходило какое-либо округление. Есть идеи, как это сделать? Спасибо!

1 Ответ

0 голосов
/ 05 ноября 2018

Вы должны иметь возможность использовать format-number() без округления ...

Ввод XML

<doc>
    <test>0001094125</test>
    <test>0000042000</test>
    <test>0000040458</test>
    <test>0000153800</test>
</doc>

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="test">
    <xsl:copy>
      <xsl:value-of select="format-number(normalize-space() div 100,'#.00')"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

выход

<doc>
   <test>10941.25</test>
   <test>420.00</test>
   <test>404.58</test>
   <test>1538.00</test>
</doc>

Рабочая скрипка: http://xsltfiddle.liberty -development.net / 3NzcBu8 / 1

В качестве альтернативы, вы можете отформатировать число для удаления начальных нулей, а затем вы можете использовать substring () для конкатенации первой части строки, десятичной точки и последней части строки (в зависимости от длины строки).

Пример ...

XSLT 1.0

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="@*|node()">
    <xsl:copy>
      <xsl:apply-templates select="@*|node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="test">
    <xsl:copy>
      <xsl:variable name="nbr" select="format-number(normalize-space(),'#')"/>
      <xsl:variable name="length" select="string-length($nbr)"/>
      <xsl:value-of 
        select="concat(substring($nbr,1,$length - 2),'.',substring($nbr, $length - 1))"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

выход

<doc>
   <test>10941.25</test>
   <test>420.00</test>
   <test>404.58</test>
   <test>1538.00</test>
</doc>

Рабочая скрипка: http://xsltfiddle.liberty -development.net / 3NzcBu8

...