使用XSLT对特定元素进行分组,过滤和映射

时间:2015-06-26 12:47:39

标签: xml xslt mapping

您好我尝试使用单个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>

1 个答案:

答案 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与您想要的结果样本不同,我不确定我是否完全理解您的要求或该样本是否错误。