2017-10-18 9 views
1

내 XML 입력이 : 그 직원 21,002 두 개의 노드가병합 XML 노드

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Row> 
     <EmployeeID>21001</EmployeeID> 
     <FMLAStartDate>2017-10-10</FMLAStartDate> 
     <FMLAEndDate></FMLAEndDate> 
     <FMLACorrectDate></FMLACorrectDate> 
     <LTDStartDate></LTDStartDate> 
     <LTDEndDate></LTDEndDate>  
     <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
     <EmployeeID>21002</EmployeeID> 
     <FMLAStartDate>2017-10-10</FMLAStartDate> 
     <FMLAEndDate></FMLAEndDate> 
     <FMLACorrectDate></FMLACorrectDate> 
     <LTDStartDate></LTDStartDate> 
     <LTDEndDate></LTDEndDate>  
     <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
     <EmployeeID>21002</EmployeeID> 
     <FMLAStartDate></FMLAStartDate> 
     <FMLAEndDate></FMLAEndDate> 
     <FMLACorrectDate></FMLACorrectDate> 
     <LTDStartDate></LTDStartDate> 
     <LTDEndDate>2017-10-08</LTDEndDate>  
     <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
     <EmployeeID>21003</EmployeeID> 
     <FMLAStartDate></FMLAStartDate> 
     <FMLAEndDate></FMLAEndDate> 
     <FMLACorrectDate></FMLACorrectDate> 
     <LTDStartDate>2017-05-01</LTDStartDate> 
     <LTDEndDate></LTDEndDate>  
     <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
     <EmployeeID>21004</EmployeeID> 
     <FMLAStartDate></FMLAStartDate> 
     <FMLAEndDate></FMLAEndDate> 
     <FMLACorrectDate>2017-01-10</FMLACorrectDate> 
     <LTDStartDate></LTDStartDate> 
     <LTDEndDate></LTDEndDate>  
     <LTDCorrectdate></LTDCorrectdate> 
    </Row> 
</Root> 

주, 하나 LTD 종료 날짜를 들고 FMLA 시작 날짜를 잡고 다른. 사후 XSLT 변환 기대는 직원 ID 당 하나의 행 노드를 가지며이 행 노드는 해당 직원 ID에 대한 전체 정보를 보유해야합니다. 따라서 예상 출력은 다음과 같습니다.

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Row> 
    <EmployeeID>21001</EmployeeID> 
    <FMLAStartDate>2017-10-10</FMLAStartDate> 
    <FMLAEndDate></FMLAEndDate> 
    <FMLACorrectDate></FMLACorrectDate> 
    <LTDStartDate></LTDStartDate> 
    <LTDEndDate></LTDEndDate>  
    <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
    <EmployeeID>21002</EmployeeID> 
    <FMLAStartDate>2017-10-10</FMLAStartDate> 
    <FMLAEndDate></FMLAEndDate> 
    <FMLACorrectDate></FMLACorrectDate> 
    <LTDStartDate></LTDStartDate> 
    <LTDEndDate>2017-10-08</LTDEndDate>  
    <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
    <EmployeeID>21003</EmployeeID> 
    <FMLAStartDate></FMLAStartDate> 
    <FMLAEndDate></FMLAEndDate> 
    <FMLACorrectDate></FMLACorrectDate> 
    <LTDStartDate>2017-05-01</LTDStartDate> 
    <LTDEndDate></LTDEndDate>  
    <LTDCorrectdate></LTDCorrectdate> 
    </Row> 

    <Row> 
    <EmployeeID>21004</EmployeeID> 
    <FMLAStartDate></FMLAStartDate> 
    <FMLAEndDate></FMLAEndDate> 
    <FMLACorrectDate>2017-01-10</FMLACorrectDate> 
    <LTDStartDate></LTDStartDate> 
    <LTDEndDate></LTDEndDate>  
    <LTDCorrectdate></LTDCorrectdate> 
    </Row> 
</Root> 

직원 ID 기반 그룹화를 위해 for-each-group을 시도했지만 올바른 출력을 제공하지 않습니다. 아무도 이것으로 나를 도울 수 있습니까? XSLT에 대한 기본적인 지식을 가지고 있지만 고급 XSLT 기능을 사용하지는 못했습니다.

감사합니다.

+0

코드를 표시하지 않으면 코드에서 버그를 찾을 수 없습니다. –

답변

0

당신은 그룹 행과 CONCAT 각 필드에 대한 모든 값을 수 있습니다

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> 
    <xsl:template match="/Root"> 
    <xsl:for-each-group select="Row" group-by="EmployeeID"> 
     <Row> 
     <EmployeeID> 
      <xsl:value-of select="current-grouping-key()"/> 
     </EmployeeID> 
     <FMLAStartDate> 
      <xsl:value-of select="current-group()/FMLAStartDate"/> 
     </FMLAStartDate> 
     <FMLAEndDate> 
      <xsl:value-of select="current-group()/FMLAEndDate"/> 
     </FMLAEndDate> 
     <FMLACorrectDate> 
      <xsl:value-of select="current-group()/FMLACorrectDate"/> 
     </FMLACorrectDate> 
     <LTDStartDate> 
      <xsl:value-of select="current-group()/LTDStartDate"/> 
     </LTDStartDate> 
     <LTDEndDate> 
      <xsl:value-of select="current-group()/LTDEndDate"/> 
     </LTDEndDate> 
     <LTDCorrectdate> 
      <xsl:value-of select="current-group()/LTDCorrectdate"/> 
     </LTDCorrectdate> 
     </Row> 
    </xsl:for-each-group> 
    </xsl:template> 
</xsl:stylesheet> 
+0

정말 고마워요! –

0

내가 할 것

입니다
<xsl:template match="/Root"> 
    <xsl:for-each-group select="Row" group-by="EmployeeID"> 
     <Row> 
     <xsl:for-each-group select="current-group()/*" 
          group-by="node-name()"> 
      <xsl:copy-of select="(current-group()[normalize-space()], 
           current-group()[not(normalize-space()])[1]"/> 
     </Row> 
    </xsl:for-each-group> 
    </xsl:template> 

: 같은 직원 ID, 출력을위한 직원 기록의 각 그룹에 대한 그룹의 직원 요소 중 일부 또는 전체에있는 각 요소에 대해 이들 중 하나의 사본을 출력하여 비어 있지 않은 내용이있는 요소를 우선 설정합니다.