RE: [xsl] How to create a node set that excludes some descendant elements?

Subject: RE: [xsl] How to create a node set that excludes some descendant elements?
From: "Aron Bock" <aronbock@xxxxxxxxxxx>
Date: Tue, 12 Apr 2005 03:09:35 +0000
Rush, hopefully you'll find better answers, but here's my first pass. I modified the "identity transform" to filter out z and non-first y's. You'll have to tweak it to account for "contained within 'c'". You may wrap up in a variable as needed.

Also, I assume when you mean to discard <z> elements, you also mean to discard any of its descendents.


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
<xsl:output method="xml"/>


   <xsl:template match="node(  ) | @*">
     <xsl:if test="name() != 'z' and not (name() = 'y' and preceding::y)">
         <xsl:copy>
           <xsl:apply-templates select="@* | node(  )"/>
         </xsl:copy>
     </xsl:if>
   </xsl:template>

</xsl:stylesheet>

Regards,

--A


From: Rush Manbert <rush@xxxxxxxxxxx>
Reply-To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] How to create a node set that excludes some descendant elements?
Date: Mon, 11 Apr 2005 16:57:24 -0700


Hi all,

My first post here and I want to start by saying how much I appreciate the big FAQ, the Jeni site, etc. It has all helped me tremendously.

I can't find an answer to this one, though, so here goes...

My XML doc has this basic structure:
<a>
 <b>
   <c>
     <!-- This is the section of interest -->
   </c>
 </b>
</a>

The <c> element can contain any combination of elements <d> through <z>. Elements <y> and <z> have special uses.

I want to create a global variable that contains the result tree fragment contained within element <c>, with the following restrictions:
I only want to include the first <y> element that is contained within <c>, no matter where it occurs. There may be no <y> elements present.
I want to exclude all <z> elements that are contained within <c>, no matter where they occur. Again, there may be none present.


Later on in my stylesheet, I use exslt:node-set() on the variable and process the node set.

For instance, given this source:
<a><b><c>
 <d>
   <z>
   <g />
 </d>
 <q>
   <r>
     <y />
     <z />
   </r>
   <y />
 <q>
 <y>
</c></b></a>

I want the selection to contain this:
<a><b><c>
 <d>
   <g />
 </d>
 <q>
   <r>
     <y />
   </r>
 <q>
</c></b></a>

(<z> elements are gone, only the first <y> element remains.)

I have tried many variations on the select portion of the variable definition. I can filter the immediate children of <c>, OR the second level children, etc., but I can't seem to come up with anything that handles <y> and <z> appearing at any depth in the descendant tree.

I'm prepared to be humiliated by some obvious solution... Can anyone please help?

Thanks,
Rush


_________________________________________________________________
Dont just search. Find. Check out the new MSN Search! http://search.msn.click-url.com/go/onm00200636ave/direct/01/


Current Thread