I met with an xml tranformation problem. After applying a suggested muenchian grouping to remove identical elements in a new xml, I could not convert multi tag elements from a source xml into each related group in a new xml. My source xml is like following:
<?xml version="1.0"?>
<InputShipmentSchedule xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<DataArea>
<ShipmentSchedule>
<ShipmentScheduleLine>
<ManufacturingItem>
<ItemID>
<ID>P313503</ID>
</ItemID>
</ManufacturingItem>
<EffectiveTimePeriod>
<StartDate>2012-03-08</StartDate>
</EffectiveTimePeriod>
<ItemQuantity unitCode="PC">3</ItemQuantity>
</ShipmentScheduleLine>
<ShipmentScheduleLine>
<ManufacturingItem>
<ItemID>
<ID>P313503</ID>
</ItemID>
</ManufacturingItem>
<EffectiveTimePeriod>
<StartDate>2012-03-09</StartDate>
</EffectiveTimePeriod>
<ItemQuantity unitCode="PC">1</ItemQuantity>
</ShipmentScheduleLine>
<ShipmentScheduleLine>
<ManufacturingItem>
<ItemID>
<ID>P313504</ID>
</ItemID>
</ManufacturingItem>
<EffectiveTimePeriod>
<StartDate>2012-03-08</StartDate>
</EffectiveTimePeriod>
<ItemQuantity unitCode="PC">10</ItemQuantity>
</ShipmentScheduleLine>
<ShipmentScheduleLine>
<ManufacturingItem>
<ItemID>
<ID>P313504</ID>
</ItemID>
</ManufacturingItem>
<EffectiveTimePeriod>
<StartDate>2012-03-10</StartDate>
</EffectiveTimePeriod>
<ItemQuantity unitCode="PC">8</ItemQuantity>
</ShipmentScheduleLine>
</ShipmentSchedule>
</DataArea>
</InputShipmentSchedule>
The following is my XSLT:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:strip-space elements="*"/> <xsl:output indent="yes"/>
<xsl:key name="n" match="ItemID" use="ID"/>
<xsl:template match="/">
<Output_Data>
<ShipmentSchedule>
<xsl:for-each select="//ManufacturingItem/ItemID[generate-id()=generate-id(key('n',.))]">
<Part_Detail>
<part_no value="{.}"/>
<xsl:for-each select="//ManufacturingItem/ItemID[generate-id()=generate-id(key('n',.))]">
<xsl:call-template name="requirement_detail_template"/>
</xsl:for-each>
</Part_Detail>
</xsl:for-each>
</ShipmentSchedule>
</Output_Data>
</xsl:template>
<xsl:template name="requirement_detail_template">
<Requirement_Detail>
<requirement_date value="{../../EffectiveTimePeriod/StartDate}"/>
<requirement_qty value="{../../ItemQuantity}"/>
</Requirement_Detail>
</xsl:template>
</xsl:stylesheet>
What I am getting:
<?xml version="1.0" encoding="UTF-8"?>
<Output_Data>
<ShipmentSchedule>
<Part_Detail>
<part_no value="P313503"/>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="3"/>
</Requirement_Detail>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="10"/>
</Requirement_Detail>
</Part_Detail>
<Part_Detail>
<part_no value="P313504"/>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="3"/>
</Requirement_Detail>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="10"/>
</Requirement_Detail>
</Part_Detail>
</ShipmentSchedule>
</Output_Data>
What I expect should be:
<?xml version="1.0" encoding="UTF-8"?>
<Output_Data>
<ShipmentSchedule>
<Part_Detail>
<part_no value="P313503"/>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="3"/>
</Requirement_Detail>
<Requirement_Detail>
<requirement_date value="2012-03-09"/>
<requirement_qty value="1"/>
</Requirement_Detail>
</Part_Detail>
<Part_Detail>
<part_no value="P313504"/>
<Requirement_Detail>
<requirement_date value="2012-03-08"/>
<requirement_qty value="10"/>
</Requirement_Detail>
<Requirement_Detail>
<requirement_date value="2012-03-10"/>
<requirement_qty value="8"/>
</Requirement_Detail>
</Part_Detail>
</ShipmentSchedule>
</Output_Data>
How should I set test conditions in the xsl:if? Can anyone help me to correct my XSLT for this?
change this part of your XSLT:
to this:
and you will get the desired result — the outer loop using “//ManufacturingItem/ItemID[generate-id()=generate-id(key(‘n’,.))]” is getting you a “distinct” list of part IDs by returning the FIRST occurrence of each distinct part number. If you use the same expression in your inner loop then you are just using that first occurrence repeatedly. Instead your inner for-each loop must look at each occurrence for each of those distinct part numbers
Take care