Re: [xsl] rendering a treeview *hairy problem*

Subject: Re: [xsl] rendering a treeview *hairy problem*
From: "Nikolai Grigoriev" <grig@xxxxxxxxxxx>
Date: Fri, 2 Feb 2001 03:38:37 +0300
Mattias Konradsson <preacher@xxxxxxxxxxx> wrote:


> Well,  it sure was bloody, frustrating and  hairtearing but atleast I
> learned a lot :)  Here's the final mega-recursion-braintwister stylesheet,
> read at your own peril. At least it makes a good exercise :)

I think you can achieve the same effect by mere invocation of templates with
parameters - without using neither ancestor axis nor <xsl:choose>. Please find a
suggestion below. I have outlined the images by preformatted pieces of text. All
variables and parameters there are RTFs, processed by xsl:copy-of; therefore, it
is safe to put an <img/> element into $blank, $straight, etc...

Hope you enjoy it,

Regards,
Nikolai


=============================================
<xsl:stylesheet version="1.0"
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html"/>

<!-- ============================ -->
<!-- Single pieces of tree view   -->

<xsl:variable name="blank">
  <xsl:text>   </xsl:text>
</xsl:variable>
<xsl:variable name="straight">
  <xsl:text>|  </xsl:text>
</xsl:variable>
<xsl:variable name="branch">
  <xsl:text>|--</xsl:text>
</xsl:variable>
<xsl:variable name="endnode">
  <xsl:text>'--</xsl:text>
</xsl:variable>
<xsl:variable name="parentnode">
  <xsl:text>+ </xsl:text>
</xsl:variable>

<!-- ============================ -->
<!-- Basics                       -->

<xsl:template match="forum">
  <table width="100%">
    <xsl:apply-templates select="thread"/>
  </table>
</xsl:template>

<xsl:template match="thread">
  <tr>
    <td>
      <table width="100%">
        <xsl:apply-templates select="post"/>
      </table>
    </td>
  </tr>
</xsl:template>

<!-- ======================================================= -->
<!-- Templates to dispatch selection of tree building blocks -->
<!-- Note that there is no HTML inside - only the logic -->

<!-- Single post that is not a last reply -->
<xsl:template match="post[following-sibling::post]">
  <xsl:param name="prefix"/>

  <xsl:call-template name="draw-post">
    <xsl:with-param name="current-prefix">
      <xsl:copy-of select="$prefix"/>
      <xsl:copy-of select="$branch"/>
    </xsl:with-param>
    <xsl:with-param name="children-prefix">
      <xsl:copy-of select="$prefix"/>
      <xsl:copy-of select="$straight"/>
    </xsl:with-param>
  </xsl:call-template>
</xsl:template>

<!-- Single post that is a last reply -->
<xsl:template match="post" priority="-1">
  <xsl:param name="prefix"/>

  <xsl:call-template name="draw-post">
    <xsl:with-param name="current-prefix">
      <xsl:copy-of select="$prefix"/>
      <xsl:copy-of select="$endnode"/>
    </xsl:with-param>
    <xsl:with-param name="children-prefix">
      <xsl:copy-of select="$prefix"/>
      <xsl:copy-of select="$blank"/>
    </xsl:with-param>
  </xsl:call-template>
</xsl:template>

<!-- ========================== -->
<!-- Actually draw a post entry -->
<!-- The current node must be "post".  -->

<xsl:template name="draw-post">
  <xsl:param name="current-prefix"/>
  <xsl:param name="children-prefix"/>

  <tr>
    <td>
      <pre>
      <xsl:copy-of select="$current-prefix"/>
      <xsl:if test="post">
        <xsl:copy-of select="$parentnode"/>
      </xsl:if>
      <xsl:value-of select="@Subject"/>
      </pre>
    </td>
  </tr>

  <xsl:apply-templates select="post">
    <xsl:with-param name="prefix" select="$children-prefix"/>
  </xsl:apply-templates>
</xsl:template>

</xsl:stylesheet>



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


Current Thread