Объединение двух XML файлов с использованием XSL-преобразования - PullRequest
0 голосов
/ 03 марта 2020

Я пытался объединить два xml файла в другой XML с выходом обоих, объединенных с использованием XSL, но не смог. xml довольно большие, поэтому я включу только небольшую часть. Я действительно потерялся в этой задаче. Я могу преобразовать один XML файл, но объединить два - это то, чего я никогда не делал, и не могу найти много информации о нем, связанной с моим конкретным c случаем.

XML 1:

<Games>
    <Game>
        <Date>01/05/2019</Date>
        <PlayerID>454asdsad</PlayerID>
        <Place>1</Place>
        <GameID>CpsQf125AFy</GameID>
        <Payment currency="gbp">50</Payment>
    </Game>

    .....repeats the above many times with different values.
</Games>

XML 2:

<Players>
    <Player>
        <Title>Mr</Title>
        <Lastname>Doe</Lastname>
        <Firstname>John</Firstname>
        <IDnumber>454asdsad</IDnumber>
        <Address>Streetname</Address>
    </Player>

   .....repeats the above many times with different values.
</Players>

Ожидаемый результат:

<Games>
      <Place>
        <Date>
          <Game>
            <Title>Mr</prefix>
            <Lastname>Doe</Lastname>
            <Firstname>John</Firstname>
            <IDnumber>454asdsad</IDnumber>
            <Address>Streetname</Address>
            <Date>01/05/2019</Date>
            <PlayerID>454asdsad</Player>
            <Place>1</Place>
            <GameID>CpsQf125AFy</GameID>
            <Payment currency="gbp">50</Payment>
          </Game>
       </Date>

       <Date> ...if there are more dates is the same place as above.
          <Game>
               ....information
          </Game>
       </Date>

     </Place>

     <Place> ...another place
       <Date>
         <Game>
            ...all the information like above, with the appropriate next values from both XML's.
         </Game>
       </Date>

       <Date> ...if there are more dates is the same place as above.
         <Game>
              ....information
         </Game>
       <Date>
     </Place>

     ...repeats same thing and format until the end.
 </Games>

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Для этого есть две части:

  • группировка, сначала на месте, а затем в дату

  • объединение, извлечение данных из второй файл, выбранный personID.

Группировка в основном

<xsl:for-each-group select="Game" group-by="Place">
  <Place>
    <xsl:for-each-group select="current-group()" group-by="Date">
      <Date>
        <xsl:for-each select="current-group()">
          <Game>
             XXXXX
             <xsl:copy-of select="*"/>

И в XXXXX вам нужно выполнить объединение, которое в основном

<xsl:copy-of select="key('player-id', PlayerID, $players-xml')/*"/>

, где $ Players- xml является документом Players. xml, а ключ определяется как

<xsl:key name="player-id" match="Player" use="IDNumber"/>
1 голос
/ 04 марта 2020

Если вы знаете о for-each-group, то у вас не должно возникнуть проблем с извлечением элементов из обоих документов, например: <xsl:for-each-group select="/Games/Game, doc('file2.xml')/Players/Player" group-by="PlayerID, IDnumber">, ключ группировки будет иметь значение PlayerID там, где этот элемент существует, и IDnumber там, где существуют эти элементы до тех пор, пока нет элементов с обоими дочерними элементами, подход должен быть безопасным или может быть исправлен на group-by="(PlayerID, IDnumber)[1]" для выбора одной клавиши, если нет.

И если также необходимо сгруппировать по Place Вы можете вложить другой for-each-group select="current-group()" group-by="Place" или использовать составной ключ.

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