ColdFox
ColdFox

Reputation: 43

XSL: Avoid duplicated nodes with different parents

I've a XML that looks like this

<list>
    <item>
        <name>A</name>
        <name>B</name>
        <name>C</name>
    </item>
    <item>
        <name>B</name>
    </item>
    <item>
        <name>B</name>
        <name>A</name>
    </item>
    <item>
        <name>B</name>
        <name>C</name>
        <name>A</name>
    </item>
</list>

And I need to get the elements without duplicated elements.

<items>
    <name>A</name>
    <name>B</name>
    <name>C</name>
</items>

Like this ^

Upvotes: 2

Views: 57

Answers (2)

helderdarocha
helderdarocha

Reputation: 23637

And here is a XSLT 1.0 solution, using Muenchian grouping:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"    version="1.0">
    <xsl:output indent="yes"/>

    <xsl:key name="unique-names" match="name" use="." />

    <xsl:template match="list">
        <items>
            <xsl:apply-templates 
                select="item/name[generate-id(key('unique-names', .)) = generate-id(.)]"/>
        </items>
    </xsl:template>

    <xsl:template match="name">
        <xsl:copy>
            <xsl:value-of select="."/> 
        </xsl:copy>
    </xsl:template>

</xsl:stylesheet>

Upvotes: 3

kjhughes
kjhughes

Reputation: 111561

XSLT 2.0 Solution

Use fn:distinct-values.

This XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
  <xsl:output method="xml" indent="yes"/>
  <xsl:template match="/">
    <items>
      <xsl:for-each select="distinct-values(//name)">
        <name>
          <xsl:value-of select="."/>
        </name>
      </xsl:for-each>
    </items>
  </xsl:template>
</xsl:stylesheet>

Will yield this XML output:

<?xml version="1.0" encoding="UTF-8"?>
<items>
   <name>A</name>
   <name>B</name>
   <name>C</name>
</items>

Given your XML input file, as requested.

Upvotes: 3

Related Questions