xsl-list
[Top] [All Lists]

RE: Delete XML Node

2002-10-31 14:14:50
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



<Prev in Thread] Current Thread [Next in Thread>