2013-04-24 3 views
1

XML의 다른 구조로 변환해야하는 xml이 있습니다. 나는 여러 방법을 시도했지만 성공하지 못했습니다. xslt 1.0을 사용해야합니다. 질문을했지만 물어 보니 형식이 바뀝니다.요청한 XML로 변환하는 방법

입력 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<PersonBody> 
    <Person> 
     <D>Name</D> 
     <D>Surname</D> 
     <D>Id</D> 
    </Person> 
    <PersonValues> 
     <D>Michael</D> 
     <D>Jackson</D> 
     <D>01</D> 
    </PersonValues> 
    <PersonValues> 
     <D>James</D> 
     <D>Bond</D> 
     <D>007</D> 
    </PersonValues> 
    <PersonValues> 
     <D>Kobe</D> 
     <D>Bryant</D> 
     <D>24</D> 
    </PersonValues> 
</PersonBody> 

필수 출력 :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<PersonBody> 
    <Persons> 
     <Person> 
      <Name>Michael</Name> 
      <Surname>Jackson</Surname> 
      <Id>1</Id> 
     </Person> 
     <Person> 
      <Name>James</Name> 
      <Surname>Bond</Surname> 
      <Id>007</Id> 
     </Person> 
     <Person> 
      <Name>Kobe</Name> 
      <Surname>Bryant</Surname> 
      <Id>24</Id> 
     </Person> 
    </Persons> 
</PersonBody> 

답변

1

이 그것을 수행해야합니다

샘플 입력에서 실행
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/> 
    <xsl:key name="kColumnName" match="Person/*" 
      use="count(preceding-sibling::*)" /> 

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

    <xsl:template match="/*"> 
    <xsl:copy> 
     <Persons> 
     <xsl:apply-templates select="PersonValues" /> 
     </Persons> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="PersonValues"> 
    <Person> 
     <xsl:apply-templates select="*" /> 
    </Person> 
    </xsl:template> 

    <xsl:template match="PersonValues/*"> 
    <xsl:element name="{key('kColumnName', position() - 1)}"> 
     <xsl:apply-templates /> 
    </xsl:element> 
    </xsl:template> 
</xsl:stylesheet> 

, 결과는 다음과 같습니다

<PersonBody> 
    <Persons> 
    <Person> 
     <Name>Michael</Name> 
     <Surname>Jackson</Surname> 
     <Id>01</Id> 
    </Person> 
    <Person> 
     <Name>James</Name> 
     <Surname>Bond</Surname> 
     <Id>007</Id> 
    </Person> 
    <Person> 
     <Name>Kobe</Name> 
     <Surname>Bryant</Surname> 
     <Id>24</Id> 
    </Person> 
    </Persons> 
</PersonBody> 
+0

당신은 @ JLRishe입니다. 그것은 작동합니다. 감사 – dcgulse

관련 문제