Объедините два XML с общими полями и добавьте поля из обоих xmls, используя XSLT - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть два xmls

  1. a.xml
  2. b.xml

Ниже приведен файл a.xml

<proj_details>
    <proj_detail>
        <Username>Username</Username>
        <ID>ID</ID>
        <Place>Ocean</Place>
        <City>Urban</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>QoChiX5FlqU7VB2MKw5Aa</ID>
        <Place>Road</Place>
        <City>Rural</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>uzGjRVxnZPtB9sfiXtga</ID>
        <Place>Mud</Place>
        <City>SemiRural</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>YChiX5FluqhuyVB2OPw5Aa</ID>
        <Place>Sea</Place>
        <City>Sealine</City>
        <!-- some more fields -->
    </proj_detail>
    <proj_detail>
        <Username>abc@abc.com</Username>
        <ID>RD37oO2jgW5p6f76W8up</ID>
        <Place>Lane</Place>
        <City>Leftsidelane</City>
        <!-- some more fields -->
    </proj_detail>
    </proj_details>

    <!-- more fields    -->

и ниже - b.xml

    <FilebDetail>
        <Number>34</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>xyz@xyz.com</PROD>
        <ID>QoChiX5FlqU7VB2MKw5Aa</ID>
        <Name>Directory/notepad</Name>
        <Count>43</Count>
        <time>43550.53333336</time>
        <!-- some more fields-->
    </FilebDetail>
    <FilebDetail>
        <Number>35</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>uzGjRVxnZPtB9sfiXtga</ID>
        <Name>Speed/morning</Name>
        <Count>42</Count>
        <time>43550.5778</time>
        <!-- some more fields-->
    </FilebDetail>
    <FilebDetail>
        <Number>31</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>RD37oO2jgW5p6f76W8up</ID>
        <Name>Weatherincity</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <!-- some more fields-->
    </FilebDetail>

    </FilebDetails>

Теперь я хочу получить вывод примерно как ниже

        <proj_detail>
        <Number>34</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>xyz@xyz.com</PROD>
        <ID>QoChiX5FlNyqe1FuqU7VB2M</ID>
        <Name>Directory/notepad</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <Place>Road</Place>
        <City>Rural</City>
         <!-- some more fields -->
        </proj_detail>

        <proj_detail>
        <Number>35</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>uzGjRVxnxmP00zrnZPtB9sM</ID>
        <Name>Speed/morning</Name>
        <Count>42</Count>
        <time>43550.5778</time>
        <Place>Mud</Place>
        <City>SemiRural</City>
        </proj_detail>
         <!-- some more fields -->
        <proj_detail>
        <Number>31</Number>
        <CONS>abc@abc.com</CONS>
        <PROD>cvb@cvb.com</PROD>
        <ID>RD37oO2jg4rlerxW5p6f76</ID>
        <Name>Weatherincity</Name>
        <Count>12</Count>
        <time>43550.498611111114</time>
        <Place>Lane</Place>
        <City>Leftsidelane</City>
        </proj_detail>
        <!-- some more fields -->
        </proj_details>

В обоих файлах идентификатор является общим, и это то, что нужно сравнивать.После того, как оно будет сравнено, мы должны напечатать соответствующие поля из обоих файлов.

Я довольно новичок в xslt.Любая версия xslt будет в порядке.

Любое руководство в этом было бы очень полезно.

Спасибо

1 Ответ

0 голосов
/ 25 апреля 2019

Если у вас отношения один-к-одному, объединение будет простым.Запуск этой таблицы стилей XSLT 2.0 с a.xml в качестве ввода и b.xml в качестве параметра:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
    <xsl:param name="update"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
    </xsl:template>

    <xsl:template match="proj_detail">
        <xsl:copy>
            <xsl:apply-templates select="@*|node()"/>
            <xsl:apply-templates 
              select="$update/FilebDetails/FilebDetail[ID = current()/ID]/(* except ID)"/>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

Примечание: Вы должны быть осторожны с механизмом, который ваш процессор XSLT передает дляузлы в качестве параметров, в противном случае вам нужно будет использовать функцию document().

Из этого базового преобразования вы можете добавить оптимизации, например, использование функции key() (вам придется использовать XSLT 2.0 -arity 3- key() функция).Также вы можете объявить этот ключ по ID и имени поля, предполагая, что параметр $update является потоком обновления, и, таким образом, вы будете выбирать последние и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...