xsl-list
[Top] [All Lists]

Re: XPath: selecting matching nodes in two node-sets

2003-10-20 04:44:42
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