2012-04-27 19 views
0

XMLフォーマットから別のXMLフォーマットに変換するためのxsltがあります。xsltグループ化 - あるXMLフォーマットから他のXMLフォーマットに変換する

ソースファイルには複数の「製造指図」と1つの「販売注文」 私の宛先には、すべての製造指図を保持する「販売注文」が1つしかありません。ここで

<GenomicOrder> 
    <SalesOrder> 
    .... 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    </SalesOrder> 
</GenomicOrder> 

マイデシリアライズコードは

DataContractSerializer ser = new DataContractSerializer(typeof(SalesOrder)); 
      FileStream fs = 
       new FileStream(
        @"C:\realsample.xml", 
        FileMode.Open); 
      XmlDictionaryReader reader1 = XmlDictionaryReader.CreateTextReader(fs, new XmlDictionaryReaderQuotas()); 

      //Deserialize the data and read it from the instance. 
      SalesOrder parent = (SalesOrder)ser.ReadObject(reader1, true); 

      reader1.Close(); 

私の成功した販売注文XSLT変換以下のようになり、以下のよう

<GenomicOrder> 
    <SalesOrder> 
    .... 
    </SalesOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
</GenomicOrder> 

私の先のxml形式である私のソースXMLフォーマットであります以下の通りである。

<xsl:template match="/"> 
    <SalesOrder> 
     <xsl:apply-templates select="GenomicOrder/SalesOrder"/> 
     <ProductionOrders> 
     <xsl:apply-templates select="GenomicOrder/ProductionOrder"/> 
     </ProductionOrders> 
    </SalesOrder> 
    </xsl:template> 

SalesOrder.OrderId = 1234; SalesOrder.ProductionOrder = null;

私の成功した製造指図XSLT変換は、以下の通りである

<xsl:template match="/"> 
     <SalesOrder> 
      <ProductionOrders> 
      <xsl:apply-templates select="GenomicOrder/ProductionOrder"/> 
      </ProductionOrders> 
      <xsl:apply-templates select="GenomicOrder/SalesOrder"/> 
     </SalesOrder> 
</xsl:template> 

SalesOrder.OrderId = NULL; SalesOrder.ProductionOrder.OrderRef = 12345;

すべてのオブジェクトを1回のパスでデシリアライズするための変更があります。私は "GenomicOrder/ProductionOrder"と "GenomicOrder/SalesOrder"の両方について書かれた変換を持っています。

答えて

1

私は私はあなたが入力にサクソン9.4で実行した場合、2.0スタイルシートをXSLT

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

    <xsl:strip-space elements="*"/> 
    <xsl:output indent="yes"/> 

    <xsl:template match="GenomicOrder"> 
    <xsl:copy> 
     <xsl:for-each-group select="*" group-starting-with="SalesOrder"> 
     <SalesOrder> 
      <xsl:copy-of select="node(), current-group() except ."/> 
     </SalesOrder> 
     </xsl:for-each-group> 
    </xsl:copy> 
    </xsl:template> 

</xsl:stylesheet> 

のようなアプローチを使用することができますSalesOrder要素以下のすべての要素をラップしたいと仮定すると、問題を理解してわかりません

<GenomicOrder> 
    <SalesOrder> 
    .... 
    </SalesOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
</GenomicOrder> 

出力

<GenomicOrder> 
    <SalesOrder> 
    .... 
    <ProductionOrder> 
    .... 
    </ProductionOrder> 
     <ProductionOrder> 
    .... 
    </ProductionOrder> 
     <ProductionOrder> 
    .... 
    </ProductionOrder> 
    </SalesOrder> 
</GenomicOrder> 

Y私の提案が役に立たない場合は、XML入力構造の詳細を投稿する必要があります。

+0

'SalesOrder'要素の後にある' ProductionOrder'要素を結果ツリーの 'SalesOrder'にラップするコードサンプルを投稿しました。サンプルがあなたの望むことをすると思います。 –

+0

投稿したC#コードに問題があり、XSLTではない場合は、質問を再投稿するか、少なくともXSLTとC#の関係を説明することを検討してください。 –