Re: [xsl] Filtering elements of a tree

Subject: Re: [xsl] Filtering elements of a tree
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Wed, 8 May 2002 09:43:23 +0100
Hi Venkatesh,

> I want to select the element artist with id=7 and its parent, grand
> parent and so on.

It's easiest to do this with a top-down transformation, only creating
a TreeNode element for an element that you encounter if it has an
element with id="7" somewhere in its descendants (or rather, if it is
an ancestor of an element with id="7".

First, you should hold all the elements that are ancestors of, or are
themselves, elements with an id of 7, in a global variable, so that you
only have to search through the tree for them once:

<xsl:variable name="selected"
              select="//*[@id = '7']/ancestor-of-self::*" />

Then you need a template that matches any element:

<xsl:template match="*">

and tests to see whether it is one of the selected nodes:

<xsl:template match="*">
  <xsl:if test="$selected[generate-id() = generate-id(current())]">

If it is, then you want to create a TreeNode element, with copied
attributes from this one, and move on to process its child elements in
the same way:

<xsl:template match="*">
  <xsl:if test="$selected[generate-id() = generate-id(current())]">
      <xsl:copy-of select="@*" />
      <xsl:apply-templates select="*" />



Jeni Tennison

 XSL-List info and archive:

Current Thread