| Subject: [xsl] howto convert node set into 2D table From: "Sam Carleton" <scarleton@xxxxxxxxxxxxxxxx> Date: Wed, 4 Jul 2007 00:33:47 -0400 | 
As I work more on this XSLT, it keeps getting more complex! I took jingjun advice on how to add the empty rows and it works great. The problem is I forgot something...
There is an attribute to determine if the element should be shown, the data really looks like this:
<category> <images> <image name="a" display="true">1</image> <image name="b" display="true">2</image> <image name="c" display="true">3</image> <image name="d" display="true">4</image> <image name="e" display="false">5</image> <image name="f" display="true">6</image> <image name="g" display="false">7</image> <image name="h" display="true">8</image> </images> </category>
<xsl:template match="images"> <table border="3">
     <xsl:for-each select="image[position() mod 5 = 1]">
       <xsl:text>
</xsl:text>
       <tr>
         <xsl:for-each select=".|following-sibling::image[position() < 5]">
           <td>
             <xsl:value-of select="concat(@name,':',.)"/>
           </td>
         </xsl:for-each>
         <xsl:call-template name="gen_blank_table_col">
           <xsl:with-param name="col_num">
             <xsl:value-of select="5 -
(count(.|following-sibling::image[position() < 5]))"/>
           </xsl:with-param>
         </xsl:call-template>
       </tr>
     </xsl:for-each>     <xsl:text>
</xsl:text>
   </table>
 </xsl:template>
 <!-- =======================================================================
-->
 <!-- This template is used to generate blank table col.-->
 <!--=======================================================================
-->
 <xsl:template name="gen_blank_table_col">
   <xsl:param name="col_num"/>
   <xsl:if test="$col_num > 0">
     <td> - </td>
     <xsl:call-template name="gen_blank_table_col">
       <xsl:with-param name="col_num">
         <xsl:value-of select="$col_num - 1"/>
       </xsl:with-param>
     </xsl:call-template>
   </xsl:if>
 </xsl:template>My first though is that before the the first for-each, I need to create a temporary node set of all the image elements that have the display attribute set to true. The question is how? Let me throw in one more issue...
The data is a bit more complex then the sample data above. The <category> element can also contain a <categories> element that contains another set of <category> elements. I need to transform both the images/image and the categories/category under the main category element, the same way.
1: At the top <category> element, go off and create a new temporary node set of either all the images/image[@display='true'] | categories/category[@display='true'] 2: Turn the <xsl:template match="images"> into a named template and pass it the temporary node set from #1
The biggest problem I am having is that in all the for-each, it directly refers to the image element, how do I consistently refer to either the image or the category element? I would like to stick with on and run with it through out. The first thing that pops to mind is rather then simply copying the whole node in #1, copy the key data from either the image or category elements into a new element so that in #2, the element name is always the same.
Any thoughts on all my rambling? Can you tell it is 12:30am my time and I am tired;) I am off to bed! Thanks in advance for any and all help!
| Current Thread | 
|---|
| 
 | 
| <- Previous | Index | Next -> | 
|---|---|---|
| Re: [xsl] Filling out a table row, jingjun long | Thread | Re: [xsl] howto convert node set in, Andrew Welch | 
| Re: [xsl] Filling out a table row, jingjun long | Date | [xsl] Create a list of values from , Michael Eberhard | 
| Month |