Как преобразовать элементы нескольких тегов из исходного XML в каждую связанную группу после мюнхенской группировки - PullRequest
0 голосов
/ 23 марта 2012

Я столкнулся с проблемой преобразования 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 для этого?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Я бы предложил следующую таблицу стилей, используя apply-templates и функцию key с XSLT 1.0:

<xsl:stylesheet
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  version="1.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:key name="k1" match="ShipmentScheduleLine" use="ManufacturingItem/ItemID/ID"/>

  <xsl:template match="/">
    <Output_Data>
      <ShipmentSchedule>
        <xsl:apply-templates select="//ShipmentScheduleLine[generate-id() = generate-id(key('k1', ManufacturingItem/ItemID/ID)[1])]" mode="group"/>
      </ShipmentSchedule>
    </Output_Data>
  </xsl:template>

  <xsl:template match="ShipmentScheduleLine" mode="group">
    <Part_Detail>
       <part_no value="{ManufacturingItem/ItemID/ID}"/>
       <xsl:apply-templates select="key('k1', ManufacturingItem/ItemID/ID)"/>
    </Part_Detail>
  </xsl:template>

  <xsl:template match="ShipmentScheduleLine">
    <Requirement_Detail>
        <requirement_date value="{EffectiveTimePeriod/StartDate}"/>
        <requirement_qty value="{ItemQuantity}"/>
    </Requirement_Detail>
  </xsl:template>

</xsl:stylesheet>
0 голосов
/ 23 марта 2012

изменить эту часть вашего XSLT:

    <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> 

к этому:

    <Part_Detail>
       <xsl:variable name="part_no" select="."/>
       <part_no value="{$part_no}"/>
       <xsl:for-each select="//ManufacturingItem/ItemID[. = $part_no]">
         <xsl:call-template name="requirement_detail_template"/>
       </xsl:for-each>
    </Part_Detail>

и вы получите желаемый результат - внешний цикл, использующий "// ManufacturingItem / ItemID [generate-id () = generate-id (key ('n',.))]", Дает вам msgstr "список идентификаторов деталей путем возврата ПЕРВОГО вхождения каждого отдельного номера детали. Если вы используете одно и то же выражение во внутреннем цикле, то вы просто используете это первое вхождение несколько раз. Вместо этого ваш внутренний цикл for-each должен смотреть на каждое вхождение для каждого из этих отдельных номеров деталей

Береги себя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...