[xsl] Question about the key() function

Subject: [xsl] Question about the key() function
From: aspsa <aspsa@xxxxxxxxxxxxx>
Date: Fri, 13 May 2005 17:13:56 -0400
Hi, folks.

Given this document...

<?xml version="1.0" encoding="UTF-8"?>
<addressbook>
 <address>
  <name>
   <title>Mr.</title>
   <first-name>Chester Hasbrouck</first-name>
   <last-name>Frisby</last-name>
  </name>
  <street>1234 Main Street</street>
  <city>Sheboygan</city>
  <state>WI</state>
  <zip>48392</zip>
  <id>1</id>
 </address>
 <address>
  <name>
   <first-name>Mary</first-name>
   <last-name>Backstayge</last-name>
  </name>
  <street>283 First Avenue</street>
  <city>Skunk Haven</city>
  <state>MA</state>
  <zip>02718</zip>
  <id>10</id>
 </address>
 <address>
  <name>
   <title>Ms.</title>
    <first-name>Natalie</first-name>
    <last-name>Attired</last-name>
  </name>
  <street>707 Breitling Way</street>
  <city>Winter Harbor</city>
  <state>ME</state>
  <zip>00218</zip>
  <id>2</id>
 </address>
 <address>
  <name>
   <first-name>Harry</first-name>
   <last-name>Backstayge</last-name>
  </name>
  <street>283 First Avenue</street>
  <city>Skunk Haven</city>
  <state>MA</state>
  <zip>02718</zip>
  <id>20</id>
 </address>
 <address>
  <name>
   <first-name>Mary</first-name>
   <last-name>McGoon</last-name>
  </name>
  <street>103 Bryant Street</street>
  <city>Boylston</city>
  <state>VA</state>
  <zip>27318</zip>
  <id>300</id>
 </address>
 <address>
  <name>
   <title>Ms.</title>
   <first-name>Amanda</first-name>
   <last-name>Reckonwith</last-name>
  </name>
  <street>930-A Chestnut Street</street>
  <city>Lynn</city>
  <state>MA</state>
  <zip>02930</zip>
  <id>31</id>
 </address>
</addressbook>

...and this XSLT document...

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
 <xsl:key name="x" match="address" use="zip"/>

 <xsl:template match="/">
  <keyNode>
   <xsl:apply-templates select="key('x',addressbook/address/zip)" />
  </keyNode>
 </xsl:template>

 <xsl:template match="address">
  <Name>
   <xsl:value-of select="id"/>
   <xsl:text>, </xsl:text>
   <xsl:value-of select="name/last-name"/>
   <xsl:text>, </xsl:text>
   <xsl:value-of select="zip"/>
  </Name>
 </xsl:template>
</xsl:stylesheet>

...why does the output repeat nodes containing id values 10 and 20?

<?xml version="1.0" encoding="UTF-8"?>
<keyNode>
 <Name>1, Frisby, 48392</Name>
 <Name>10, Backstayge, 02718</Name>
 <Name>10, Backstayge, 02718</Name>
 <Name>2, Attired, 00218</Name>
 <Name>20, Backstayge, 02718</Name>
 <Name>20, Backstayge, 02718</Name>
 <Name>300, McGoon, 27318</Name>
 <Name>31, Reckonwith, 02930</Name>
</keyNode>


Respectfully,

ASP

Current Thread