2014-04-04 3 views
1

XSLT를 사용하여 XML에 부모 요소를 추가하려고하지만 예상 결과를 얻지 못했습니다. 내 XML 및 XSL 코드를 참조하십시오. 내 변환은 새로 추가 된 노드 아래에 모든 자식을 추가하지만 새로 추가 된 태그 아래에 DocumentReference 만 기대합니다.XSLT를 사용하여 부모 노드 추가

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<DataArea> 
    <PurchaseOrder> 
     <PurchaseOrderLine> 
      <DocumentReference> 
        <DocumentID> 
         <ID>23423</ID> 
        </DocumentID> 
      </DocumentReference> 
      <DocumentReference> 
       <DocumentID> 
        <ID>23424</ID> 
       </DocumentID> 
      </DocumentReference> 
      <Item> 
       <CustomerItemID> 
        <!-- ArtNr --> 
        <ID>444</ID> 
       </CustomerItemID> 
      </Item> 
      <Quantity unitCode="PCE">17.3</Quantity> 
     </PurchaseOrderLine> 
    </PurchaseOrder> 
</DataArea> 

XML 파일 예상 결과

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<DataArea> 
    <PurchaseOrder> 
      <PurchaseOrderLine> 
      <Kiran> 
      <DocumentReference> 
       <DocumentID> 
        <ID>23423</ID> 
       </DocumentID> 
      </DocumentReference> 
      <DocumentReference> 
       <DocumentID> 
        <ID>23424</ID> 
       </DocumentID> 
       </DocumentReference> 
      </Kiran>> 
      <Item> 
       <CustomerItemID> 
        <!-- ArtNr --> 
        <ID>444</ID> 
       </CustomerItemID> 
      </Item> 
      <Quantity unitCode="PCE">17.3</Quantity> 
     </PurchaseOrderLine> 
     </PurchaseOrder> 
</DataArea> 

XSLT 코드

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

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

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

답변

1

당신은 명시 적으로 이름을 지정하여 부모 노드에서 할 요소 chooose 수 있습니다. 이렇게하면 DocumentReferenceKiran 아래에 배치됩니다.

<xsl:copy> 
    <Kiran> 
     <xsl:apply-templates select="@*|DocumentReference"/> 
    </Kiran> 
    <xsl:apply-templates select="@*|Item|Quantity"/> 
</xsl:copy> 

이것은 빠르고 간단한 솔루션입니다,하지만 당신은 또한 다른 방법으로 같은 결과를 얻을 수 있습니다 당신이 뭔가 더 일반적인 경우 : 조금 더 코드를 작성 (예 xsl:if, xsl:choose를 사용하거나 추가 템플릿).

+0

완벽하게 작동합니다. –

+0

다음은 [** 승인 **] (http://meta.stackexchange.com/q/5234/234215) @ helderdarocha의 대답입니다. – kjhughes

관련 문제