Re: [xsl] XPath: selecting matching nodes in two node-sets

Subject: Re: [xsl] XPath: selecting matching nodes in two node-sets
From: Dimitre Novatchev <dnovatchev@xxxxxxxxx>
Date: Mon, 20 Oct 2003 04:44:42 -0700 (PDT)
> I have the following document:
> 
> <results> 
> 	<keywords> 
> 		<matches> ...</matches>
> 		...
> 	</keywords> 
> 	<item> 
> 		...various elements...
> 		<matches> ...</matches>
> 		<matches> ...</matches>
> 		...
> 	</item> 
> 	<item> ....</item>
> 	...
> </results> 
> 
> (where <matches>  elements contain the keywords themselves, CDATA).
> 
> and what I need is an XPath expression which selects all the <item> s 
> which have the same set of <matches />  elements as in the <keywords> 
> node.
> (Note: there may be repetition of <matches /> s in <item>s but not in 
> <keywords> )

This transformation:

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
 
 <xsl:output omit-xml-declaration="yes" indent="yes"/>

  <xsl:template match="/">
  
    <xsl:variable name="vItems" select="/*/item"/>
    <xsl:for-each select="$vItems">
      <xsl:copy-of select=
       "self::*
          [not(/*/keywords/matches
                  [not(. = current()/matches)]
              )
         and
           not(matches[not(. = /*/keywords/matches)])  
          ]"/>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

when applied on this source.xml (,which I find representative for your
problem):

<results>
  <keywords>
    <matches>k1</matches>
    <matches>k2</matches>
    <matches>k3</matches>
    <matches>k4</matches>
    <matches>k5</matches>
  </keywords>
  <item> 
    <matches>k3</matches>
    <matches>k5</matches>
  </item>
  <item>
    <matches>k4</matches>
    <matches>k2</matches>
    <matches>k3</matches>
    <matches>k1</matches>
    <matches>k5</matches>
  </item>
  <item>
    <matches>k1</matches>
    <matches>k2</matches>
    <matches>k3</matches>
    <matches>k6</matches>
    <matches>k5</matches>
    <matches>k4</matches>
  </item>
  <item> 
    <matches>k1</matches>
    <matches>k6</matches>
  </item>
  <item>
    <matches>k3</matches>
    <matches>k5</matches>
    <matches>k3</matches>
    <matches>k2</matches>
    <matches>k1</matches>
    <matches>k2</matches>
    <matches>k4</matches>
    <matches>k5</matches>
  </item>
</results>

produces the wanted result:

<item>
    <matches>k4</matches>
    <matches>k2</matches>
    <matches>k3</matches>
    <matches>k1</matches>
    <matches>k5</matches>
  </item>
<item>
    <matches>k3</matches>
    <matches>k5</matches>
    <matches>k3</matches>
    <matches>k2</matches>
    <matches>k1</matches>
    <matches>k2</matches>
    <matches>k4</matches>
    <matches>k5</matches>
  </item>






=====
Cheers,

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

__________________________________
Do you Yahoo!?
The New Yahoo! Shopping - with improved product search
http://shopping.yahoo.com

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


Current Thread