RE: [xsl] match by arbitrary number of criteria

Subject: RE: [xsl] match by arbitrary number of criteria
From: "Michael Kay" <mike@xxxxxxxxxxxx>
Date: Mon, 4 Jun 2007 09:39:54 +0100
You're misusing the contains() function here: instead of contains(subjects,
$included) you should do subjects/subject=$included which returns true if
any of the subject children is equal to $included.

Note that when comparing two node-sets $s1 = $s2 the result is true if there
is some node in $s1 that is equal to some node in $s2. So you want: 


<xsl:variable name="s" select="subjects/subject"/>
<xsl:variable name="i" select="$config//included/subject"/>
<xsl:variable name="e" select="$config//excluded/subject"/>

then 

... not($i[not($s = .)]) and not($e = $s)

Michael Kay
http://www.saxonica.com


> -----Original Message-----
> From: John Horner [mailto:Horner.John@xxxxxxxxxx] 
> Sent: 04 June 2007 07:11
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> Subject: [xsl] match by arbitrary number of criteria
> 
> I've got XML roughly like this:
> 
> <items>
> 	<item>
> 		<name>foo</name>
> 		<subjects>
> 			<subject>Science</subject>
> 			<subject>Politics</subject>
> 			<subject>History</subject>
> 		</subjects>
> 	</item>
> 	<item>
> 		<name>bar</name>
> 		<subjects>
> 			<subject>Science</subject>
> 			<subject>History</subject>
> 			<subject>Art</subject>
> 		</subjects>
> 	</item>
> </items>
> 
> Where each item, as you can see, is categorised.
> 
> I'm transforming them, using parameters for inclusion and 
> exclusion, roughly like this:
> 
> <xsl:stylesheet version="1.0"
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 	<xsl:param name="included" select="'Science'"/>
> 	<xsl:param name="excluded" select="'Politics'"/>
> 	<xsl:template match="//item">
> 		<xsl:if test="contains(subjects,$included) and 
> not(contains(subjects,$excluded))">
> 			<xsl:value-of select="name"/>
> 		</xsl:if>
> 	</xsl:template>
> </xsl:stylesheet>
> 
> Which selects "bar", because its subjects match the included 
> string and don't match the excluded string.
> 
> So, all well and good if I only ever have one of each, but 
> now I need to add more. What if I might have any number of 
> inclusions and exclusions?
> Say I had a config file like this:
> 
> <config>
> 	<included>
> 		<subject>Science</subject>
> 		<subject>History</subject>
> 	</included>
> 	<excluded>
> 		<subject>Politics</subject>
> 	</excluded>
> </config>
> 
> Allowing an arbitrary number of inclusions and exclusions, 
> how would I efficiently test each item?
> 
> 
> 
> ==============================================================
> ================
> The information contained in this email and any attachment is 
> confidential and
> may contain legally privileged or copyright material.   It is 
> intended only for
> the use of the addressee(s).  If you are not the intended 
> recipient of this email, you are not permitted to 
> disseminate, distribute or copy this email or any 
> attachments.  If you have received this message in error, 
> please notify the sender immediately and delete this email 
> from your system.  The ABC does not
> represent or warrant that this transmission is secure or 
> virus free.   Before
> opening any attachment you should check for viruses.  The 
> ABC's liability is limited to resupplying any email and 
> attachments 
> ==============================================================
> ================

Current Thread