1

我想根据每个 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 文件中有任何 Parameter[@ID='SpecialDiscountPercent'] 或 Paramete[@ID='BulkDiscountPercent'],那么我希望在输出 XML 中有一个新的 XML Element Parameter[@ID=' totalDiscountPercent'] 将保存 'SpecialDiscountPercent' 和 'BulkDiscountPercent' 的总和。在这种情况下,Parameter[@ID='SpecialDiscountPercent'] 和 Paramete[@ID='BulkDiscountPercent'] 都不应出现在最终 XML 中。我如何做到这一点?感谢您的任何输入

4

1 回答 1

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>
于 2013-04-23T17:01:54.640 回答