Mega Code Archive

 
Categories / XML Tutorial / XSLT StyleSheet
 

For-each select=addressbookaddress[generate-id( )=generate-id(key(zipcodes, zip)[1])]

File: Data.xml <?xml version="1.0"?> <addressbook>   <address>     <name>       <title>Mr.</title>       <first-name>Doris</first-name>       <last-name>Smith</last-name>     </name>     <street>1234 Main Street</street>     <city>Sheboygan</city>     <state>WI</state>     <zip>48392</zip>   </address> </addressbook> File: Transform.xslt <?xml version="1.0"?> <xsl:stylesheet version="1.0"    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">   <xsl:output method="html"/>   <xsl:key name="zipcodes" match="address" use="zip"/>   <xsl:template match="/">     <html>       <head>         <title>Customers grouped by Zip code</title>       </head>       <body>         <table border="1" cellpadding="5">           <xsl:for-each select="/addressbook/address[generate-id(.)=generate-id(key('zipcodes', zip)[1])]">             <xsl:sort select="zip"/>              <xsl:for-each select="key('zipcodes', zip)">               <xsl:sort select="name/last-name"/>               <xsl:sort select="name/first-name"/>               <tr>                 <xsl:if test="position() = 1">                   <td rowspan="{count(key('zipcodes', zip))}">                     <xsl:text>Zip code </xsl:text>                     <br/>                     <span style="font-size: 150%;">                       <xsl:value-of select="zip"/>                     </span>                     <br/>                     <xsl:value-of select="city"/>                     <xsl:text>, </xsl:text>                     <xsl:value-of select="state"/>                   </td>                 </xsl:if>                 <td>                   <xsl:value-of select="name/first-name"/>                   <xsl:text> </xsl:text>                   <span>                     <xsl:value-of select="name/last-name"/>                   </span>                 </td>                 <td>                   <xsl:value-of select="street"/>                 </td>               </tr>             </xsl:for-each>           </xsl:for-each>         </table>       </body>     </html>   </xsl:template> </xsl:stylesheet> Output: <html>    <head>       <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">       <title>Customers grouped by Zip code</title>    </head>    <body>       <table border="1" cellpadding="5">          <tr>             <td rowspan="1">Zip code <br><span style="font-size: 150%;">48392</span><br>Sheboygan, WI             </td>             <td>Doris <span>Smith</span></td>             <td>1234 Main Street</td>          </tr>       </table>    </body> </html>