比较嵌套for-each循环Xslt中的数量

时间:2014-09-30 18:15:39

标签: xml xslt

我想比较输入xml中两个不同元素的数量,如果数量匹配,则将“Y”分配给xsl中的变量。

如果 ReceiptLine 元素Quantity和 OrderLine OrderedQuantity匹配相同的PrimeLineNo属性。我认为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>

感谢您提前提供任何帮助

1 个答案:

答案 0 :(得分:0)

  

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

在您的示例中,对于ReceiptLine,PrimeLineNo属性为空,对于OrderLine,PrimeLineNo属性为“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>