2012-03-23 10 views
0

xmlトランスフォーメーションの問題が発生しました。提案されたmuenchianグループを適用して新しいxmlの同一要素を削除した後、マルチXML要素内のマルチタグ要素をソースXMLから関連する各グループに変換できませんでした。次Muenchianグループ化後にソース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です:私のソースXMLには、以下のことのようです

<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を修正するのを助けることができますか?

答えて

0

変更あなたの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 /アイテムIDを使用して外側のループを[generate-それぞれの個別部品番号の最初の出現を返すことによって、部品IDの「別個の」リストを取得しています。内側のループで同じ式を使用すると、その最初のオカレンスを繰り返し使用しているだけです。注意してください

+0

はい、今すぐxsltが正常に動作します。あなたのコメントは素晴らしい点でした。私はそれが好きです。 – Charles

+0

Muenchianのグループ化では、キーが定義されていれば、それをグループ内のアイテムを見つけるために使用しますが、それはそのアプローチのポイントです。つまり、ではなく、

1

それらの個別の部品番号ごとにそれぞれの出現を見なければならない

ため、各ループの代わりに、あなたの内なる私はと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> 
関連する問題