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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] match by arbitrary number of , John Horner | Thread | Re: [xsl] match by arbitrary number, Andrew Welch |
[xsl] thumb index creation, Andreas Peter | Date | Re: [xsl] match by arbitrary number, Andrew Welch |
Month |