Re: [xsl] XSLT/XPATH 2.0 - except example.

Subject: Re: [xsl] XSLT/XPATH 2.0 - except example.
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Wed, 22 Jul 2009 17:07:37 -0400
Hi Michel,

What you are missing is an understanding of XPath syntax and how it is relating to your tree architecture.

It becomes clearer if you expand your XPaths into long syntax. You are currently using abbreviated syntax.

So --

First the XPath that is working for you:

* except(//xhtml:div[@class='border'])

is short for

child::* except (/descendant-or-self::node()/child::xhtml:div[attribute::class='border'])

This is saying: "copy all children, excluding from this set any members of the set of xhtml:div[@class='border'] elements anywhere in the document".

Now the XPath that isn't working:

* except (//xhtml:div[@class='border']//xhtml:h1)

This is short for

child::* except (/descendant-or-self::node()/child::xhtml:div[attribute::class='border']
/descendant-or-self::node()/child::xhtml:h1)


This is saying: "copy all children, excluding from this set any members of the set of xhtml:h1 descendants of xhtml:div[@class='border'] elements anywhere in the document"

Your stylesheet is doing this. Since no xhtml:h1 elements are children of the context node where the expression is evaluated (whichever xhtml:div[@class='center'] has matched your template), all the children are copied. (There are some among the descendants of the children you have asked to copy, but the 'except' operation doesn't work that way.)

In order to accomplish your filtering, you can't simply use a copy-of instruction, since xsl:copy-of simply copies subtrees from your source document without change. That is, you can exclude branches from being copied by using XPath as in your first case, but having decided to copy a branch using xsl:copy-of, you can't also modify it.

In order to do this, you need to use a somewhat more sophisticated approach. Your problem is actually a good example of what we call a "modified identity transform", since the result is just a modified version of the source. It could be done in a stylesheet with two templates like this:

<xsl:template match="*">
  <xsl:copy>
    <xsl:copy-of select="@*"/>
    <xsl:apply-templates/>
  </xsl:copy>
</xsl:template>

<xsl:template match="xhtml:h1"/>

How does this work? You need to read up on templates and the xsl:apply-template instruction.

The idea of the "context node" and its relation to the evaluation of XPath is also critical.

Good luck --
Wendell

At 04:44 PM 7/22/2009, you wrote:
Using Saxon 9
Windows
XSLT/XPATH 2.0

Hi,

I'm trying to remove the h1 from my source with the "except" and it
doesn't work.
ex:<xsl:copy-of  select="* except
(//xhtml:div[@class='border']//xhtml:h1)" />

When I do the same logic to class=border section it work??
<xsl:copy-of  select="* except(//xhtml:div[@class='border'])" />

What I'm I missing, with the except for the removal of that section
h1???
Note: source code included.
Regards,

Michel

---------------   My StyleSheet
<xsl:strip-space elements="*"/>
<xsl:template match="xhtml:html" exclude-result-prefixes="xhtml" >

<root>
                        <content>
                                <xsl:apply-templates
select="//xhtml:div[@class='center']"  exclude-result-prefixes="xhtml"/>

                        </content>
</root>
</xsl:template>
<!--
=======================================================================
-->
<!--*****************************************-->
<!-- Content section just remove the right nav-->
  <xsl:template match ="//xhtml:div[@class='center']"
exclude-result-prefixes="xhtml">
                <!-- Right Nav first-->
                Remove h1
            <!-- THIS doesn't WORK, why????? -->
                        <xsl:copy-of  select="* except
(//xhtml:div[@class='border']//xhtml:h1)" />
            END of remove h1
            <!-- THIS WORK -->
               <xsl:copy-of  select="*
except(//xhtml:div[@class='border'])" />
  </xsl:template>
<!--*****************************************-->
</xsl:stylesheet>

---------------   My Source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "">
<html xmlns="http://www.w3.org/1999/xhtml"; lang="en" xml:lang="en">
<head>
</head>
<body>
<!--googleoff:all-->
<div class="page">
<div class="center">
<div class="border">
<h1>
<a name="cont" id="cont">
 Aviation Security </a>
 </h1>
<p>The Government of Canada has committed more than programs include the
following:</p>
</div>
</div>
</div>
</body>
</html>


======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================

Current Thread