使用XSLT 1.0 XML合并不同的复杂数据 [英] Merging different complex data using XSLT 1.0 XML

查看:90
本文介绍了使用XSLT 1.0 XML合并不同的复杂数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

   <?xml version="1.0" encoding="windows-1250"?>
    <CONTACTS>
    <CONTACT>
    <Customer-ID>Cus-ID3</Customer-ID>
    <FirstName>Arnaaud</FirstName>
    <LastName>Forestier</LastName>
    <EMail>Arnaaud_Forestier201111@yahoo.fr</EMail>
    </CONTACT>

    <CONTACT>
    <Customer-ID>Cus-ID5</Customer-ID>
    <FirstName>Arun_Forestier</FirstName>
    <LastName>Forestier</LastName>
    <EMail>Arnaaud_Forestier201111@yahoo.fr</EMail>
    <EMail>Arnaaud_Forestier201111@gmail.com</EMail>
    </CONTACT>

    <CONTACT>
    <Customer-ID>Cus-ID7</Customer-ID>
    <FirstName>Aana</FirstName>
    <LastName>Edwards</LastName>
    <EMail>Aana.edwards@gmail.com</EMail>
    </CONTACT>

    <CONTACT>
    <Customer-ID>Cus-ID9</Customer-ID>
    <FirstName>Aana_Edwards</FirstName>
    <LastName>Edwards</LastName>
    <EMail>Aana.edwards@yahoo.com</EMail>
    </CONTACT>

     <CONTACT>
    <Customer-ID>Cus-ID11</Customer-ID>
    <FirstName>Lina</FirstName>
    <LastName>Joseph</LastName>
    <EMail>Lina.Joseph@aol.com</EMail>
    </CONTACT>

   <CONTACT>
    <Customer-ID>Cus-ID13</Customer-ID>
    <FirstName>SandfordFrankie</FirstName>
    <LastName>Frankie Sandford/LastName>
    <EMail>Sandford1233@yahoo.com</EMail>
    <URL>http://www.facebook.com/profile.php?id=122112487211054</URL>
    </CONTACT>

    <CONTACT>
    <Customer-ID>Cus-ID15</Customer-ID>
    <FirstName>Sandford</FirstName>
    <LastName>Frankie/LastName>
    <EMail>Sandford1233@yahoo.com</EMail>
    <EMail>Sandford.frankie@gmail.com</EMail>
    </CONTACT>

</CONTACTS>

上面的XML文件包含一些复杂的数据,这个问题可能看起来与此问题相似. 在XSLT1.0中对两个联系人进行分组和合并 据我说,这些数据与上述问题完全不同(更为复杂),所以我在这里创建一个新问题.

The above XML file has some complex data and this question might look similar to this question. Grouping and merging of two contacts in XSLT1.0 According to me this data is entirely different(more complex) from the above question, so i'm creating a new question here.

我们看到<Customer-ID>Cus-ID3</Customer-ID> & <Customer-ID>Cus-ID5</Customer-ID>数据属于同一个人 因为他的一位电子邮件地址是相同的.如何将这两个联系人合并为一个联系人?

We see the <Customer-ID>Cus-ID3</Customer-ID> & <Customer-ID>Cus-ID5</Customer-ID> data belongs to the same person because one of his email addess is same. How can I merge these 2 contacts as a single contact?

另一个问题,<Customer-ID>Cus-ID7</Customer-ID> & <Customer-ID>Cus-ID9</Customer-ID>也属于另一个人. 在这里,她有两封不同的电子邮件,但在两种情况下,

Another problem, <Customer-ID>Cus-ID7</Customer-ID> & <Customer-ID>Cus-ID9</Customer-ID> also belongs to another person. Here she has two different emails but in both the contatcs, the

名字&姓 是相同的值.如何将这两个联系人合并为一个联系人?

FirstName & LastName are same values. How can I merge these 2 contacts as a single contact?

是否可以合并这些复杂的数据?

Would it be possible to merge these complex data?

我需要使用XSLT-1.0这样的输出

I need an output like this using XSLT-1.0

