使用 XSLT 分组、过滤和映射特定元素
Grouping , Filter and map particular elements using XSLT
您好,我尝试使用单个 XSLT 转换进行复杂映射。但是我试了for-each和apply-templates,都达不到要求。
条件如下
1)通过连接 Firstname、Lastname 和 DeptNo 对员工元素进行分组
2) 在独特的员工元素中如果主要联系人是 'Y' 将相应的记录手机号码映射到目标
3) 如果不存在值为 'Y' 的 PrimaryConcat 元素,则从员工记录映射手机号码,其中 PrimaryConcat 值为 'N'
4)如果'Y'和'N'都不存在,不要映射手机号码
输入的地址、联系方式等将有超过百万的员工元素。我这里只举了一个手机号码的例子。
谢谢
输入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>
假设使用像 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
不是你想要的结果样本,我不确定是我没有完全理解你的要求还是那个样本是错误的。
您好,我尝试使用单个 XSLT 转换进行复杂映射。但是我试了for-each和apply-templates,都达不到要求。
条件如下
1)通过连接 Firstname、Lastname 和 DeptNo 对员工元素进行分组
2) 在独特的员工元素中如果主要联系人是 'Y' 将相应的记录手机号码映射到目标
3) 如果不存在值为 'Y' 的 PrimaryConcat 元素,则从员工记录映射手机号码,其中 PrimaryConcat 值为 'N'
4)如果'Y'和'N'都不存在,不要映射手机号码
输入的地址、联系方式等将有超过百万的员工元素。我这里只举了一个手机号码的例子。
谢谢
输入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>
假设使用像 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
不是你想要的结果样本,我不确定是我没有完全理解你的要求还是那个样本是错误的。