Объединение различных сложных данных с использованием XSLT 1.0 XML - PullRequest
1 голос
/ 07 августа 2011
   <?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 По моему мнению, эти данные полностью отличаются (более сложны) от вышеуказанного вопроса, поэтому я создаю новый вопрос здесь.

Мысм. данные <Customer-ID>Cus-ID3</Customer-ID> & <Customer-ID>Cus-ID5</Customer-ID> принадлежат одному и тому же человеку, потому что один из его адресов электронной почты совпадает.Как я могу объединить эти 2 контакта в один контакт?

Другая проблема, <Customer-ID>Cus-ID7</Customer-ID> & <Customer-ID>Cus-ID9</Customer-ID>, также принадлежит другому человеку.Здесь у нее два разных электронных письма, но в обоих сообщениях значения

FirstName и LastName совпадают.Как я могу объединить эти 2 контакта в один контакт?

Можно ли объединить эти сложные данные?

Мне нужен такой вывод с использованием 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>

Пожалуйста, скажите мне, есть ли какой-либо недостаток в моем вопросе.Большое спасибо.Примечание. Отображаемый здесь адрес электронной почты является повторяющимся значением.

1 Ответ

2 голосов
/ 07 августа 2011

По запросу, здесь таблица стилей, которая работает следующим образом:

  • объединяет узлы, для которых по крайней мере EMail соответствует
  • во время объединения, FirstName и SecondName копируются с первого узла всегда
  • узлы без соответствия EMail копируются как
  • узлы без EMail узлы копируются как есть

[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, представленному в вопросе, он создает:

<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...