[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] Outputting closing HTML table tags conditionally


Subject: Re: [xsl] Outputting closing HTML table tags conditionally
From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx>
Date: Sat, 29 Nov 2003 18:29:15 -0500

At 2003-11-29 14:35 -0800, Mark Jordan wrote:
I am having trouble understanding how to output closing HTML tags

Yes, that is because you have been misled. XSLT is *not* an "angle-bracket processor" it is a "node-tree processor" ... you have to think nodes, not tags. You are approaching the solution improperly by trying to "output closing HTML tags", because doing so is not possible in XSLT.


Since you need to express all of your expected output as nodes in your stylesheet, your stylesheet is in XML. Thus, your stylesheet needs to be well-formed. Therefore, you cannot plan your algorithm to just output end tags, because end tags are not nodes, they will be created by the processor when emitting nodes, but they are not part of your input. They happen to be in your input syntax because they *describe* nodes, but they are *not* your input ... the nodes they describe are your input.

So, inside your <xsl:if> you will have to represent entire nodes (using start and end tags) in a well-formed fashion, and the processor will build the output using these nodes and when serializing these nodes to the result file will give you the necessary start and end tags or empty tags as required.

My stylesheet (with XML declaration, <xsl:output> and root template XSL ommitted) is:

You will have to change your algorithm to the following:


 <table>
   <xsl:for-each select="image">
     <xsl:if test="position() mod 4 = 0">
       <tr>
        <xsl:for-each select=". | following-sibling::image[1] |
                              following-sibling::image[2] |
                              following-sibling::image[3]">
           <td><!--stuff for each iamge--></td>
        </xsl:for-each>
      </tr>
    </xsl:if>
  </xsl:for-each>
 </table>

You can see how the above is well-formed.

Anybody have any suggestions? All I want to do is output '</tr></table><table><tr>' within xsl:if.

But that would not be well-formed. If you stop thinking about tags and think instead about nodes, the solution should come to you.


I hope the above helps.

................... Ken

--
Next public European delivery:  3-day XSLT/2-day XSL-FO 2004-01-??
Instructor-led on-site corporate, government & user group training
for XSLT and XSL-FO world-wide:  please contact us for the details

G. Ken Holman                 mailto:gkholman@xxxxxxxxxxxxxxxxxxxx
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Box 266, Kars, Ontario CANADA K0A-2E0    +1(613)489-0999 (F:-0995)
ISBN 0-13-065196-6                       Definitive XSLT and XPath
ISBN 0-13-140374-5                               Definitive XSL-FO
ISBN 1-894049-08-X   Practical Transformation Using XSLT and XPath
ISBN 1-894049-11-X               Practical Formatting Using XSL-FO
Member of the XML Guild of Practitioners:     http://XMLGuild.info
Male Breast Cancer Awareness  http://www.CraneSoftwrights.com/s/bc


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list




Current Thread
Keywords