2015-06-26 29 views
0

您好我尝试使用单个XSLT转换来执行复杂的映射。但是我尝试了每一种和应用模板,甚至无法接近要求。使用XSLT对特定元素进行分组,筛选和映射

以下是条件。

1)通过连接名字,姓氏和DEPTNO

2)在独特雇员元件如果主接触是“Y”移动电话号码映射对应记录到目标

3)如果PrimaryConcat组雇员元件如果'Y'和'N'不存在,则映射手机号码,其中PrimaryConcat值为'N'

4)如果'Y'和'N'都不存在,Dont映射手机号码

将会有超过100万个员工元素与地址,联系方式等进行输入。我仅在这里给出一个仅使用手机号码的例子。

由于

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

假设XSLT 2.0处理程序等撒克逊9 I试图执行你的描述为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与您所期望的结果样本不一样,我不确定我是否不完全了解您的要求或者该样本是否有误。