[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: set:intersection oddity

Subject: Re: set:intersection oddity
From: "Dimitre Novatchev" <dnovatchev@xxxxxxxxx>
Date: Sat, 28 Jun 2003 22:55:36 +0200
set intersect
"John Sharp" <jsharp@xxxxxx> wrote in message
news:3EFDED78.290F7F48@xxxxxxxxx
> Hello, I was attempting to use the set:intersection function
> from http://exslt.org/sets.  The examples showing the intersection
> of cities with letters 'i' and 'e' work as given. However the
> following does not work - INTERSECT1 is always empty.

As it should be.

You do not understand the definition of set:intersection().

The specification of this function says: "The set:intersection function
returns a node set comprising the nodes that are within both the node sets
passed as arguments to it. "

http://www.exslt.org/set/functions/intersection/index.html

That is, the equality-operation used in defining set:intersection() has
node-identity semantics and not node-value semantics.

>   <INTERSECT1>
>     <xsl:copy-of select="set:intersection($data,$rules)"/>
>   </INTERSECT1>

In your example below, the nodes in the $data and $rules are two distinct
root nodes, they are not the same node, therefore

set:intersection($data, $rules) must return the empty node-set.

>   <INTERSECT2>
>     <xsl:copy-of select="set:intersection($data,$data)"/>
>   </INTERSECT2>

This intersects the root node contained in $data with itself -- therefore
this is equivalent to:

    <xsl:copy-of select="$data"/>

and must output the whole tree contained in $data, which is exactly what you
got.

>   <INTERSECT3>
>     <xsl:copy-of select="$data[count(. | $rules) != count( $rules)]"/>
>   </INTERSECT3>
>

Here you want to xsl-copy  all the nodes of $data (and this is just its root
node) that are not identical to some of the nodes (just the root node) of
$rules. As these are two distinct root nodes, the above is again equivalent
to:

    <xsl:copy-of select="$data"/>

An example, which will "work" is the following:

  <xsl:copy-of select="set:intersection($rules/*, $rules/*[position() mod 2
= 0])"/>

This will intersect all the children of the root node with the ones that
have an even position() and will xsl:copy-of the element $rules/*[2]


Note to confused readers -- the OP has specified version="1.1" on the
xsl:stylesheet instruction, this is why we do not need to convert RTFs to
regular trees.


=====
Cheers,

Dimitre Novatchev.
http://fxsl.sourceforge.net/ -- the home of FXSL



>
> <xsl:stylesheet
>   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
>   xmlns:saxon="http://saxon.sf.net/"
>   xmlns:set="http://exslt.org/sets"
>   extension-element-prefixes="set saxon"
> version="1.1">
>
> <xsl:template match="/">
>
>   <xsl:variable name="data">
>     <Type>PMT</Type>
>     <Type>FUNC</Type>
>   </xsl:variable>
>
>   <xsl:variable name="rules">
>     <Type>PMT</Type>
>     <Type>DC_PARA</Type>
>     <Type>FUNC</Type>
>   </xsl:variable>
>
>
>   <INTERSECT1>
>     <xsl:copy-of select="set:intersection($data,$rules)"/>
>   </INTERSECT1>
>
>   <INTERSECT2>
>     <xsl:copy-of select="set:intersection($data,$data)"/>
>   </INTERSECT2>
>
>   <INTERSECT3>
>     <xsl:copy-of select="$data[count(. | $rules) != count( $rules)]"/>
>   </INTERSECT3>
>
> </xsl:template>
>
>
> Here's the output:-
>
> <?xml version="1.0" encoding="UTF-8"?>
> <INTERSECT1/>
> <INTERSECT2>
>    <Type>PMT</Type>
>    <Type>FUNC</Type>
> </INTERSECT2>
> <INTERSECT3>
>    <Type>PMT</Type>
>    <Type>FUNC</Type>
> </INTERSECT3>Execution time: 336 milliseconds
>
>
> If I run the exslt web page example, it runs fine.
>
> Kind regards,John.
>
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
>
>




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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.