2

2 つのタイプのケースに対して 1 つの出力が返されるようにします。最初のケースは、ノードをループして、それが満たされているかどうかを判断する必要があります。XML は次のとおりです。

<in:inputs 
  xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
   <in:result name="GetCart">
      <root xmlns="">
        <USC_Purchase ProductPrice="95.0000" 
                      PriceRuleID="1810" 
                      PurchaseQuantity="-1.00" 
                      PaymentNotRequiredQuantity="0.00" 
                      PaymentRequiredQuantity="-1.00" 
                      PaymentRequiredTotal="-95.000000" 
                      PurchaseStatus="R" 
                      RefundTotalAllowed="0.00">
          <USC_Product_PriceRule 
            PriceRuleID="1810" 
            PriceRuleName="Full Attendee" 
            PriceRulePriority="1" 
            PriceRuleStatus="A" 
            WebUserGroups="13CONF-M001" 
            ExcludeWebUserGroups="" 
            ProductPrice="95.0000" 
            ExternalCode="" 
            PercentOfProductCode="" 
            OptionID="0" 
            FriendlyName="Discounted Rate" 
            StartEndRestrictionID="0" 
            ClassID="0" 
            IsHidden="0"/>
        </USC_Purchase>
        <USC_Purchase ProductPrice="55.0000" 
                      PurchaseQuantity="-4.00" 
                      PaymentNotRequiredQuantity="0.00" 
                      PaymentRequiredQuantity="-4.00" 
                      PaymentRequiredTotal="-220.000000" 
                      PurchaseStatus="R" 
                      RefundTotalAllowed="568.00">
          <USC_Product_PriceRule/>
        </USC_Purchase>

最初の USC_Purchase ノードから始まる未完成の XSLT を次に示します。

    <xsl:choose>
      <xsl:when test="@PurchaseStatus='R' 
        and ($purchase_total*($purchase_total >=0)
           - $purchase_total*($purchase_total &lt; 0)) 
           > @RefundTotalAllowed">
       We are having issues processing your refund online. 
       Please contact us for assistance.
      </xsl:when>
      <xsl:otherwise>
        <!-- insert credit card form here -->
      </xsl:otherwise>

これはうまく機能します...最初の製品がこれらの条件を満たした場合にのみ. その他の商品はチェックを外します。xsl:choose ステートメントの先頭にある for-each ループは、複数のメッセージを返し、いずれかの製品が正常に渡された場合はクレジット カード フォームも返します。(ぐう!)

私の質問は、複数の購入ノードをループして、1 つのケースが満たされると停止することは可能ですか?

手順は次のとおりです(私の説明が誰かを失望させる場合に備えて):

  1. 2 つの出力 (エラー メッセージとクレジット カード フォーム) から選択します。

  2. 各 USC_Purchase ノードについて、いずれかのノードで「X」条件が満たされた場合、単一のエラー メッセージを表示します。

  3. それ以外の場合は、クレジット カード フォームを表示します。

さらに情報が必要な場合は、お知らせください。

編集

確かに、 purchase_total はすべての paymentrequiredtotals の合計によって決定されるため、次のようになります。

<xsl:variable 
  name="purchase_total" 
  select="sum(USC_Purchase/@PaymentRequiredTotal)" />
4

2 に答える 2

2

わかりました、ようやくあなたの要件を理解できたと思います。XSLT はその機能的な性質上、「ループするまで」ロジックを採用する傾向がありません (実行することはできますが、別のアプローチが利用可能な場合は一般的に採用されません)。代わりに、テストは通常​​、考えられるすべてのターゲットに一度に適用され、いずれかの条件が満たされているかどうかが確認されます。私はあなたがやろうとしていることを次のようにすべきだと信じています:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" indent="yes"/>

  <xsl:template match="root">
    <xsl:variable
      name="purchase_total"
      select="sum(USC_Purchase/@PaymentRequiredTotal)" />
    <xsl:variable
      name="purchase_total_abs"
      select="$purchase_total * (1 - 2 * ($purchase_total &lt; 0))" />

    <xsl:choose>
      <xsl:when test="USC_Purchase[@PurchaseStatus  ='R' and
                                   $purchase_total_abs > @RefundTotalAllowed]">
        We are having issues processing your refund online. Please contact us for assistance.
      </xsl:when>
      <xsl:otherwise>
        <xsl:call-template name="CreditCardForm" />
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="CreditCardForm">
    <!-- Credit form-->
  </xsl:template>
</xsl:stylesheet>

式を短くするために、まず、次にその絶対値が決定され、次にいずれかのがエラー条件と一致するpurchase_totalかどうかを確認するためにテストが行​​われます。USC_Purchaseその場合はエラー メッセージが表示され、そうでない場合はクレジット カード フォームが表示されます。

于 2013-02-03T17:57:08.603 に答える
0

このわずかに短い変換USC_Purchaseは、必要に応じて各要素を処理します。これは、結果に明確に示されています

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

  <xsl:variable name="vTotalPaymentRequired"
   select="sum(/*/*/root/USC_Purchase/@PaymentRequiredTotal)"/>

 <xsl:template match="USC_Purchase">
  Purchase <xsl:value-of select="position()"/>
   <xsl:choose>
    <xsl:when test=
     "@PurchaseStatus  ='R'
    and not(@RefundTotalAllowed + $vTotalPaymentRequired >= 0)">
         <xsl:text>
          We are having issues processing your refund online.
         </xsl:text>
         <xsl:text> Please contact us for assistance.</xsl:text>
    </xsl:when>
    <xsl:otherwise>
     Credit Form displayed here
    </xsl:otherwise>
   </xsl:choose>
 </xsl:template>
 <xsl:template match="USC_Product_PriceRule"/>
</xsl:stylesheet>

この変換が提供された XML ドキュメントに適用されると、次のようになります。

<in:inputs
  xmlns:in="http://www.composite.net/ns/transformation/input/1.0">
   <in:result name="GetCart">
      <root xmlns="">
        <USC_Purchase ProductPrice="95.0000"
                      PriceRuleID="1810"
                      PurchaseQuantity="-1.00"
                      PaymentNotRequiredQuantity="0.00"
                      PaymentRequiredQuantity="-1.00"
                      PaymentRequiredTotal="-95.000000"
                      PurchaseStatus="R"
                      RefundTotalAllowed="0.00">
          <USC_Product_PriceRule
            PriceRuleID="1810"
            PriceRuleName="Full Attendee"
            PriceRulePriority="1"
            PriceRuleStatus="A"
            WebUserGroups="13CONF-M001"
            ExcludeWebUserGroups=""
            ProductPrice="95.0000"
            ExternalCode=""
            PercentOfProductCode=""
            OptionID="0"
            FriendlyName="Discounted Rate"
            StartEndRestrictionID="0"
            ClassID="0"
            IsHidden="0"/>
        </USC_Purchase>
        <USC_Purchase ProductPrice="55.0000"
                      PurchaseQuantity="-4.00"
                      PaymentNotRequiredQuantity="0.00"
                      PaymentRequiredQuantity="-4.00"
                      PaymentRequiredTotal="-220.000000"
                      PurchaseStatus="R"
                      RefundTotalAllowed="568.00">
          <USC_Product_PriceRule/>
        </USC_Purchase>
    </root>
  </in:result>
</in:inputs>

必要な正しい結果が生成されます。

  Purchase 1
          We are having issues processing your refund online.
          Please contact us for assistance.
  Purchase 2
     Credit Form displayed here
于 2013-02-03T21:04:42.093 に答える