2011-10-13 4 views
0

아래 정의 된 형식으로 XML을 수신 중입니다. 특정 노드 만 병합되는 방식으로 XML을 변환하는 코드를 작성 중입니다.특정 XML 노드를 평평하게하는 XSLT

<TransactionRequest> 
    <OrderRequests> 
    <OrderRequest> 
     <ReferenceNumber>1234567</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <IsRush>true</IsRush> 
     <ShippingAddress> 
     <Name>Tom Hanks</Name> 
     <Address1>1123 Canada Way</Address1> 
     <City>Burnaby</City> 
     <Province>BC</Province> 
     <PostalCode>V3B13B</PostalCode> 
     <HomePhone>6048871121</HomePhone> 
     <BusinessPhone>6041232342</BusinessPhone> 
     </ShippingAddress> 
     <ProgramType>C2</ProgramType> 
     <Comments>Deliver to the receptionist</Comments> 
     <Items> 
     <Item> 
      <Sku>UN10004</Sku> 
      <Quantity>2</Quantity> 
     </Item> 
     <Item> 
      <Sku>UN980011</Sku> 
      <Quantity>1</Quantity> 
     </Item> 
     </Items> 
    </OrderRequest> 
    </OrderRequests> 
    <TraceRequests> 
    <TraceRequest> 
     <ReferenceNumber>23432345</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <OriginalReferenceNumber>1234567</OriginalReferenceNumber> 
     <Comments>Trace Items</Comments> 
     <TraceItems> 
     <TraceItem> 
      <Sku>UN10004</Sku> 
      <Quantity>2</Quantity> 
      <ShipmentNumber>CM88888990</ShipmentNumber> 
     </TraceItem> 
     <TraceItem> 
      <Sku>UN980011</Sku> 
      <ProductCode>AA0091</ProductCode> 
      <Quantity>1</Quantity> 
      <ShipmentNumber>DDP123123123</ShipmentNumber> 
     </TraceItem> 
     </TraceItems> 
    </TraceRequest> 
    </TraceRequests> 
</TransactionRequest> 

그 결과는 다음과 같습니다. 차이점은이 XML에서 TraceRequest 노드는 각 Items/Item에 대해 부모 정보를 한 번 복제하여 각 Items/Item 노드 당 하나씩 분할된다는 것입니다.

<?xml version="1.0"?> 
<TransactionRequest> 
    <OrderRequests> 
    <OrderRequest> 
     <ReferenceNumber>1234567</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <IsRush>true</IsRush> 
     <ShippingAddress> 
     <Name>Tom Hanks</Name> 
     <Address1>1123 Canada Way</Address1> 
     <City>Burnaby</City> 
     <Province>BC</Province> 
     <PostalCode>V3B13B</PostalCode> 
     <HomePhone>6048871121</HomePhone> 
     <BusinessPhone>6041232342</BusinessPhone> 
     </ShippingAddress> 
     <ProgramType>C2</ProgramType> 
     <Comments>Deliver to the receptionist</Comments> 
     <Items> 
     <Item> 
      <Sku>UN10004</Sku> 
      <Quantity>2</Quantity> 
     </Item> 
     <Item> 
      <Sku>UN980011</Sku> 
      <Quantity>1</Quantity> 
     </Item> 
     </Items> 
    </OrderRequest> 
    </OrderRequests> 
    <TraceRequests> 
    <TraceRequest> 
     <ReferenceNumber>23432345</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <OriginalReferenceNumber>1234567</OriginalReferenceNumber> 
     <Comments>Trace Items</Comments> 
     <Sku>UN10004</Sku> 
     <Quantity>2</Quantity> 
     <ShipmentNumber>CM88888990</ShipmentNumber> 
    </TraceRequest> 
    <TraceRequest> 
     <ReferenceNumber>23432345</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <OriginalReferenceNumber>1234567</OriginalReferenceNumber> 
     <Comments>Trace Items</Comments> 
     <Sku>UN980011</Sku> 
     <ProductCode>AA0091</ProductCode> 
     <Quantity>1</Quantity> 
     <ShipmentNumber>DDP123123123</ShipmentNumber> 
    </TraceRequest> 
    </TraceRequests> 
</TransactionRequest> 

TraceRequest 요소의 특정 하위 노드 요소 만 병합하려면 XSLT를 생성 할 수없는 것 같습니다.

답변

2

특수한 경우에 대한 추가 템플릿을 사용하여 표준 ID 변환을 재정의하면이 작업을 수행 할 수 있습니다. 당신이 TraceRequest 노드 일치하는 경우 첫째

는, 당신은 바로 당신이 복사를 할 것입니다 TraceItem 노드를 일치로 건너 뛰려. 이 경우 현재 TraceRequest 노드를 나중에 chidlren 복사를위한 매개 변수로 전달할 수 있습니다. TraceItem을 일치시킬 때 다음

