Re: Applying templates only to certain part of the tree

Subject: Re: Applying templates only to certain part of the tree
From: David Carlisle <davidc@xxxxxxxxx>
Date: Wed, 17 May 2000 13:49:43 +0100 (BST)
   X-Originating-IP: []
   From: "Nuri Besen" <nb_news@xxxxxxxxxxx>
   Date: Wed, 17 May 2000 08:28:56 EDT
   Sender: owner-xsl-list@xxxxxxxxxxxxxxxx
   Precedence: bulk
   Reply-To: xsl-list@xxxxxxxxxxxxxxxx
   Content-Type: text/plain; format=flowed
   Content-Length: 831


   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"/>

   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"/>

   What is the correct method to exclude a part of the tree?

It depends what you want to do


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
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:template match="TestSec"/>


 XSL-List info and archive:

Current Thread