使用唯一的 XSLT 编码从数字格式中删除逗号

Removing comma from number format with unique XSLT coding

在下面的例子中,XSLT 做了一些事情,它按第 1 列和第 2 列分组,如果它们相同,那么它将对第 3 列的数量进行分组。同样,在 PayAmount 标签内,它将负数 (-) 反转为正数,反之亦然。我遇到的麻烦是编写逻辑以从输出的第 3 列中删除逗号 (,)。

下面是我的 XSLT 代码

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
  <xsl:template match="data">
      <xsl:for-each select="row[generate-id(.) = generate-id(key(''rows'', concat(column1, ''||'', column2)))]">
      </Record>
          <Detail>
            <Amount>
              <xsl:variable name="mySum">
                <xsl:value-of select="sum(key(''rows'', concat(column1, ''||'', column2))/column3)" />
              </xsl:variable>
                <xsl:value-of select="translate(($mySum * ($mySum &gt;= 0) - $mySum * not($mySum &gt;= 0)),'','','''')" />
            </Amount>
          </Detail>
        </Record>
      </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

我尝试了以下逻辑,但逗号仍然存在于输出中:

-    <xsl:value-of select="translate(($mySum * ($mySum &gt;= 0) - $mySum * not($mySum &gt;= 0)),'','', '''')" />
-    <xsl:value-of select="format-number($mySum * ($mySum &gt;= 0) - $mySum * not($mySum &gt;= 0),'#,##0.00')" />
-    <xsl:value-of select="translate(sum(key(''rows'', concat(column1, ''||'', column2))/column3),'','','''')" />

下面是 XML 中的示例数据:

  <data>
    <row>
        <column1>200040</column1>
        <column2>Auto</column2>
        <column3>-500.00</column3>
    </row>
    <row>
        <column1>200040</column1>
        <column2>Auto</column2>
        <column3>-5,000.00</column3>
    </row>
    <row>
        <column1>200040</column1>
        <column2>Auto</column2>
        <column3>-1,000.00</column3>
    </row>
    <row>
        <column1>200040</column1>
        <column2>Auto</column2>
        <column3>300.00</column3>
    </row>
    <row>
        <column1>200040</column1>
        <column2>Auto</column2>
        <column3>-4,000.00</column3>
    </row>
    <row>
        <column1>200041</column1>
        <column2>Bike</column2>
        <column3>-1,700.00</column3>
    </row>
    <row>
        <column1>200041</column1>
        <column2>Bike</column2>
        <column3>-1,000.00</column3>
    </row>
    <row>
        <column1>200041</column1>
        <column2>Bike</column2>
        <column3>800.00</column3>
    </row>
    <row>
        <column1>200045</column1>
        <column2>Bus</column2>
        <column3>200.00</column3>
    </row>
    <row>
        <column1>200045</column1>
        <column2>Bus</column2>
        <column3>-10,000.00</column3>
    </row>
    <row>
        <column1>200045</column1>
        <column2>Bus</column2>
        <column3>5,000.00</column3>
    </row>
    </data>

我想在 运行 XSLT 之后实现的输出是

200040 |汽车 | 10200.00

200041 |自行车 | 1900.00

200045 |巴士 | 4800.00

如有任何帮助,我们将不胜感激!

包含逗号的值不是数字,不能求和。您需要在 尝试对值求和之前删除逗号

这是一个简化的例子:

XSLT 1.0 + EXSLT node-set()

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />

<xsl:key name="a" match="amount" use="@key"/>

<xsl:template match="data">
    <!-- first pass: convert amounts to numbers -->
    <xsl:variable name="amounts">
        <xsl:for-each select="row">
            <amount key="{concat(column1, '|', column2)}">
                <xsl:value-of select="translate(column3, ',', '')"/>
            </amount>
        </xsl:for-each>
    </xsl:variable>
    <!-- output -->
    <Output>
        <xsl:for-each select="exsl:node-set($amounts)/amount[generate-id() = generate-id(key('a', @key))]">
            <Record>
                <Detail1>
                    <xsl:value-of select="substring-before(@key, '|')"/>
                </Detail1>
                <Detail2>
                    <xsl:value-of select="substring-after(@key, '|')"/>
                </Detail2>
                <xsl:variable name="sum" select="sum(key('a', @key))"/>
                <Amount>
                    <xsl:value-of select="format-number($sum, '0.00')"/>
                </Amount>
            </Record>
        </xsl:for-each>
    </Output>
</xsl:template>
  
</xsl:stylesheet>

应用于您的输入示例,这将产生:

结果

<?xml version="1.0" encoding="UTF-8"?>
<Output>
  <Record>
    <Detail1>200040</Detail1>
    <Detail2>Auto</Detail2>
    <Amount>-10200.00</Amount>
  </Record>
  <Record>
    <Detail1>200041</Detail1>
    <Detail2>Bike</Detail2>
    <Amount>-1900.00</Amount>
  </Record>
  <Record>
    <Detail1>200045</Detail1>
    <Detail2>Bus</Detail2>
    <Amount>-4800.00</Amount>
  </Record>
</Output>

要将负数转为正数(反之亦然),您只需更改:

<xsl:value-of select="format-number($sum, '0.00')"/>

至:

<xsl:value-of select="format-number(-$sum, '0.00')"/>