Re: [xsl] Using "except" where some nodes are copies (not the original)?

Subject: Re: [xsl] Using "except" where some nodes are copies (not the original)?
From: Michael Kay <mike@xxxxxxxxxxxx>
Date: Thu, 29 Dec 2011 09:57:01 +0000
replace ($X except $Y) by

$X[not(some $y in $Y satisfies deep-equal(., $y))]

It's likely to be an expensive operation.

Michael Kay
Saxonica


On 28/12/2011 23:17, Costello, Roger L. wrote:
Hi Folks,

How do I do set subtraction where some of the nodes in the two sets may be copies (not originals)?

Please allow me to explain.

Consider this XML document:

<Test>
     <A/>
     <B/>
     <C/>
</Test>

Set<Test> as the context node.

This operation:

(A, B,, C) except (B, C)

returns:

(A)

Nice.

Now, make a copy of B and store it into a variable:

       <xsl:variable name="B" as="element(B)">
                 <xsl:copy-of select="B" />
        </xsl:variable>

Run the same operation, but using the variable:

(A, B, C) except ($B, C)

Returns:

(A, B)

Ouch!

I don't want that behavior. I want:

(A, B, C) except ($B, C)

to return:

(A)

How do I achieve the behavior I desire?

That is, how do I do set subtraction where some of the nodes in the two sets may be copies?

/Roger

Current Thread