2012-04-27 68 views
0

我從一個XML格式的,其他轉化寫的XSLT。XSLT分組 - 從一個XML格式轉換爲其他

我的源文件有多個「訂單生產」和一個「限購令」 我的目的地只有一個「限購令」持有所有生產訂單。

這裏是我的源XML格式

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

我的目的地XML格式如下

<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轉換是如下面

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

是有,我可以做反序列化一個傳中的所有對象的任何變化。我爲「GenomicOrder/ProductionOrder」和「GenomicOrder/SalesOrder」編寫了轉換。

回答

1

我不知道我理解這個問題,假設你想換,你可以使用的方法類似SalesOrder元素之後的所有元素

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

這XSLT 2.0樣式表,與撒克遜9.4輸入運行

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

輸出

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

ÿ如果我的建議無效,您可能需要在您的XML輸入結構上發佈更多詳細信息。

+0

我張貼在之後的結果樹'SalesOrder'元素成'SalesOrder'一個代碼示例,封裝了'ProductionOrder'元素,所以我認爲樣品你想要做什麼。 – 2012-04-27 11:30:36

+0

如果問題是出在C#代碼,你貼,而不是與XSLT再考慮重新標記您的問題或至少說明XSLT和C#之間的關係。 – 2012-04-27 11:53:44

相關問題