2017-10-24 15 views
0

하나의 구조체의 XML을 다른 구조체로 변환해야하는 프로젝트에서 작업 중입니다. 다른 노드 내부에서 노드를 횡단하는 문제에 봉착했습니다. 내 프로젝트가 많은 요소와 속성을 포함하기 때문에 샘플 입력 및 출력 XML 파일을 만들었습니다. 그들은 아래에 주어집니다.하나의 XML 구조를 XSL을 사용하여 다른 XML 구조로 변환

input.xml :

<GENERIC_SYSTEM_PARAMETERS> 
    <Companies> 
     <Company ID="10" Name="Cmp_1"/> 
     <Company ID="20" Name="Cmp_2"/> 
     <Company ID="30" Name="Cmp_3"/> 
    </Companies> 
    <Persons> 
     <Person id="1"> 
      <Company_ID>10</Company_ID> 
      <Age>30</Age> 
     </Person> 
     <Person id="2"> 
      <Company_ID>10</Company_ID> 
      <Age>40</Age> 
     </Person> 
     <Person id="3"> 
      <Company_ID>20</Company_ID> 
      <Age>50</Age> 
     </Person> 
    </Persons> 
</GENERIC_SYSTEM_PARAMETERS> 

output.xml :

<Main> 
    <Companies> 
     <Company id="10" Name="Cmp_1"> 
      <Employees> 
       <Employee id="1"> 
        <Age>30</Age>     
       </Employee> 
       <Employee id="2"> 
        <Age>40</Age>     
       </Employee> 
      </Employees> 
     </Company> 
     <Company id="20" Name="Cmp_2"> 
      <Employees> 
       <Employee id="3"> 
        <Age>50</Age>     
       </Employee> 
      </Employees> 
     </Company> 
    </Companies> 
</Main> 

나에게 더 이상 진행하기 위해 몇 가지 아이디어/샘플 XSL 파일을 제공하십시오.

미리 감사드립니다.

<xsl:template match="Company"> 
    <xsl:copy> 
    <xsl:apply-templates select="@*"/> 
    <Employees> 
     <xsl:apply-templates select="../../Persons/Person[Company_ID = current()/@ID]"/> 
    </Employees> 
    </xsl:copy> 
</xsl:template> 

을 필요에 따라 소스에 Person 노드에서 Employee 노드를 생성하는 템플릿을 추가

+1

여기서 'xsl : key'를 사용하면 도움이 될 수 있지만 문제가있는 경우 현재 시도한 코드를 게시해야합니다. 고맙습니다! –

+2

더 진행하려면 XSLT에서 작성하려는 변환에 대해 생각해보십시오. 행운을 빕니다! –

답변

0

설명부터 시작해 보겠습니다.

템플릿 일치 GENERIC_SYSTEM_PARAMETERS은 신원 템플릿 인 과 거의 유사하지만 요소 이름을 변경합니다.

템플릿 일치는 회사은 로직의 주요 부분을 포함합니다. 직원이없는 회사를 "차단"하려면 직원 수를 으로 확인합니다.

수는 긍정적 인 경우 :

  • 복사 원 개구 태그
  • 사본 자체 특성 (적용 템플릿)
  • 직원 소자 열리고
  • 그 안에는 각 직원이 인쇄되지만 일부 변경 사항이 있습니다 (아래 참조).

사람 일치하는 템플릿은 논리의 또 다른 중요한 부분 가 포함되어 있습니다. 그것은 :

  • 는 태그 이름을 변경,
  • 사본 자신의 특성,
  • 만 복사 하위 나이 요소이 복사되지 않도록 COMPANY_ID.

사람 템플레이트 매칭 실제로 아무런 식별 템플릿이 요소 "정상"처리를 차단하지 않는다.

여기 전체 스크립트입니다.

<?xml version="1.0" encoding="UTF-8" ?> 
<xsl:transform version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" omit-xml-declaration="yes" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="GENERIC_SYSTEM_PARAMETERS"> 
    <Main><xsl:apply-templates select="*"/></Main> 
    </xsl:template> 

    <xsl:template match="Company"> 
    <xsl:variable name="myEmploees" select="../../Persons/Person[Company_ID = current()/@ID]"/> 
    <xsl:if test="count($myEmploees) &gt; 0"> 
     <xsl:copy> 
     <xsl:apply-templates select="@*"/> 
     <Employees> 
      <xsl:apply-templates select="../../Persons/Person[Company_ID = current()/@ID]"/> 
     </Employees> 
     </xsl:copy> 
    </xsl:if> 
    </xsl:template> 

    <xsl:template match="Persons"/> 

    <xsl:template match="Person"> 
    <Employee> 
     <xsl:apply-templates select="@*|Age"/> 
    </Employee> 
    </xsl:template> 

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

대단히 감사합니다. 이 논리는 나에게 유용하다. – VinayCH