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>
感謝所有幫助提前
感謝您的快速反應邁克!對不起,這個例子的xml沒有正確地描述這個需求。所以更新了兩個** ReceiptLines **和兩個** OrderLines **。每個訂單可能有多個訂單行,因此計劃將其與PrimeLineNo匹配。只有當數量與相應的收據和訂單行相匹配時,屬性** ExtnCompleteShipment **也應爲Y. – 2014-09-30 19:55:51
@KrisG我相信你有足夠的力量來完成這一切,你不覺得嗎? – 2014-09-30 20:00:02
感謝您的時間,但我的問題仍未得到解答。我對xsl很陌生,儘管看了一些例子,但我一直在循環和分配一個變量,因爲一旦變量出現在foreach中,它就會超出範圍。您的代碼給出了這樣的作爲輸出的xml:<?XML版本= 「1.0」 編碼= 「UTF-8」> – 2014-09-30 20:13:02