使用XSLT相同的子节点值合并XML节点
问题描述:
我的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功能。
谢谢!
答
可以组行和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
非常感谢! –
答
我会做
<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,输出一行,并且对于组中任何或所有员工元素中存在的每个元素,输出其中一个元素的副本,优先选择那些具有非空内容的副本。
除非您向我们展示代码,否则我们无法找到代码中的错误。 –