如何使用转换中的新元素替换某些元素

时间:2013-04-23 16:46:48

标签: xslt xslt-1.0

我想根据每个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中。我该如何实现这一目标?谢谢你的任何输入

1 个答案:

答案 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>