RE: [xsl] select name of element / deal with embedded for-each

Subject: RE: [xsl] select name of element / deal with embedded for-each
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Sun, 30 May 2004 00:27:00 +0100
If you know that each <INDEX> will have the same children in the same order
then this is reasonably easy (even if you don't know what the children will
be):

<xsl:template match="SOURCES">
<xsl:variable name="rows" select="SOURCE/INDEX"/>
<table>
<xsl:for-each select="SOURCE/INDEX[1]/*>
  <tr>
    <xsl:variable name="col" select="name()"/>
    <td><xsl:value-of select="$col"/></td>
    <xsl:for-each select="$rows">
       <td><xsl:value-of select="*[name()=$col]"/></td>

Michael Kay

> -----Original Message-----
> From: Xyan [mailto:xyan@xxxxxxxx] 
> Sent: 29 May 2004 22:00
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] select name of element / deal with embedded for-each
> 
> Hi,
> 
> as a beginner, I try to transform an XML structure like this one :
> 
> <SOURCES>
>     <SOURCE CODE="SOURCE_1">
>             <INDEX>
>                 <INDEX_A>A1</INDEX_A>
>                 <INDEX_B>B1</INDEX_B>
>                 <INDEX_C>C1</INDEX_C>
>             </INDEX>
>     </SOURCE>
>     <SOURCE CODE="SOURCE_2">
>             <INDEX>
>                <INDEX_A>A2</INDEX_A>
>                 <INDEX_B>B2</INDEX_B>
>                 <INDEX_C>C2</INDEX_C>
>             </INDEX>
>     </SOURCE>
> 
> 
> into an HTML table :
> 
> <html>
> <body>
> <table>
> <tr>
> <td>INDEX_A</td>
> <td>A1</td>
> <td>A2</td>
> </tr>
> <tr>
> <td>INDEX_B</td>
> <td>B1</td>
> <td>B2</td>
> </tr>
> <tr>
> <td>INDEX_C</td>
> <td>C1</td>
> <td>C2</td>
> </tr>
> </table>
> </body>
> </html>
> 
> I have two difficulties :
> 1. How to select the name of an element (in my case : <INDEX_A>  must 
> become : <td>INDEX_A</td> ).
> 2. How to write the xslt in order to treat /at once/ EACH 
> INDEX FOR EACH 
> SOURCE. I have some difficulties because of the two xsl:for-each that 
> must coexist.
> 
> 
> I have tried :
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
>     <xsl:output method="html"/>
>     <xsl:template match="/">
>         <html>
>             <body>
>                 <table border="1">
>                     <xsl:for-each select="/SOURCES/SOURCE[1]/INDEX/*">
>                         <tr>
>                             <xsl:for-each select="/SOURCES/SOURCE">
>                                 <td>
>                                     <xsl:value-of select="INDEX/*"/>
>                                 </td>
>                             </xsl:for-each>
>                         </tr>
>                     </xsl:for-each>
>                 </table>
>             </body>
>         </html>
>     </xsl:template>
> </xsl:stylesheet>
> 
> but the result :
> 
> A1 	A2
> A1 	A2
> A1 	A2
> 
> 
> is, as you see and have guessed, bad.........
> 
> Thanks a lot for your help.
> 
> Xyan

Current Thread