2017-10-18 182 views
1

我的XML输入:使用XSLT相同的子节点值合并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> 

注意,员工21002有两个节点,一个拿着FMLA开始日期和其他持有LTD结束日期。 Post 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分组,但它没有给出正确的输出。任何人都可以帮助我吗?我有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,输出一行,并且对于组中任何或所有员工元素中存在的每个元素,输出其中一个元素的副本,优先选择那些具有非空内容的副本。

相关问题