xsl-list
[Top] [All Lists]

RE: [xsl] match by arbitrary number of criteria

2007-06-04 02:30:49
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(_dot_)John(_at_)abc(_dot_)net(_dot_)au] 
Sent: 04 June 2007 07:11
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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 
==============================================================
================

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: 
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--

<Prev in Thread] Current Thread [Next in Thread>