我想根据每个XML Copy转换的逻辑修改XML文档:
输入XML
<Request>
<Parameters>
<Parameter ID="SpecialDiscountPercent" Changed="false" Value="6.00"/>
<Parameter ID="AccessoryDiscount" Changed="false" Value="0.00"/>
<Parameter ID="AccessoryDiscountPercent" Changed="false" Value="0"/>
<Parameter ID="BulkDiscountPercent" Changed="false" Value="4.0"/>
</Parameters>
</Product>
</Request>
预期输出XML
<Request>
<Parameters>
<Parameter ID="AccessoryDiscount" Changed="false" Value="0.00"/>
<Parameter ID="AccessoryDiscountPercent" Changed="false" Value="0"/>
<Parameter ID="totalDiscountPercent" Changed="false" Value="10.0"/>
</Parameters>
</Product>
</Request>
如果输入XML文件中有任何参数[@ ID ='SpecialDiscountPercent']或参数[@ID ='BulkDiscountPercent'],那么我希望在输出XML中有一个新的XML元素参数[@ ID ='totalDiscountPercent']将保存'SpecialDiscountPercent'和'BulkDiscountPercent'的总和。在这种情况下,参数[@ ID ='SpecialDiscountPercent']和Paramete [@ ID ='BulkDiscountPercent']都不应出现在最终的XML中。我该如何实现这一目标?谢谢你的任何输入
答案 0 :(得分:1)
有很多方法可以实现这一目标,但这是一种方法:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
<xsl:strip-space elements="*" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<xsl:template match="Parameters">
<xsl:variable name="specialDiscounts"
select="Parameter[@ID = 'SpecialDiscountPercent' or
@ID = 'BulkDiscountPercent']" />
<xsl:copy>
<xsl:apply-templates select="@* | node()[count(. | $specialDiscounts) !=
count($specialDiscounts)]" />
<xsl:if test="$specialDiscounts">
<Parameter ID="totalDiscountPercent" Changed="false"
Value="{format-number(sum($specialDiscounts/@Value), '0.0')}" />
</xsl:if>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
在您的示例输入上运行时(一旦删除了迷路</Products>
),结果就是:
<Request>
<Parameters>
<Parameter ID="AccessoryDiscount" Changed="false" Value="0.00" />
<Parameter ID="AccessoryDiscountPercent" Changed="false" Value="0" />
<Parameter ID="totalDiscountPercent" Changed="false" Value="10.0" />
</Parameters>
</Request>