使用 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不是你想要的结果样本,我不确定是我没有完全理解你的要求还是那个样本是错误的。