Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Remove duplicate xml nodes? 1

Status
Not open for further replies.

sdh

Programmer
Apr 30, 2001
121
0
0
GB
Please help
I have xml documents structured as below and want to transform them
so it it only consists of records where there are no duplicate tbHrse_id value nodes
<?xml version="1.0" ?>
- <horses>
- <horse>
- <field name="tbHrse_Name">
<value>NO COMPLAINTS</value>
</field>
- <field name="tbHrseDis_Discipline">
<value>Dressage</value>
</field>
- <field name="tbHrse_colour">
<value>c</value>
</field>
- <field name="tbHrse_height">
<value>148</value>
</field>
- <field name="tbHrse_id">
<value>41</value>
</field>
- <field name="tbHrseG_Grade">
<value>Novice</value>
</field>
- <field name="tbHrse_sex">
<value>Entire</value>
</field>
- <field name="Age">
<value>1361</value>
</field>
- <field name="tbHrseT_id">
<value>2</value>
</field>
- <field name="tbH_D_id">
<value>1</value>
</field>
- <field name="tbHrseG_id">
<value>1</value>
</field>
</horse>
- <horse>
- <field name="tbHrse_Name">
<value>NO COMPLAINTS</value>
</field>
- <field name="tbHrseDis_Discipline">
<value>Dressage</value>
</field>
- <field name="tbHrse_colour">
<value>Chestnut</value>
</field>
- <field name="tbHrse_height">
<value>148</value>
</field>
- <field name="tbHrse_id">
<value>1</value>
</field>
- <field name="tbHrseG_Grade">
<value>Novice</value>
</field>
- <field name="tbHrse_sex">
<value>Entire</value>
</field>
- <field name="Age">
<value>1381</value>
</field>
- <field name="tbHrseT_id">
<value>2</value>
</field>
- <field name="tbH_D_id">
<value>1</value>
</field>
- <field name="tbHrseG_id">
<value>1</value>
</field>
</horse>
- <horse>
- <field name="tbHrse_Name">
<value>NO COMPLAINTS</value>
</field>
- <field name="tbHrseDis_Discipline">
<value>jumping</value>
</field>
- <field name="tbHrse_colour">
<value>Chestnut</value>
</field>
- <field name="tbHrse_height">
<value>148</value>
</field>
- <field name="tbHrse_id">
<value>1</value>
</field>
- <field name="tbHrseG_Grade">
<value>Novice</value>
</field>
- <field name="tbHrse_sex">
<value>Entire</value>
</field>
- <field name="Age">
<value>1381</value>
</field>
- <field name="tbHrseT_id">
<value>2</value>
</field>
- <field name="tbH_D_id">
<value>1</value>
</field>
- <field name="tbHrseG_id">
<value>1</value>
</field>
</horse>
</horses>


e.g so they are reformed like this....

- <horses>
- <horse>
- <field name="tbHrse_Name">
<value>NO COMPLAINTS</value>
</field>
- <field name="tbHrseDis_Discipline">
<value>Dressage</value>
</field>
- <field name="tbHrse_colour">
<value>c</value>
</field>
- <field name="tbHrse_height">
<value>148</value>
</field>
- <field name="tbHrse_id">
<value>41</value>
</field>
- <field name="tbHrseG_Grade">
<value>Novice</value>
</field>
- <field name="tbHrse_sex">
<value>Entire</value>
</field>
- <field name="Age">
<value>1361</value>
</field>
- <field name="tbHrseT_id">
<value>2</value>
</field>
- <field name="tbH_D_id">
<value>1</value>
</field>
- <field name="tbHrseG_id">
<value>1</value>
</field>
</horse>
- <horse>
- <field name="tbHrse_Name">
<value>NO COMPLAINTS</value>
</field>
- <field name="tbHrseDis_Discipline">
<value>Dressage</value>
</field>
- <field name="tbHrse_colour">
<value>Chestnut</value>
</field>
- <field name="tbHrse_height">
<value>148</value>
</field>
- <field name="tbHrse_id">
<value>1</value>
</field>
- <field name="tbHrseG_Grade">
<value>Novice</value>
</field>
- <field name="tbHrse_sex">
<value>Entire</value>
</field>
- <field name="Age">
<value>1381</value>
</field>
- <field name="tbHrseT_id">
<value>2</value>
</field>
- <field name="tbH_D_id">
<value>1</value>
</field>
- <field name="tbHrseG_id">
<value>1</value>
</field>
</horse>

As a newcomer to this can anyone tell me the best way to do this or provide samples

Thanks
SDH


 
This will do the trick.
The idea is to make a list of all id-fields in the key-declaration.
Then, you only copy a horse-node if its id-field is the same node as the first occurence of that value in the list.
You find out if it is the same node by counting: if the count of my node OR the keynode equals 1, it means that my node and the key-node are actually the same node.
Code:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="[URL unfurl="true"]http://www.w3.org/1999/XSL/Transform">[/URL]
   <xsl:key name="key_tbHrse_id" match="field[@name='tbHrse_id']" use="." />

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

   <xsl:template match="horses">
      <xsl:element name="horses">
         <xsl:for-each select="horse[count(field[@name='tbHrse_id'] | key('key_tbHrse_id', field[@name='tbHrse_id'])[1]) = 1]">
            <xsl:copy-of select="." />
         </xsl:for-each>
      </xsl:element>
   </xsl:template>
</xsl:stylesheet>
 
Thanks so much I will give it a try
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top