2012-03-02 2 views
1

XML을 다른 XML 파일로 변환하려고하지만 플랫 요소를 확장 요소로 성공적으로 변경하려고합니다.XSLT : 추가 부모 요소가있는 자식 요소를 확장하는 방법

Input 
***** 
<?xml version="1.0" encoding="utf-8"?> 
<RootRec xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="cds"> 
    <MyRecord> 
    <Demographics> 
     <Names> 
     <LegalName namePurpose="L" xmlns="cds_dt"> 
      <FirstName> 
      <Part>Jason</Part> 
      <PartType>GIV</PartType> 
      </FirstName> 
      <LastName> 
      <Part>Smith</Part> 
      <PartType>FAMC</PartType> 
      </LastName> 
      <OtherName> 
      <Part>Lauren</Part> 
      <PartType>GIV</PartType> 
      </OtherName> 
     </LegalName> 
     </Names> 
     <DateOfBirth>1966-02-11</DateOfBirth> 
    <Demographics> 
    <MyRecord>  
</RootRec> 


XSL file 
******** 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output indent="yes"/> 
    <xsl:strip-space elements="*"/> 

    <!--Identity Template. This will copy everything as-is.--> 
    <xsl:template match="node()|@*"> 
    <xsl:copy> 
     <xsl:apply-templates select="node()|@*"/> 
    </xsl:copy> 
    </xsl:template> 

<!--expand "DateOfBirth" element to /DateOfBirth/FullDate element.--> 
    <xsl:template match="RootRec/MyRecord/Demographics/DateOfBirth"> 
    <DateOfBirth> 
     <FullDate><xsl:value-of select="DateOfBirth"/></FullDate> 
    </DateOfBirth> 
    </xsl:template> 
</xsl:stylesheet> 
+0

네임 스페이스 사용이 매우 이상합니다. –

답변

2

이 변환 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
xmlns:x="cds"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

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

<xsl:template match="x:DateOfBirth/text()"> 
    <xsl:element name="FullDate" xmlns="cds_dt"><xsl:value-of select="."/></xsl:element> 
</xsl:template> 
</xsl:stylesheet> 
여기
<DateOfBirth> 
    <FullDate xmlns="cds_dt">1966-02-11</FullDate> 
</DateOfBirth> 

은 입력 I가 사용하고 파일 위치 :

출력은 생년월일 (DateOfBirth)를 제외하고 동일해야는 변경되어야

ovided (wellformed 만들 수 수정) XML 문서 :

<RootRec 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns="cds"> 
    <MyRecord> 
     <Demographics> 
      <Names> 
       <LegalName namePurpose="L" xmlns="cds_dt"> 
        <FirstName> 
         <Part>Jason</Part> 
         <PartType>GIV</PartType> 
        </FirstName> 
        <LastName> 
         <Part>Smith</Part> 
         <PartType>FAMC</PartType> 
        </LastName> 
        <OtherName> 
         <Part>Lauren</Part> 
         <PartType>GIV</PartType> 
        </OtherName> 
       </LegalName> 
      </Names> 
      <DateOfBirth>1966-02-11</DateOfBirth> 
     </Demographics> 
    </MyRecord> 
</RootRec> 

가 원하는, 올바른 결과을 생성합니다

<RootRec xmlns="cds" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <MyRecord> 
     <Demographics> 
     <Names> 
      <LegalName xmlns="cds_dt" namePurpose="L"> 
       <FirstName> 
        <Part>Jason</Part> 
        <PartType>GIV</PartType> 
       </FirstName> 
       <LastName> 
        <Part>Smith</Part> 
        <PartType>FAMC</PartType> 
       </LastName> 
       <OtherName> 
        <Part>Lauren</Part> 
        <PartType>GIV</PartType> 
       </OtherName> 
      </LegalName> 
     </Names> 
     <DateOfBirth> 
      <FullDate xmlns="cds_dt">1966-02-11</FullDate> 
     </DateOfBirth> 
     </Demographics> 
    </MyRecord> 
</RootRec> 

설명 다음 identity rule 재정.

+0

감사합니다 Dimitre - 완벽하게 작동했습니다. 이제 당신이 한 일을 이해해야합니다 ... – user610064

+0

@ user610064 : 환영합니다. 내 대답의 링크를 따라 * 정체성 규칙 *에 대해 읽어보십시오. ID 템플릿의 사용 및 재정의는 가장 기본적이고 가장 강력한 XSLT 디자인 패턴입니다. –

0

당신은 이미 당신은 또한 문서 끝나기 전에 세 닫는 태그 / 누락이있는 match=""

의 생년월일 (DateOfBirth)을 선택하고 있기 때문에 그것은

<FullDate><xsl:value-of select="."/></FullDate> 

을해야하고, 네임 스페이스 이름이 잘못되었습니다 절대 URI이어야하기 때문입니다.

행운을 빈다.