我想比较输入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>
感谢您提前提供任何帮助
答案 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>