0

ある xml 形式から別の xml 形式に変換するために xslt を作成しました。

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

これが私のソース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;

すべてのオブジェクトを 1 回のパスで逆シリアル化するためにできる変更はありますか。「GenomicOrder/ProductionOrder」と「GenomicOrder/SalesOrder」の両方に変換を記述しました。

4

1 に答える 1

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>

そのXSLT2.0スタイルシートは、入力でSaxon9.4を使用して実行した場合

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

出力

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

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

于 2012-04-27T10:20:52.920 に答える