Re: [xsl] Q: Kaysian set difference in pure XPath statement

Subject: Re: [xsl] Q: Kaysian set difference in pure XPath statement
From: Hermann Stamm-Wilbrandt <STAMMW@xxxxxxxxxx>
Date: Thu, 24 Mar 2011 22:50:31 +0100
Michael, Wendell,

thanks for your responses.

The question was not on implementation but on demonstration.

> What (apart from efficiency) is wrong with
>
> //*[count(. | //*/*) != count(//*/*)]

Michael, thanks, this works perfect.
I have no idea what I did wrong before my email ...

$ echo "<a><b><c/></b><b><c/><c/></b></a>" | \
> xpath++ "//*[count(. | //*/*) != count(//*/*)]" -

-------------------------------------------------------------------------------
<a><b><c/></b><b><c/><c/></b></a>
$


Mit besten Gruessen / Best wishes,

Hermann Stamm-Wilbrandt
Developer, XML Compiler, L3
Fixpack team lead
WebSphere DataPower SOA Appliances
https://www.ibm.com/developerworks/mydeveloperworks/blogs/HermannSW/
----------------------------------------------------------------------
IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martin Jetter
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294



From:       Michael Kay <mike@xxxxxxxxxxxx>
To:         xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Date:       03/24/2011 10:18 PM
Subject:    Re: [xsl] Q: Kaysian set difference in pure XPath statement



On 24/03/2011 20:33, Hermann Stamm-Wilbrandt wrote:
> Hello,
>
> I saw a question on what "//*/*" means.
> The answer is simple, all nodes beside the root element node.
>
> This can be easily seen by this XPath expression:
> $ echo "<a><b><c/></b><b><c/><c/></b></a>" | xpath++ "count(//*)-count
> (//*/*)" -
> 1
> $
>
> Now I wanted to use Kaysian set difference method to output the
> node in "//*" which is not in "//*/*", see 1a on this page:
>
http://www.xml.org//sites/www.xml.org/files/xslt_efficient_programming_techniques.pdf#page=3

>
> But here two nodesets ($ns1, $ns2) are determined first before
determining
> the set (asymmetric) difference as "$ns1[count(.|$ns2)!=count($ns2)]".
>
> Is it possible to have that as pure XPath statement?

You're using "pure XPath" to mean "XPath 1.0", which seems a bit odd to
my ears....
> The problem is to jump out of the scope of "//*[. ...]".

What (apart from efficiency) is wrong with

//*[count(. | //*/*) != count(//*/*)]

(Though it's not clear why you can't just write /*)

Michael Kay
Saxonica
>
> This does not work correctly:
> $ echo "<a><b><c/></b><b><c/><c/></b></a>" | xpath++ "//*[count(.|
> ancestor-or-self::*//*/*)!=count(ancestor-or-self::*//*/*)]" -
>
>
-------------------------------------------------------------------------------

> <a><b><c/></b><b><c/><c/></b></a>
>
-------------------------------------------------------------------------------

> <b><c/></b>
>
-------------------------------------------------------------------------------

> <b><c/><c/></b>
> $
>
>
> What is the correct XPath statement for "//* minus //*/*"?
>
>
> [1]
>
https://www.ibm.com/developerworks/forums/thread.jspa?messageID=14511881#145

> 11881
>
>
> Mit besten Gruessen / Best wishes,
>
> Hermann Stamm-Wilbrandt
> Developer, XML Compiler, L3
> Fixpack team lead
> WebSphere DataPower SOA Appliances
> https://www.ibm.com/developerworks/mydeveloperworks/blogs/HermannSW/
> ----------------------------------------------------------------------
> IBM Deutschland Research&  Development GmbH
> Vorsitzender des Aufsichtsrats: Martin Jetter
> Geschaeftsfuehrung: Dirk Wittkopp
> Sitz der Gesellschaft: Boeblingen
> Registergericht: Amtsgericht Stuttgart, HRB 243294

Current Thread