This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Filtering elements of a tree
- From: Jeni Tennison <jeni at jenitennison dot com>
- To: "Venkatesh Sutrave" <vmsutrave at rediffmail dot com>
- Cc: XSL-List at lists dot mulberrytech dot com
- Date: Wed, 8 May 2002 09:43:23 +0100
- Subject: Re: [xsl] Filtering elements of a tree
- Organization: Jeni Tennison Consulting Ltd
- References: <20020508051604.15420.qmail@webmail18.rediffmail.com>
- Reply-to: xsl-list at lists dot mulberrytech dot com
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