您好我尝试使用单个XSLT转换进行复杂映射。但我尝试了 - 每个和应用模板,甚至无法接近要求。
以下是条件。
1)通过连接Firstname,Lastname和DeptNo
来分组员工元素2)在唯一的员工元素中如果主要联系人是“Y”,则将相应的记录移动号码映射到目标
3)如果不存在具有“Y”值的PrimaryConcat元素,则从员工记录中映射移动号码,其中PrimaryConcat值为“N”
4)如果“Y”和“N”都不存在,则不要映射手机号码
输入中将有超过百万个员工元素,其中包含地址,联系方式等。我在这里仅举例说明了手机号码。
由于
INPUT XML
<Employees>
<Employee>
<PrimaryContact>Y</PrimaryContact>
<Name>
<FirstName>Paul</FirstName>
<LastName>Hecht</LastName>
</Name>
<DeptNo>10008072</DeptNo>
<MobNo>78952646</MobNo>
</Employee>
<Employee>
<PrimaryContact>N</PrimaryContact>
<endDate>0001-01-15T00:00:00.000Z</endDate>
<Name>
<FirstName>Paul</FirstName>
<LastName>Hecht</LastName>
</Name>
<DeptNo>10008072</DeptNo>
<MobNo>54646544</MobNo>
</Employee>
<Employee>
<PrimaryContact/>
<Name>
<FirstName>Chris</FirstName>
<LastName>Grey</LastName>
</Name>
<DeptNo>10001760</DeptNo>
<MobNo>1378956</MobNo>
</Employee>
<Employee>
<PrimaryContact>N</PrimaryContact>
<Name>
<FirstName>Chris</FirstName>
<LastName>Grey</LastName>
</Name>
<DeptNo>10001760</DeptNo>
<MobNo>78941236</MobNo>
</Employee>
<Employee>
<PrimaryContact/>
<Name>
<FirstName>Jessica</FirstName>
<LastName>Thruman</LastName>
</Name>
<DeptNo>10008022</DeptNo>
<MobNo>7895264446</MobNo>
</Employee>
<Employee>
<PrimaryContact/>
<Name>
<FirstName>Jessica</FirstName>
<LastName>Thruman</LastName>
</Name>
<DeptNo>10008022</DeptNo>
<MobNo>5464786544</MobNo>
</Employee>
</Employees>
预期输出
<Employees>
<Employee>
<Name>
<FirstName>Paul</FirstName>
<LastName>Hecht</LastName>
</Name>
<MobNo>78952646</MobNo>
</Employee>
<Employee>
<Name>
<FirstName>Chris</FirstName>
<LastName>Grey</LastName>
</Name>
<MobNo>78941236</MobNo>
</Employee>
<Employee>
<Name>
<FirstName>Jessica</FirstName>
<LastName>Thruman</LastName>
</Name>
<MobNo/>
</Employee>
</Employees>
答案 0 :(得分:0)
假设像Saxon 9这样的XSLT 2.0处理器我尝试将您的描述实现为http://xsltransform.net/bdxtqL/1
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<xsl:output method="xml" encoding="UTF-8" indent="yes" />
<xsl:template match="Employees">
<xsl:copy>
<xsl:for-each-group select="Employee" group-by="string-join((Name/(FirstName, LastName), DeptNo), '|')">
<xsl:copy>
<xsl:copy-of select="Name"/>
<MobNo>
<xsl:value-of select="(current-group()[PrimaryContact = 'Y']/MobNo, current-group()[PrimaryContact = 'N']/MobNo)[1]"/>
</MobNo>
</xsl:copy>
</xsl:for-each-group>
</xsl:copy>
</xsl:template>
</xsl:transform>
其中一个MobNo
与您想要的结果样本不同,我不确定我是否完全理解您的要求或该样本是否错误。