Удаление дублирующихся значений в узлах с использованием XSLT - PullRequest
0 голосов
/ 04 мая 2018

у меня ниже XML:

<?xml version="1.0" encoding="utf-8" ?>
<SLOCDETAILS>
    <INPUT>
    </INPUT>
    <TABLES>
        <OUTPUT>
            <item>
                <PLANT>INDIA</PLANT>
                <SLOC>T150</SLOC>
                <MATNR>220250</MATNR>
                <CHARG>112233</CHARG>
            </item>
            <item>
                <PLANT>INDIA</PLANT>
                <SLOC>T152</SLOC>
                <MATNR>220250</MATNR>
                <CHARG>223344</CHARG>
            </item>
            <item>
                <PLANT>INDIA</PLANT>
                <SLOC>T152</SLOC>
                <MATNR>220250</MATNR>
                <CHARG>445566</CHARG>
            </item>
            <item>
                <PLANT>INDIA</PLANT>
                <SLOC>T152</SLOC>
                <MATNR>220250</MATNR>
                <CHARG>667788</CHARG>
            </item>
            <item>
                <PLANT>INDIA</PLANT>
                <SLOC>T152</SLOC>
                <MATNR>220250</MATNR>
                <CHARG>998877</CHARG>
            </item>
        </OUTPUT>
    </TABLES>
</SLOCDETAILS>

Мой XSLT выглядит следующим образом:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xalan="http://xml.apache.org/xalan" version="1.0">
    <xsl:template match="/">
        <Rowsets>
            <Rowset Name="List">
                <xsl:for-each select="SLOCDETAILS/TABLES/OUTPUT/item">
                    <Row>
                        <PLANT>
                            <xsl:value-of select="PLANT"/>
                        </PLANT>
                        <SLOC>
                            <xsl:value-of select="SLOC"/>
                        </SLOC>
                        <Material>
                            <xsl:value-of select="MATNR"/>
                        </Material>
                        <Batch>
                            <xsl:value-of select="CHARG"/>
                        </Batch>
                    </Row>
                </xsl:for-each>
            </Rowset>
        </Rowsets>
    </xsl:template>
</xsl:stylesheet>

Мой результирующий XML:

<?xml version="1.0" encoding="utf-8"?>
<Rowsets>
    <Rowset Name="List">
        <Row>
            <PLANT>INDIA</PLANT>
            <SLOC>T150</SLOC>
            <Material>220250</Material>
            <Batch>112233</Batch>
        </Row>
        <Row>
            <PLANT>INDIA</PLANT>
            <SLOC>T152</SLOC>
            <Material>220250</Material>
            <Batch>223344</Batch>
        </Row>
        <Row>
            <PLANT>INDIA</PLANT>
            <SLOC>T152</SLOC>
            <Material>220250</Material>
            <Batch>445566</Batch>
        </Row>
        <Row>
            <PLANT>INDIA</PLANT>
            <SLOC>T152</SLOC>
            <Material>220250</Material>
            <Batch>667788</Batch>
        </Row>
        <Row>
            <PLANT>INDIA</PLANT>
            <SLOC>T152</SLOC>
            <Material>220250</Material>
            <Batch>998877</Batch>
        </Row>
    </Rowset>
</Rowsets>

Теперь я хочу только SLOC, которые уникальны. Таким образом, для этого XML SLOC, который должен быть заполнен, должен быть <SLOC>T150</SLOC> & <SLOC>T152</SLOC>

<SLOC>T152</SLOC> повторяется 4 раза. я хочу избежать этого.

Как мне добиться этого с помощью XSLT?

Я уверен, что есть способ группировки, который можно использовать. Также предоставляет ли XSLT функцию с отличным значением, которую мы можем подключить и воспроизвести? Различные подходы к решению этой проблемы будут очень полезны.

Спасибо!

1 Ответ

0 голосов
/ 04 мая 2018

Попробуйте:

<xsl:template match="/">
  <Rowsets>
    <Rowset Name="List">
      <xsl:for-each select="SLOCDETAILS/TABLES/OUTPUT/item[not(SLOC = preceding-sibling::item/SLOC)]">
        <Row>
          <PLANT>
            <xsl:value-of select="PLANT"/>
          </PLANT>
          <SLOC>
            <xsl:value-of select="SLOC"/>
          </SLOC>
          <Material>
            <xsl:value-of select="MATNR"/>
          </Material>
          <Batch>
            <xsl:value-of select="CHARG"/>
          </Batch>
        </Row>
      </xsl:for-each>
    </Rowset>
  </Rowsets>
 </xsl:template>
...