2014-09-30 68 views
1

我想比較輸入xml中兩個不同元素的數量,如果數量匹配,請將「Y」賦值給xsl中的變量。在嵌套for each each循環中比較數量Xslt

輸出XML應具有輸入XML的與ExtnXSLCompleteShipment端部的複製和ExtnXSL元件與「Y」屬性值,如果ReceiptLine元件數量和對於相同的PrimeLineNo屬性訂單行 OrderedQuantity匹配。我在想,xsl應該有兩個for-each循環和一個帶有Y或N值的變量completeShipment

這裏是輸入XML。

<?xml version="1.0"?> 
<Receipt DocumentType="0005" ReceivingNode="110"> 
<Shipment DocumentType="0005" EnterpriseCode="CostcoUSA" OrderNo="Y100000594" ReceivingNode="110"/> 
<ReceiptLines> 
<ReceiptLine PrimeLineNo="1" SubLineNo="" OrderNo="Y100000600" Quantity="40.00"/> 
<ReceiptLine PrimeLineNo="2" SubLineNo="" OrderNo="Y100000600" Quantity="30.00"/> 
</ReceiptLines> 
<OrderDetails> 
<Order OrderHeaderKey="201402041210274226042" OrderNo="Y100000594" EnterpriseCode="CostcoUSA" DocumentType="0005"> 
<OrderLines> 
<OrderLine OrderedQuantity="40" PrimeLineNo="1" SubLineNo="1" > 
<OrderLine OrderedQuantity="30" PrimeLineNo="2" SubLineNo="2" > 
<ChainedFromOrderLine> 
<Order> 
<Extn ExtnSpecialHandlingFlagt="N" /> 
</Order> 
</ChainedFromOrderLine> 
</OrderLine> 
</OrderLine> 
</OrderLines> 
</Order> 
</OrderDetails> 
</Receipt> 

這裏是輸出XML

<?xml version="1.0"?> 
<Receipt DocumentType="0005" ReceivingNode="110"> 
<Shipment DocumentType="0005" EnterpriseCode="CostcoUSA" OrderNo="Y100000594" ReceivingNode="110"/> 
<ReceiptLines> 
<ReceiptLine PrimeLineNo="1" SubLineNo="" OrderNo="Y100000600" Quantity="40.00"/> 
<ReceiptLine PrimeLineNo="2" SubLineNo="" OrderNo="Y100000600" Quantity="30.00"/> 
</ReceiptLines> 
<OrderDetails> 
<Order OrderHeaderKey="201402041210274226042" OrderNo="Y100000594" EnterpriseCode="CostcoUSA" DocumentType="0005"> 
<OrderLines> 
<OrderLine OrderedQuantity="40" PrimeLineNo="1" SubLineNo="1" > 
<OrderLine OrderedQuantity="30" PrimeLineNo="2" SubLineNo="2" > 
<ChainedFromOrderLine> 
<Order> 
<Extn ExtnSpecialHandlingFlagt="N" /> 
</Order> 
</ChainedFromOrderLine> 
</OrderLine> 
</OrderLine> 
</OrderLines> 
</Order> 
</OrderDetails> 
    <ExtnXSL ExtnXSLSpecialHandlingFlag="N" ExtnXSLCompleteShipment="Y" /> 
    </Receipt> 

這裏是ExtnXSL的XSD與我需要幫助:

<ExtnXSL> 
       <xsl:variable name="completeShipment">   
       <xsl:for-each select="Receipt/ReceiptLines/ReceiptLine"> 
       <xsl:variable name="receiptQty" select="@Quantity"/> 
       <xsl:varaible name="rPrimeLineNo" select="@PrimeLineNo"/> 
       <xsl:for-each select="//Receipt/OrderDetails/Order/OrderLines/OrderLine[PrimeLineNo=rPrimeLineNo]"> 
        <xsl:varaible name="orderedQty" select="@OrderedQuantity"/> 

        <xsl:if test="orderedQty != receiptQty"> 
         <xsl:value-of select="'N'"/> 
        </xsl:if> 
       </xsl:for-each> 
       </xsl:for-each> 
        <xsl:if test="completeShipment != 'N'"> 
         <xsl:variable name="completeShipment" select="'Y'"/> 
        </xsl:if> 


      <xsl:attribute name="ExtnXSLSpecialHandlingFlag"> 
        <xsl:value-of select="'N'"/> 
      </xsl:attribute> 
      <xsl:attribute name="ExtnXSLCompleteShipment"> 
        <xsl:value-of select="$completeShipment"/> 
      </xsl:attribute> 
      </ExtnXSL> 

感謝所有幫助提前

回答

0

如果ReceiptLine元素Quantity和OrderLine OrderedQuantity 匹配相同PrimeLineNo屬性

在您的例子中,PrimeLineNo屬性是空的ReceiptLine,「1」爲訂單行 - 所以這不會匹配。您是否想過通過OrderNo來匹配數量?使用很容易。例如,應用以下樣式:

XSLT 1.0

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

<xsl:key name="receipt" match="ReceiptLine" use="@OrderNo" /> 

<xsl:template match="/"> 
    <output> 
     <xsl:for-each select="Receipt/OrderDetails/Order"> 
      <Order> 
       <xsl:copy-of select="@OrderNo"/> 
       <OrderedQuantity> 
        <xsl:value-of select="sum(OrderLines/OrderLine/@OrderedQuantity)"/> 
       </OrderedQuantity> 
       <ReceivedQuantity> 
        <xsl:value-of select="sum(key('receipt', @OrderNo)/@Quantity)"/> 
       </ReceivedQuantity> 
      </Order> 
     </xsl:for-each> 
    </output> 
</xsl:template> 

</xsl:stylesheet> 

您輸入例將導致:

<?xml version="1.0" encoding="UTF-8"?> 
<output> 
    <Order OrderNo="Y100000123"> 
     <OrderedQuantity>50</OrderedQuantity> 
     <ReceivedQuantity>50</ReceivedQuantity> 
    </Order> 
</output> 
+0

感謝您的快速反應邁克!對不起,這個例子的xml沒有正確地描述這個需求。所以更新了兩個** ReceiptLines **和兩個** OrderLines **。每個訂單可能有多個訂單行,因此計劃將其與PrimeLineNo匹配。只有當數量與相應的收據和訂單行相匹配時,屬性** ExtnCompleteShipment **也應爲Y. – 2014-09-30 19:55:51

+0

@KrisG我相信你有足夠的力量來完成這一切,你不覺得嗎? – 2014-09-30 20:00:02

+0

感謝您的時間,但我的問題仍未得到解答。我對xsl很陌生,儘管看了一些例子,但我一直在循環和分配一個變量,因爲一旦變量出現在foreach中,它就會超出範圍。您的代碼給出了這樣的作爲輸出的xml:<?XML版本= 「1.0」 編碼= 「UTF-8」> <訂單OrderNo = 「Y100000123」> 40 40 2014-09-30 20:13:02