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]
Other format: [Raw text]

Re: Filtering elements of a tree


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="*">
  ...
</xsl:template>

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

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

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())]">
    <TreeNode>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates select="*" />
    </TreeNode>
  </xsl:if>
</xsl:template>

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]