<?xml version="1.0" encoding="windows-1250"?>
<CONTACTS>
    <CONTACT>
    <Customer-ID>Cus-ID5</Customer-ID>
        <FirstName>Arun_Forestier</FirstName>
        <LastName>Forestier</LastName>
        <EMail>Arnaaud_Forestier201111@yahoo.fr</EMail>
        <EMail>Arnaaud_Forestier201111@gmail.com</EMail>
    </CONTACT>


    <CONTACT>
    <Customer-ID>Cus-ID9</Customer-ID>
        <FirstName>Aana_Edwards</FirstName>
        <LastName>Edwards</LastName>
        <EMail>Aana.edwards@yahoo.com</EMail>
    <EMail>Aana.edwards@gmail.com</EMail>
    </CONTACT>

</CONTACTS>

请告诉我我的问题是否有任何缺陷.非常感谢你. 注意:此处显示的电子邮件地址是重复值.

Please tell me if there is any flaw in my question. Thank you very much. Note: The email address displayed here are duplicate values.

推荐答案

根据要求,此处的样式表的工作方式如下:

As requested, here a stylesheet that works as follows:

  • 合并至少匹配 Email 的节点
  • 在合并过程中,始终从第一个节点复制名字第二名字
  • 没有匹配 Email
  • 个节点照原样复制
  • 没有 Email 节点的
  • 个节点按原样复制
  • merges nodes for which at least an EMail is matching
  • during merge, FirstName and SecondName are copied from the first node always
  • nodes with no matching EMail are copied as is
  • nodes without EMail nodes are copied as is

[XSLT 1.0]

[XSLT 1.0]

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes"/>

    <xsl:key name="k_ContactsByEmail"
        match="CONTACTS/CONTACT"
        use="EMail"/>

    <xsl:template match="CONTACTS">
        <xsl:copy>
            <xsl:apply-templates select="CONTACT[generate-id()=
                generate-id(key('k_ContactsByEmail',EMail)[1])]
                |
                CONTACT[not(EMail)]"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="CONTACT">
        <xsl:copy>
            <xsl:copy-of select="*"/>
            <xsl:copy-of select="
                key('k_ContactsByEmail', EMail)/*
                    [not(.=current()/*)]
                    [not(self::FirstName or self::LastName or self::Customer-ID)]"/>
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

应用于问题中提供的XML输入时,它会产生:

When applied on the XML input provided in the question, it produces:

<CONTACTS>
   <CONTACT>
      <Customer-ID>Cus-ID3</Customer-ID>
      <FirstName>Arnaaud</FirstName>
      <LastName>Forestier</LastName>
      <EMail>Arnaaud_Forestier201111@yahoo.fr</EMail>
      <EMail>Arnaaud_Forestier201111@gmail.com</EMail>
   </CONTACT>
   <CONTACT>
      <Customer-ID>Cus-ID7</Customer-ID>
      <FirstName>Aana</FirstName>
      <LastName>Edwards</LastName>
      <EMail>Aana.edwards@gmail.com</EMail>
   </CONTACT>
   <CONTACT>
      <Customer-ID>Cus-ID9</Customer-ID>
      <FirstName>Aana_Edwards</FirstName>
      <LastName>Edwards</LastName>
      <EMail>Aana.edwards@yahoo.com</EMail>
   </CONTACT>
   <CONTACT>
      <Customer-ID>Cus-ID11</Customer-ID>
      <FirstName>Lina</FirstName>
      <LastName>Joseph</LastName>
      <EMail>Lina.Joseph@aol.com</EMail>
   </CONTACT>
   <CONTACT>
      <Customer-ID>Cus-ID13</Customer-ID>
      <FirstName>SandfordFrankie</FirstName>
      <LastName>Frankie Sandford</LastName>
      <EMail>Sandford1233@yahoo.com</EMail>
      <URL>http://www.facebook.com/profile.php?id=122112487211054</URL>
      <EMail>Sandford.frankie@gmail.com</EMail>
   </CONTACT>
</CONTACTS>

这篇关于使用XSLT 1.0 XML合并不同的复杂数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