有没有一种方法可以转换多个数字xml值并传递总和?

时间:2019-08-02 13:05:59

标签: xml xslt

我正在尝试转换某些客户端XML,以添加多个数值的总和,而不是将它们串联在一起。

输入xml有时格式错误,因此可以包含多个值,而xslt最初被编写为期望一个值。

客户端XML

<ChargeList>                
<MtxEventCharge>
    <UsageQuantity>1327.0</UsageQuantity>
    <UsageQuantityUnit>100</UsageQuantityUnit>
    <AppliedOfferIndex>1</AppliedOfferIndex>
    <BalanceUpdateIndex>1</BalanceUpdateIndex>
    <UpdateType>2</UpdateType>
    <Amount>9.9525</Amount>
    <ImpactSource>1</ImpactSource>
</MtxEventCharge>
<MtxEventCharge>
    <UsageQuantity>3959.0</UsageQuantity>
    <UsageQuantityUnit>100</UsageQuantityUnit>
    <AppliedOfferIndex>0</AppliedOfferIndex>
    <BalanceUpdateIndex>2</BalanceUpdateIndex>
    <UpdateType>3</UpdateType>
    <Amount>19.795</Amount>
    <ImpactSource>1</ImpactSource>
</MtxEventCharge>
<MtxEventCharge>
    <UsageQuantity>3959.0</UsageQuantity>
    <UsageQuantityUnit>100</UsageQuantityUnit>
    <AppliedOfferIndex>1</AppliedOfferIndex>
    <BalanceUpdateIndex>3</BalanceUpdateIndex>
    <UpdateType>1</UpdateType>
    <Amount>23.754</Amount>
    <ImpactSource>1</ImpactSource>
</MtxEventCharge>
<MtxEventCharge>
    <UsageQuantity>3959.0</UsageQuantity>
    <UsageQuantityUnit>100</UsageQuantityUnit>
    <AppliedOfferIndex>1</AppliedOfferIndex>
    <BalanceUpdateIndex>3</BalanceUpdateIndex>
    <UpdateType>2</UpdateType>
    <Amount>29.6925</Amount>
    <ImpactSource>1</ImpactSource>
</MtxEventCharge>
</ChargeList>

原始xslt

<xsl:template name="Charges">

<!-- Get the Charge Events with the relevant Update Type values -->     
<xsl:variable name="AccessCharge" select="./ChargeList/MtxEventCharge[UpdateType=2]" />

<!-- Check if the Access Charge was supplied -->
<xsl:if test="$AccessCharge">
    <!-- Convert and print the amount charged -->
    <xsl:call-template name="MapAmount">
        <xsl:with-param name="amount">
            <xsl:value-of select="$AccessCharge/Amount" />
        </xsl:with-param>
    </xsl:call-template>
</xsl:if>

错误消息 FORG0001:无法将字符串“ 9.9525 29.6925”转换为xs:decimal

我试图使用sum和tokenize函数来添加值,但是我无法使它起作用

<xsl:value-of select="sum(for $s in tokenize($AccessCharge/Amount,'\s+')
                  return number($s))" />

错误消息 不允许将一个以上的项目作为tokenize()的第一个参数(“ 9.9525”,“ 29.6925”)

我希望将9.9525 29.6925的值作为39.645的总和传递给我们

1 个答案:

答案 0 :(得分:0)

将您的MapAmount模板更改为

<xsl:template name="MapAmount">
    <xsl:param name="amount" />
    <xsl:value-of select="format-number(sum(for $s in tokenize($amount,'\s+')
              return number($s)),'#.###')" />
</xsl:template>

并从变量中删除前导.

<xsl:variable name="AccessCharge" select="/ChargeList/MtxEventCharge[UpdateType=2]" />

输出应为:

  

39.645

如果这行不通,请确保可以使用XSLT-2.0,否则必须更改整个代码。