xslt

XSLT expression to check if variable belongs to set of elements


I have code like this:

  <xsl:if test="$k='7' or $k = '8' or $k = '9'">

Is there any way to put this expression in a form, like, for instance SQL

   k IN (7, 8, 9)

Ty :)


Solution

  • XSLT / XPath 1.0:

    <!-- a space-separated list of valid values -->
    <xsl:variable name="list" select="'7 8 9'" />
    
    <xsl:if test="
      contains( 
        concat(' ', $list, ' '),
        concat(' ', $k, ' ')
      )
    ">
      <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
    </xsl:if>
    

    You can use other separators if needed.

    In XSLT / XPath 2.0 you could do something like:

    <xsl:variable name="list" select="fn:tokenize('7 8 9', '\s+')" />
    
    <xsl:if test="fn:index-of($list, $k)">
      <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
    </xsl:if>
    

    If you can use document structure to define your list, you could do:

    <!-- a node-set defining the list of currently valid items -->
    <xsl:variable name="list" select="/some/items[1]/item" />
    
    <xsl:template match="/">
      <xsl:variable name="k" select="'7'" />
    
      <!-- test if item $k is in the list of valid items -->
      <xsl:if test="count($list[@id = $k])">
        <xsl:value-of select="concat('Item ', $k, ' is in the list.')" />
      </xsl:if>
    </xsl:template>