Я столкнулся с проблемой преобразования XML. После применения предложенной muenchian группировки для удаления идентичных элементов в новом xml я не смог преобразовать элементы нескольких тегов из исходного XML в каждую связанную группу в новом XML. Мой исходный код XML выглядит следующим образом:
<?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>
Вот мой 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>
Что я получаю:
<?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>
То, что я ожидаю, должно быть:
<?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>
Как мне установить условия теста в xsl: if? Может ли кто-нибудь помочь мне исправить мой XSLT для этого?