Re: [xsl] combining common data within groups.

Subject: Re: [xsl] combining common data within groups.
From: Martin Honnen <Martin.Honnen@xxxxxx>
Date: Tue, 04 Nov 2008 12:48:52 +0100
Andy.Lewis@xxxxxxxxxxx wrote:
This is a new area for me. Need to eliminate duplicates that occur
within sub-groups.

XML Input example:
<?xml version="1.0"?>
<root>
	<boxes>
		<box_sizes>
			<value>square</value>
		</box_sizes>
		<box_sizes>
			<value>square</value>
		</box_sizes>
	</boxes>
	<boxes>
		<box_sizes>
			<value>round</value>
		</box_sizes>
		<box_sizes>
			<value>square</value>
		</box_sizes>
	</boxes>
	<color1>red</color1>
	<color2>blue</color2>
</root>


Desired output: <?xml version="1.0" encoding="utf-8"?> <root> <color1>red</color1> <boxes> <box_sizes> <value>square</value> </box_sizes> </boxes> <boxes> <box_sizes> <value>round</value> <value>square</value> </box_sizes> </boxes> </root>


As you can see, I want to eliminate duplicate occurances of
<box_sizes/value> within the <boxes> group.

Here is a stylesheet sample:


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

<xsl:output method="xml" indent="yes"/>

  <xsl:key name="by-value"
           match="box_sizes"
           use="concat(generate-id(parent::boxes), '_', value)"/>

  <xsl:template match="root">
    <xsl:copy>
      <xsl:apply-templates select="color1"/>
      <xsl:apply-templates select="boxes"/>
    </xsl:copy>
  </xsl:template>

<xsl:template match="boxes">
<xsl:copy>
<box_sizes>
<xsl:apply-templates select="box_sizes[generate-id() = generate-id(key('by-value', concat(generate-id(parent::boxes), '_', value))[1])]/value"/>
</box_sizes>
</xsl:copy>
</xsl:template>


  <xsl:template match="*">
    <xsl:copy>
      <xsl:apply-templates/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>


--


	Martin Honnen
	http://JavaScript.FAQTs.com/

Current Thread