2012-04-27 3 views
0

하나의 XML 형식에서 다른 형식으로 변환하기 위해 작성된 xslt가 있습니다.xslt 그룹화 - 하나의 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 변환 다음과 같다 아래와 같이

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

모든 변경 사항을 한 번에 모든 개체를 deserialize 할 수 있습니다. "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> 

Y 내 제안이 도움이되지 않으면 XML 입력 구조에 대한 자세한 정보를 게시해야 할 수도 있습니다.

+0

'SalesOrder'요소 다음에 나오는 'ProductionOrder'요소를 결과 트리의 해당 SalesOrder 요소로 래핑하는 코드 샘플을 게시하여 샘플이 원하는대로 처리 할 것으로 생각합니다. –

+0

XSLT가 아닌 게시 ​​한 C# 코드에 문제가있는 경우 질문을 다시 찾거나 적어도 XSLT와 C# 간의 관계를 설명하십시오. –

관련 문제