Replace the for each with the Y[Z] with the following:
<xsl:for-each select="Y[child::*]">
<xsl:copy-of select="." />
</xsl:for-each>
This will fire only for those Y which have children. Then it makes a deep
copy of that node.
If you need this logic to apply you node more than Y, then you may want to
look at multiple templates instead of for-each elements.
-----Original Message-----
From: Deepak Rao [mailto:deepaksubs(_at_)hotmail(_dot_)com]
Sent: Thursday, October 31, 2002 4:04 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Delete XML Node
Whoops, I shot myself in the foot here....
sorry folks I am new to XSL.... and pardon my ignorrance
To clarify things, I want an XSL which would output a <Y> if and only if it
has a sub element in this case a <Z>. In the current example I have only one
sub element <Z> but there can be more than one sub-element of <Y>.
e.g.
<Y>
<Z></Z>
<D></D>
......
</Y>
I do not want <Y></Y> to appear in the output if all the sub-elements do not
map.
Thanks,
Deepak
From: "KIENLE, STEVEN C [IT/0200]"
<steven(_dot_)c(_dot_)kienle(_at_)pharmacia(_dot_)com>
Reply-To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To: "'xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com'"
<xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com>
Subject: RE: [xsl] Delete XML Node
Date: Thu, 31 Oct 2002 14:27:42 -0500
Deepak,
In case what you really want to do is output Y if and only if it has a Z
element node, the following transform will work:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/X">
<X>
<xsl:for-each select="A">
<A>
<xsl:value-of select="."/>
</A>
</xsl:for-each>
<xsl:for-each select="Y[Z]">
<Y>
<xsl:for-each select="Z">
<Z>
<xsl:value-of select="."/>
</Z>
</xsl:for-each>
</Y>
</xsl:for-each>
</X>
</xsl:template>
</xsl:stylesheet>
This key is to use the XPath selection of "Y[Z]" which means all Y which
have a Z element.
With the input XML of:
<X>
<A>A</A>
<Y></Y>
</X>
The output will be:
<X>
<A>A</A>
</X>
With the input XML of:
<X>
<A>A</A>
<Y>
<Z>B</Z>
</Y>
</X>
The output will be:
<X>
<A>A</A>
<Y>
<Z>B</Z>
</Y>
</X>
I hope this may help.
Steve
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
_________________________________________________________________
Internet access plans that fit your lifestyle -- join MSN.
http://resourcecenter.msn.com/access/plans/default.asp
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list