Удалить дубликаты из XML с помощью Xslt - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь помочь другу с проблемой, я ломаю голову несколько часов и не могу понять, мы пытаемся удалить дублирующиеся значения данных из этого ниже (транзакция_дата, не подарок)

XML Вход

<?xml version="1.0"?>
<transactions>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>1</giftShop>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>2</giftShop>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>3</giftShop>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>2</giftShop>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>3</giftShop>
    </transaction>
    <transaction>
        <transaction_date>02/11/2019</transaction_date>
        <giftShop>2</giftShop>
    </transaction>
    <transaction>
        <transaction_date>03/11/2019</transaction_date>
        <giftShop>3</giftShop>
    </transaction>
    <transaction>
        <transaction_date>01/11/2019</transaction_date>
        <giftShop>1</giftShop>
    </transaction>
    <transaction>
        <transaction_date>02/11/2019</transaction_date>
        <giftShop>3</giftShop>
    </transaction>
</transactions>

Xslt Вход

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="transactions">
  <h2>Transactions</h2>
      <xsl:for-each select="//transaction/giftShop[not(.=preceding::*)]">
      <tr>
        <xsl:element name="shop">
                    <xsl:attribute name="ID">
                        <xsl:value-of select="."/>
                    </xsl:attribute>
                    <xsl:variable name="currentShop">
                        <xsl:value-of select="."/>
                    </xsl:variable>
          <xsl:for-each select="//transaction[giftShop=$currentShop]/transaction_date[not(..=preceding::transaction_date)]">
                        <xsl:element name="Day">
                            <xsl:attribute name="Date">
                                <xsl:value-of select="."/>                      
                            </xsl:attribute>
                        </xsl:element>
                    </xsl:for-each>
                </xsl:element>
      </tr>
      </xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Желаемый выход

<h2>Transactions</h2>
<tr>
   <shop ID="1">
      <Day Date="01/11/2019"/>
   </shop>
</tr>
<tr>
   <shop ID="2">
      <Day Date="01/11/2019"/>
      <Day Date="02/11/2019"/>
   </shop>
</tr>
<tr>
   <shop ID="3">
      <Day Date="01/11/2019"/>
      <Day Date="03/11/2019"/>
      <Day Date="02/11/2019"/>
   </shop>
</tr>

Фактический выход

<h2>Transactions</h2>
<tr>
   <shop ID="1">
      <Day Date="01/11/2019"/>
      <Day Date="01/11/2019"/>
   </shop>
</tr>
<tr>
   <shop ID="2">
      <Day Date="01/11/2019"/>
      <Day Date="01/11/2019"/>
      <Day Date="02/11/2019"/>
      <Day Date="02/11/2019"/>
   </shop>
</tr>
<tr>
   <shop ID="3">
      <Day Date="01/11/2019"/>
      <Day Date="01/11/2019"/>
      <Day Date="03/11/2019"/>
      <Day Date="02/11/2019"/>
   </shop>
</tr>

Любой Помощь будет очень признательна, потому что она сводит меня с ума.

1 Ответ

0 голосов
/ 23 марта 2020

Я бы посоветовал вам попробовать его в следующем формате:

XSLT 2.0

<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

<xsl:template match="/transactions">
    <root>
        <xsl:for-each-group select="transaction" group-by="giftShop"> 
            <shop ID="{current-grouping-key()}">
                <xsl:for-each select="distinct-values(current-group()/transaction_date)">
                    <Day Date="{.}"/>                    
                </xsl:for-each>
            </shop>
        </xsl:for-each-group>
    </root>
</xsl:template>

</xsl:stylesheet>

Демо : https://xsltfiddle.liberty-development.net/pNmC4HN

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