Удалить повторяющиеся записи из XML с помощью Xslt - PullRequest
1 голос
/ 23 декабря 2010
<LISTINGS>
<LISTING LISTING_ID="123456789">
    <NAME1>1</NAME1>
    <NAME1>1</NAME1>
    <NAME1>13</NAME1>
    <NAME1>13</NAME1>
    <NAME1>12</NAME1>
    <NAME1>100</NAME1>
    <NAME1>sumit is testing</NAME1>
    <NAME1>TEST IT</NAME1>
</LISTING>

<LISTING LISTING_ID="987654321">
    <NAME1>3</NAME1>
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>

<LISTING LISTING_ID="5656566565">
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>
</LISTINGS>

Вывод должен быть

<LISTINGS>
<LISTING LISTING_ID="123456789">
    <NAME1>1</NAME1>
    <NAME1>13</NAME1>
    <NAME1>12</NAME1>
    <NAME1>100</NAME1>
    <NAME1>sumit is testing</NAME1>
    <NAME1>TEST IT</NAME1>
</LISTING>

<LISTING LISTING_ID="987654321">
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>

<LISTING LISTING_ID="5656566565">
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>
</LISTINGS>

Ответы [ 2 ]

1 голос
/ 23 декабря 2010

Использование метода Мюнхена для группировки :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:key name="kListNameByVal" match="LISTING/NAME1"
  use="concat(generate-id(..),'+',.)"/>

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

 <xsl:template match=
 "NAME1
   [not(generate-id()
       =
        generate-id(key('kListNameByVal',
                        concat(generate-id(..),'+',.)
                        )
                        [1]
                    )
        )
   ]
 "/>
</xsl:stylesheet>

при применении к предоставленному документу XML :

<LISTINGS>
<LISTING LISTING_ID="123456789">
    <NAME1>1</NAME1>
    <NAME1>1</NAME1>
    <NAME1>13</NAME1>
    <NAME1>13</NAME1>
    <NAME1>12</NAME1>
    <NAME1>100</NAME1>
    <NAME1>sumit is testing</NAME1>
    <NAME1>TEST IT</NAME1>
</LISTING>

<LISTING LISTING_ID="987654321">
    <NAME1>3</NAME1>
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>

<LISTING LISTING_ID="5656566565">
    <NAME1>3</NAME1>
    <NAME1>4</NAME1>
</LISTING>
</LISTINGS>

желаемый, правильный результат получается :

<LISTINGS>
   <LISTING LISTING_ID="123456789">
      <NAME1>1</NAME1>
      <NAME1>13</NAME1>
      <NAME1>12</NAME1>
      <NAME1>100</NAME1>
      <NAME1>sumit is testing</NAME1>
      <NAME1>TEST IT</NAME1>
   </LISTING>
   <LISTING LISTING_ID="987654321">
      <NAME1>3</NAME1>
      <NAME1>4</NAME1>
   </LISTING>
   <LISTING LISTING_ID="5656566565">
      <NAME1>3</NAME1>
      <NAME1>4</NAME1>
   </LISTING>
</LISTINGS>
1 голос
/ 23 декабря 2010

Эта таблица стилей:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:key name="kElementByListingIdAndValue"
             match="LISTING/*"
             use="concat(../@LISTING_ID,'+',.)"/>
    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*"/>
        </xsl:copy>
    </xsl:template>
    <xsl:template match="LISTING/*[count(.|key('kElementByListingIdAndValue',
                                               concat(../@LISTING_ID,
                                                      '+',
                                                      .)
                                              )[1]) != 1]"/>
</xsl:stylesheet>

Выход:

<LISTINGS>
    <LISTING LISTING_ID="123456789">
        <NAME1>1</NAME1>
        <NAME1>13</NAME1>
        <NAME1>12</NAME1>
        <NAME1>100</NAME1>
        <NAME1>sumit is testing</NAME1>
        <NAME1>TEST IT</NAME1>
    </LISTING>
    <LISTING LISTING_ID="987654321">
        <NAME1>3</NAME1>
        <NAME1>4</NAME1>
    </LISTING>
    <LISTING LISTING_ID="5656566565">
        <NAME1>3</NAME1>
        <NAME1>4</NAME1>
    </LISTING>
</LISTINGS>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...