1

XML コピー変換ごとのロジックに従って、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 要素 Parameter[@ID=' 「SpecialDiscountPercent」と「BulkDiscountPercent」の合計を保持します。この場合、Parameter[@ID='SpecialDiscountPercent'] と Paramete[@ID='BulkDiscountPercent'] の両方が最終的な XML に表示されません。どうすればこれを達成できますか? ご意見ありがとうございます

4

1 に答える 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 に答える