我正在尝试转换某些客户端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的总和传递给我们
答案 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,否则必须更改整个代码。