<xsl:template match="TraceRequest"> 
    <xsl:apply-templates select="TraceItems/TraceItem"> 
     <xsl:with-param name="TraceRequestNode" select="."/> 
    </xsl:apply-templates> 
</xsl:template> 

, 당신은 단지합니다 (TraceItems 노드를 제외) 매개 변수를 통해 전달 된 TraceRequest의 자식을 복사 할 수 있습니다 TraceItem 노드의 또한 아이들 당신은 현재에 위치하고 있습니다.

샘플 XML에 적용
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 

    <xsl:template match="@*|node()"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="TraceRequest"> 
     <xsl:apply-templates select="TraceItems/TraceItem"> 
     <xsl:with-param name="TraceRequestNode" select="."/> 
     </xsl:apply-templates> 
    </xsl:template> 

    <xsl:template match="TraceItem"> 
     <xsl:param name="TraceRequestNode"/> 
     <TraceRequest> 
     <xsl:apply-templates select="$TraceRequestNode/*[not(self::TraceItems)]"/> 
     <xsl:apply-templates select="@*|node()"/> 
     </TraceRequest> 
    </xsl:template> 
</xsl:stylesheet> 

, 출력은 다음과 같다 :

<TransactionRequest> 
    <OrderRequests> 
     <OrderRequest> 
     <ReferenceNumber>1234567</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <IsRush>true</IsRush> 
     <ShippingAddress> 
      <Name>Tom Hanks</Name> 
      <Address1>1123 Canada Way</Address1> 
      <City>Burnaby</City> 
      <Province>BC</Province> 
      <PostalCode>V3B13B</PostalCode> 
      <HomePhone>6048871121</HomePhone> 
      <BusinessPhone>6041232342</BusinessPhone> 
     </ShippingAddress> 
     <ProgramType>C2</ProgramType> 
     <Comments>Deliver to the receptionist</Comments> 
     <Items> 
      <Item> 
       <Sku>UN10004</Sku> 
       <Quantity>2</Quantity> 
      </Item> 
      <Item> 
       <Sku>UN980011</Sku> 
       <Quantity>1</Quantity> 
      </Item> 
     </Items> 
     </OrderRequest> 
    </OrderRequests> 
    <TraceRequests> 
     <TraceRequest> 
     <ReferenceNumber>23432345</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <OriginalReferenceNumber>1234567</OriginalReferenceNumber> 
     <Comments>Trace Items</Comments> 
     <Sku>UN10004</Sku> 
     <Quantity>2</Quantity> 
     <ShipmentNumber>CM88888990</ShipmentNumber> 
     </TraceRequest> 
     <TraceRequest> 
     <ReferenceNumber>23432345</ReferenceNumber> 
     <TransactionTime>2010-11-16T00:00:00-08:00</TransactionTime> 
     <OriginalReferenceNumber>1234567</OriginalReferenceNumber> 
     <Comments>Trace Items</Comments> 
     <Sku>UN980011</Sku> 
     <ProductCode>AA0091</ProductCode> 
     <Quantity>1</Quantity> 
     <ShipmentNumber>DDP123123123</ShipmentNumber> 
     </TraceRequest> 
    </TraceRequests> 
</TransactionRequest> 
0

가 좋아, 내가 내 자신의 질문에 대답 생각 전체 XSLT 주어진 그래서

<xsl:template match="TraceItem"> 
    <xsl:param name="TraceRequestNode"/> 
    <TraceRequest> 
     <xsl:apply-templates select="$TraceRequestNode/*[not(self::TraceItems)]"/> 
     <xsl:apply-templates select="@*|node()"/> 
    </TraceRequest> 
</xsl:template> 

, 아래의 XSLT를 실행하는 사용자 :

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

    <xsl:template match="TransactionRequest"> 
    <TransactionRequest> 
     <xsl:copy-of select="OrderRequests"/> 
     <TraceRequests> 
     <xsl:for-each select="TraceRequests/TraceRequest/TraceItems/TraceItem"> 
      <TraceRequest> 
      <xsl:copy-of select="../../ReferenceNumber"/> 
      <xsl:copy-of select="../../TransactionTime"/> 
      <xsl:copy-of select="../../OriginalReferenceNumber"/> 
      <xsl:copy-of select="../../Comments"/> 

      <xsl:copy-of select="Sku"/> 
      <xsl:copy-of select="Quantity"/> 
      <xsl:copy-of select="ShipmentNumber"/> 
      <xsl:copy-of select="ProductCode"/> 
      <xsl:copy-of select="DropShipPoNumber"/> 
      </TraceRequest> 
     </xsl:for-each> 
     </TraceRequests> 
    </TransactionRequest> 
    </xsl:template> 
</xsl:stylesheet>