This is the mail archive of the xsl-list@mulberrytech.com mailing list .


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RE: Generate Hierarchical Tree from non-hierarchical XML


At 18:42 17/08/00 +0100, Ben Robb wrote:
>Try:
>
><xsl:template match="employees">
>	<table><xsl:apply-templates select="employee[manager = '']
>"/></table>
></xsl:template>
>
><xsl:template match="employee">
>	<tr><td width="150"></td><td>
>		<xsl:value-of select="name" />
>		<xsl:if test="../employee[manager != current()/id]">
>			<table>
>				<xsl:apply-templates
>select="../employee[manager = current()/id] ">
>					<xsl:sort select="id"/>
>				</xsl:apply-templates>
>			</table>
>		</xsl:if>
>	</td></tr>
></xsl:template>

If you are using an XSLT Processor that supports keys, you could also use
keys to quickly access the employees that you're interested in.  Define a
key that indexes the employees by their manager:

  <xsl:key name="employees" match="employee" use="manager" />

and you can then use key('employees', $id) to get the employee with the
relevant id.  Once this key is defined, the above template becomes:

<xsl:template match="employee">
  <tr><td width="150"></td><td>
    <xsl:value-of select="name" />
    <xsl:if test="key('employees', id)">
      <table>
        <xsl:apply-templates select="key('employees', id)">
          <xsl:sort select="id"/>
        </xsl:apply-templates>
      </table>
    </xsl:if>
  </td></tr>
</xsl:template>

Using key() is more efficient if you have a large dataset because it stops
the XSLT Processor from having to search through all the nodes to find the
relevant employees: they're already collected together for easy access.

Cheers,

Jeni

Jeni Tennison
http://www.jenitennison.com/


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

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]