This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Applying templates only to certain part of the tree
- To: xsl-list at mulberrytech dot com
- Subject: Re: Applying templates only to certain part of the tree
- From: David Carlisle <davidc at nag dot co dot uk>
- Date: Wed, 17 May 2000 13:49:43 +0100 (BST)
- References: <20000517122856.44529.qmail@hotmail.com>
- Reply-To: xsl-list at mulberrytech dot com
X-Originating-IP: [212.252.1.73]
From: "Nuri Besen" <nb_news@hotmail.com>
Date: Wed, 17 May 2000 08:28:56 EDT
Sender: owner-xsl-list@mulberrytech.com
Precedence: bulk
Reply-To: xsl-list@mulberrytech.com
Content-Type: text/plain; format=flowed
Content-Length: 831
Hello,
I am trying the following, and it does not compile but:
<xsl:template match="/">
<xsl:apply-templates select="main and not(main//TestSec)"/>
<xsl:apply-templates select="main//TestSec"/>
</xsl:template>
where I want to apply the templates for everything under the "main" section
but excluding the TestSec.
<xsl:apply-templates takes a select expression that must return a node
set. "main and not(main//TestSec)" is a boolean valued expression that
just returns true or false.
The following works but applies the TestSec templates twice, naturally.
<xsl:template match="/">
<xsl:apply-templates select="main"/>
<xsl:apply-templates select="main//TestSec"/>
</xsl:template>
What is the correct method to exclude a part of the tree?
It depends what you want to do
select="main//*[not(self::TestSec)"
and
select="main//TestSec"
do what you are apparently trying to do, which is select all nodes
below main, firstly those that are not called TestSec and then those
that are.
However I suspect that isn't what you want to do. It flattens the
document tree, and if any template for any node that is selected by
select="main//*[not(self::TestSec)"
calls xsl:apply-templates in the usual way, selecting its children,
then TestSec will end up being processed twice anyway.
If you want to process the tree missing out TestSec, then process them
later you probably want
<xsl:apply-templates select="main"/>
<xsl:for-each select="main//TestSec">
...
</xsl:for-each>
...
<xsl:template match="TestSec"/>
David
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list