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