XPath/XSLT contains() for multiple strings
Solution 1
Assuming that you're looking to do a logical OR of substring containment...
First of all, this select
is likely wrong1:
<xsl:variable name="games" select="footballvolleyballchesscarrom"/>
It's looking for an element named footballvolleyballchesscarrom
. If you're trying to set games to the string footballvolleyballchesscarrom
, change it to this:
<xsl:variable name="games" select="'footballvolleyballchesscarrom'"/>
Then, use either
XSLT 1.0
<xsl:when test="contains($games,'chess')
or contains($games,'carrom')">CORRECT</xsl:when>
or
XSLT 2.0
<xsl:when test="matches($games,'chess|carrom')">CORRECT</xsl:when>
to test whether $games
contains one of your multiple substrings.
1 If you really intended to select (possibly multiple) elements from the input XML here, there is another XSLT 2.0 option for testing the selected sequence against a set of possible values. If your input XML were, say,
<games>
<game>football</game>
<game>volleyball</game>
<game>chess</game>
<game>carrom</game>
</games>
then this template,
<xsl:template match="/">
<xsl:variable name="games" select="//game"/>
<xsl:if test="$games = ('chess','carrom')">CORRECT</xsl:if>
</xsl:template>
would output CORRECT
because among the string values of the selected elements is at least one of chess
or carrom
.
Solution 2
I think multiple variables will not work with contains method. As per the defination:
boolean contains(str1, str2)
str1 : A string that might contain the second argument. str2: A string that might be contained in the first argument.
Refer : https://msdn.microsoft.com/en-us/library/ms256195(v=vs.110).aspx
You can use or operator:
<xsl:when test="contains($games,'chess') or contains($games,'carrom')">CORRECT</xsl:when>
Black Pearl
Updated on June 04, 2022Comments
-
Black Pearl almost 2 years
Does
contains()
work for multiple words stored in a variable? Will the below one work? If it won't work, please help me with a solution.<xsl:variable name="games" select="footballvolleyballchesscarrom"/> <xsl:when test="contains($games,'chess,carrom')">CORRECT</xsl:when>
-
Lingamurthy CS almost 7 yearsYour variable declaration isn't right. The string in
@select
must be quoted else would try to match an element with that name. Can you use XSLT-2.0? Using regular expressions for matching here would be simpler.
-
-
Michael Kay almost 7 yearsOf course, if your intended meaning was that it must contain both words, then you can replace "or" with "and" in the first solution. You didn't actually say what your requirements were.
-
Lingamurthy CS almost 7 yearsLet's hear it from the OP, Dr. Kay :)