xsl-list
[Top] [All Lists]

RE: Deleting a node depending on contents of a grandfather attribute and a child node

2003-07-30 18:41:58
Glad you got it :)  XSLT very often requires different ways of looking
at life.

I forgot to answer your other question...

<xsl:template match="/">

Is similar to the other template in that its intent is to specify
whether or not to copy a particular "parent" node to the output.  /
refers to the root node of the document which is the parent of the root
element of the document.  If your XML is precisely as below, it is the
parent of your <parent> node.

I put the comment in there to indicate that should your actual XML be
different, e.g.

<Root>
   <parent>...</parent>
   <parent>...</parent>
</Root>

That the match expression should point to "Root" and not "/".  In
addition, if you want <Root> in the output, you'll want to add the
<xsl:copy> as in the second template.

Is that clear?

Dion 

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
John Reid
Sent: Wednesday, July 30, 2003 6:21 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Deleting a node depending on contents of a
grandfather attribute and a child node

G'day Dion,

Short answer is yes that is what I am expecting.
I understand that by not copying across nodes, they are effectively
deleted. I save the xml file back onto itself.

Salud

john  


-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
Dion Houston
Sent: Thursday, 31 July 2003 10:46 AM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Deleting a node depending on contents of a
grandfather attribute and a child node


Howdy!

I may be confused or you may be... let's figure out which :)

Once again, let's not think of this as deleting a node, but rather as
copying nodes...  In my case, you are copying those nodes which have a
from with a certain date.  Nodes which do not have that from date will
not be copied.

In your example XML below, if $vardate="20030103" you should get this
node in the output:

<absent type="D">
        <to>20030801</to>
        <from>20030103</from>
</absent>

But not this one:

<absent type="C">
        <to>20030921</to>
        <from>20030901</from>
</absent>

Is that what you expect?

Dion



-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
John Reid
Sent: Wednesday, July 30, 2003 3:12 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: RE: [xsl] Deleting a node depending on contents of a
grandfather attribute and a child node

G'day Dion,
I understand the logic of what u say but I am confused a little
Should this statement
      <xsl:apply-templates select="absent[from=$vardate]"/>
 be
      <xsl:apply-templates select="absent[not(from=$vardate)]"/>
And
<xsl:template match="/"> I am not sure which node it would match to and
what it achieves

Salud

john
Hey John:

Keep in mind in XSLT that you don't delete nodes, you fail to copy them
to the output tree.  This is more than a semantic distinction, as it
suggests a different approach.

What you should do here is move the logic of whether to copy the nodes
to the appropriate parent and then apply templates on those nodes...
i.e.

<xsl:template match="/"> <!-- if this is the parent of parent nodes -->
   <xsl:apply-templates select="parent[(_at_)pword=$varpword]"/>
</xsl:template>

<xsl:template match="absentia">
   <xsl:copy>
      <xsl:apply-templates select="absent[from=$vardate]"/>
   </xsl:copy>
</xsl:template>

HTH!

Dion

-----Original Message-----
From: owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
[mailto:owner-xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com] On Behalf Of 
John Reid
Sent: Wednesday, July 30, 2003 1:27 PM
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Deleting a node depending on contents of a grandfather
attribute and a child node

Could I put this q up again?
:o)
i have tried a number of approaches but with various but not correct
results. I want to delete the absent node (and everything below it)
where $vardate = from and @pword $varpword.

Starting with:
<player pword='82345'>
<absentia>
<absent type="C">
        <to>20030921</to>
        <from>20030901</from>
</absent>
<absent type="D">
        <to>20030801</to>
        <from>20030103</from>
</absent>
</absentia>
<player>

ending with:
<player pword='82345'>
<absentia>
<absent type="D">
        <to>20030801</to>
        <from>20030103</from>
</absent>
</absentia>
<player>

tried this (along with about 10 variations):

<xsl:param name="vardate" select="0" />
<xsl:param name="varpword" select="0" />

<xsl:template match="@*|node()">
<xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

<xsl:template match="absent">
    <xsl:variable name="date1" select="./from"/>
    <xsl:variable name="pword" select="ancestor::@pword"/>
    <xsl:copy>
      <xsl:apply-templates select="@*|node()[not($date1 = $vardate and
$pword = $varpword)]"/>
  </xsl:copy>
</xsl:template>


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list




 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list