xsl-list
[Top] [All Lists]

Re: How to create a node set that excludes some descendant elements?

2005-04-11 21:20:57
Hi Rush,
  Please try this XSL -

It is variation of identity transform..

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";> 

<xsl:output method="xml" indent="yes" />
    
<xsl:template match="node() | @*">
  <xsl:copy>
    <xsl:apply-templates select="node() | @*" />  
  </xsl:copy>
</xsl:template> 
  
<!-- include only 1st y , and exclude all z -->
<xsl:template match="y[ancestor::y or preceding::y] |
z" />
  
</xsl:stylesheet>

Regards,
Mukul

--- Rush Manbert <rush(_at_)manbert(_dot_)com> wrote:
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


--~------------------------------------------------------------------
XSL-List info and archive: 
http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to:
http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--




                
__________________________________ 
Do you Yahoo!? 
Yahoo! Small Business - Try our new resources site!
http://smallbusiness.yahoo.com/resources/

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--