2013-02-03 82 views
2

我想爲兩種類型的情況返回1個輸出。第一種情況必須通過節點循環來確定它是否被滿足。下面是XML:XSLT - 測試每個節點的條件,並在條件滿足時打破測試

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

這是我未完成的XSLT,它開始於第一USC_Purchase節點:

<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循環將返回多條消息,如果有任何產品傳遞正常,還會返回信用卡表單。 (grr!)

我的問題是 - 是否有可能循環多個購買節點,並停止一旦遇到一個案例?

以下是具體步驟(如果我的解釋是扔人關):

  1. 兩個輸出(錯誤信息和信用卡的形式)之間進行選擇。

  2. 對於每個USC_Purchase節點,如果在任何節點上滿足'X'條件,則顯示單個錯誤消息。

  3. 否則,顯示信用卡表格。

如果需要更多信息,請讓我知道。

編輯

肯定,purchase_total由所有paymentrequiredtotals的總和決定的,所以:

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

有沒有機會看到更多XSLT的biiiit?特別是,如何確定'$ purchase_total'? – JLRishe

+0

感謝您爲'purchase_total'添加邏輯。所以我在理解何時應該顯示錯誤消息的邏輯方面遇到了一些麻煩。它看起來像'purchase_total'被確定爲跨所有行的總和。這應該與'@ RefundTotalAllowed'值的總和進行比較,還是與每個'@ RefundTotalAllowed'單獨比較?它也看起來像是在那裏進行絕對值計算,所以如果'@ PaymentRequiredTotal'的總和的絕對值是>'RefundTotalAllowed',顯示錯誤?我無法理解這裏的邏輯。 – JLRishe

+0

這是正確的。如果PaymentRequiredTotal的絕對值爲> RefundTotalAllowed,則應顯示錯誤。基本上RefundTotalAllowed確定用戶是否通過信用卡爲該特定產品付款,如果他們確實將退還給我們的最大金額返還給該信用卡。如果他們通過支票支付,RefundTotalAllowed將爲0.我希望這有助於澄清事情。 @JLRishe – user673869

回答

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 S的匹配錯誤條件。如果是,則顯示錯誤消息,如果沒有,則顯示信用卡表單。

+0

我認爲這將適用於第一個USC_Purchase節點,但不適用於任何附加節點?附加到每個USC_Purchase節點的RefundTotalAllowed屬性是基於其特定產品的,例如,如果我們有2個USC_purchase記錄,並且第一個USC_Purchase節點沒有通過測試,它會提取信用卡表單,但如果第二個USC_Purchase記錄不能退還,則不會有支票。選擇之前的h循環會爲每個usc_purchase記錄返回兩個循環。我非常感謝您的幫助,但我不認爲我想在XSLT中完成任何工作。 – user673869

+0

@ user673869上面的我的XSLT應該將測試同時應用於所有USC_Purchase節點,並顯示錯誤文本(只有錯誤文本),如果匹配其中任何一個,並顯示信用卡表單,如果不是。您是否嘗試過使用它,或者在您執行該禮貌之前是否宣佈它不合適? – JLRishe

+0

我的歉意@JLRishe - 這正是我要找的!如果你不能說我不善於解釋xslt,並假定我對我正在努力完成的事情進行解釋。但是,在第二次接受你的代碼之後,我注意到括號(抓住了滿足條件的第一個USC_Purchase)。你真棒,我欠你一個大的遺憾。非常感謝你!考慮解決這個問題。 – user673869

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