C# xslt分组-从一种xml格式转换为另一种xml格式

C# xslt分组-从一种xml格式转换为另一种xml格式,c#,datacontractserializer,xml-deserialization,C#,Datacontractserializer,Xml Deserialization,我编写了一个xslt,用于从一种xml格式转换为另一种xml格式 我的源文件有多个“生产订单”和一个“销售订单” 我的目的地只有一个“销售订单”,其中包含所有生产订单 这是我的源xml格式 <GenomicOrder> <SalesOrder> .... </SalesOrder> <ProductionOrder> .... </ProductionOrder> <ProductionOrd

我编写了一个xslt,用于从一种xml格式转换为另一种xml格式

我的源文件有多个“生产订单”和一个“销售订单” 我的目的地只有一个“销售订单”,其中包含所有生产订单

这是我的源xml格式

 <GenomicOrder>
  <SalesOrder>
    ....
  </SalesOrder>
  <ProductionOrder>
    ....
  </ProductionOrder>
  <ProductionOrder>
    ....
  </ProductionOrder>
  <ProductionOrder>
    ....
  </ProductionOrder>
</GenomicOrder>
我成功的销售订单xslt转换如下

<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();
<xsl:template match="/">
    <SalesOrder>
      <xsl:apply-templates select="GenomicOrder/SalesOrder"/>
      <ProductionOrders>
        <xsl:apply-templates select="GenomicOrder/ProductionOrder"/>
      </ProductionOrders>
    </SalesOrder>
  </xsl:template>
<xsl:template match="/">
        <SalesOrder>
          <ProductionOrders>
            <xsl:apply-templates select="GenomicOrder/ProductionOrder"/>
          </ProductionOrders>
          <xsl:apply-templates select="GenomicOrder/SalesOrder"/>
        </SalesOrder>
</xsl:template>

SalesOrder.OrderId=1234; SalesOrder.ProductionOrder=null

我成功的生产订单xslt转换如下

<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();
<xsl:template match="/">
    <SalesOrder>
      <xsl:apply-templates select="GenomicOrder/SalesOrder"/>
      <ProductionOrders>
        <xsl:apply-templates select="GenomicOrder/ProductionOrder"/>
      </ProductionOrders>
    </SalesOrder>
  </xsl:template>
<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”编写了转换。我不确定我是否理解这个问题,假设您希望将所有元素包装在一个
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>

当在输入端使用Saxon 9.4运行XSLT2.0样式表时

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

....
....
....
....
输出

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

....
....
....
....

如果我的建议没有帮助,您可能需要发布有关XML输入结构的更多详细信息。

我发布了一个代码示例,它将
SalesOrder
元素后面的
ProductionOrder
元素包装到结果树中的
SalesOrder
中,因此我认为该示例符合您的要求。如果问题是C#你发布的代码而不是XSLT,然后考虑重新标记你的问题,或者至少解释XSLT和C语言之间的关系。