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>

这是我未完成的 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 循环将返回多条消息,以及信用卡表单(如果任何产品通过正常)。(咕噜!)

我的问题是 - 是否可以循环多个购买节点并在遇到单个案例时停止?

以下是步骤(以防我的解释让任何人失望):

  1. 在两个输出(错误消息和信用卡表格)之间进行选择。

  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_Purchases 与错误条件匹配。如果是,则显示错误消息,如果不是,则显示信用卡表格。

于 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 回答