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

Subject: Re: [xsl] select name of element / deal with embedded for-each
From: Niclas Hedhman <niclas@xxxxxxxxxxx>
Date: Sun, 30 May 2004 06:27:12 +0800
Hi,

Forget <xsl:for-each>, you rarely need it.

The following templates should work. Note the 'double-slash', which means "any 
descendants at any level below".


<xsl:template match="SOURCES" >
  <html>
    <body>
      <table>
        <tr>
          <td>INDEX_A</td>
          <xsl:apply-templates select="SOURCE//INDEX_A" />
        </tr>
        <tr>
          <td>INDEX_B</td>
          <xsl:apply-templates select="SOURCE//INDEX_B" />
        </tr>
        <tr>
          <td>INDEX_C</td>
          <xsl:apply-templates select="SOURCE//INDEX_C" />
        </tr>
      </table>
    </body>
  </html>
</xsl:template>

<xsl:template match="INDEX_A" >
  <td>
    <xsl:value-of select="." />
  </td>
</xsl:template>

<xsl:template match="INDEX_B" >
  <td>
    <xsl:value-of select="." />
  </td>
</xsl:template>

<xsl:template match="INDEX_C" >
  <td>
    <xsl:value-of select="." />
  </td>
</xsl:template>


Cheers
Niclas


On Sunday 30 May 2004 05:59, Xyan wrote:
> 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

-- 
   +------//-------------------+
  / http://www.bali.ac        /
 / http://niclas.hedhman.org / 
+------//-------------------+

Current Thread