【问题标题】:Grouping , Filter and map particular elements using XSLT使用 XSLT 对特定元素进行分组、过滤和映射
【发布时间】:2015-09-13 10:20:56
【问题描述】:

您好,我尝试使用单个 XSLT 转换进行复杂映射。但是我尝试了for-each和apply-templates,甚至都达不到要求。

以下是条件。

1) 通过连接 Firstname、Lastname 和 DeptNo 对员工元素进行分组

2) 在唯一的员工元素中,如果主要联系人是“Y”,则将相应的记录手机号码映射到目标

3) 如果不存在具有“Y”值的 PrimaryConcat 元素,则从 PrimaryConcat 值为“N”的员工记录中映射手机号码

4) 如果“Y”和“N”都不存在,则不要映射手机号码

将有超过一百万个 Employee 元素进入输入,包括地址、联系方式等。我在这里仅举了一个带有手机号码的示例。

谢谢

输入 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>

【问题讨论】:

    标签: xml xslt mapping


    【解决方案1】:

    假设像 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 与您想要的结果样本不符,我不确定我是否没有完全理解您的要求或该样本是否错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多