Re: [xsl] Using contains with more than one string - XSLT2.0

Subject: Re: [xsl] Using contains with more than one string - XSLT2.0
From: "Michele R Combs mrrothen@xxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Wed, 28 Jan 2015 20:58:37 -0000
Beautiful!  Did not know about that one.  Many thanks, that appears to work
perfectly :)

Michele

-----Original Message-----
From: David Sewell dsewell@xxxxxxxxxxxx
[mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx]
Sent: Wednesday, January 28, 2015 3:36 PM
To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
Subject: Re: [xsl] Using contains with more than one string - XSLT2.0

If you're using XSLT 2, the function you want is matches() rather than
contains(). That allows you to use regular-expression syntax to express a
choice of strings to match. In this case you want

<xsl:for-each
select="//dsc//unittitle[matches(normalize-space(.),'Photo|Neg')]

or you can put the regular expression in your $target variable, so that simply
replacing "contains" with "matches" in your code below will work.

matches() is a lot more powerful than contains() because of its support for
regular expressions and case insensitivity (among other things).

David S.

  On Wed, 28 Jan 2015, Michele R Combs mrrothen@xxxxxxx wrote:

> I've done some googling on this but nothing seems quite to match what I want
to do.
>
> At the top of my style sheet I have this:
>
>   <xsl:variable name="target" select="'Photo'"/>
>
> Then later I do this to find all titles with that string in them:
>
>   <xsl:for-each
> select="//dsc//unittitle[contains(normalize-space(.),$target)]">
>
> So far so good, works great.  The problem comes when I want to tell the
contains function to match on any one of several strings, e.g. Photo or Neg or
Film.  So far I have tried the following but none of them work:
>
>   <xsl:variable name="target" select="'Photo|Neg'"/>
>   <xsl:variable name="target" select="'Photo'|'Neg'"/>
>   <xsl:variable name="target" select="'Photo' or 'Neg'"/>
>   <xsl:variable name="target" select="'Photo Neg'"/>
>
> If I must, I can stick the or'ed terms directly in the contains function
rather than using a variable, but when I tried a few variations on that, they
didn't work either.
>
> Thanks
>
> Michele
> +++++++++++++++
> Michele Combs
> Lead Archivist
> Special Collections Research Center
> Syracuse University Libraries
> 315-443-2081
> mrrothen@xxxxxxx
> scrc.syr.edu
>
>

--
David Sewell, Editorial and Technical Manager ROTUNDA, The University of
Virginia Press PO Box 400314, Charlottesville, VA 22904-4314 USA
Email: dsewell@xxxxxxxxxxxx   Tel: +1 434 924 9973
Web: http://rotunda.upress.virginia.edu/

Current Thread