Re: [xsl] Defining variables as sequence of strings

Subject: Re: [xsl] Defining variables as sequence of strings
From: "Joseph L. Casale jcasale@xxxxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Thu, 14 May 2015 00:57:05 -0000
> I typically recommend to avoid using explicit XSLT conditional
> instructions. This said, here is an example as requested:

Hi Dimitre,
Thanks for the recommendation, I am certainly inclined to take your
advice however just so I understand can you elaborate on why?

> <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>  <xsl:output method="text"/>
>  <xsl:template match="/*">
>    <xsl:variable name="vDays" as="xs:string*" >
>      <xsl:choose>
>         <xsl:when test=". eq 'Biology'">
>            <xsl:sequence select="'Monday', 'Thursday'"/>
>         </xsl:when>
>         <xsl:when test=". eq 'Math'">
>            <xsl:sequence select="'Tuesday', 'Friday'"/>
>         </xsl:when>
>      </xsl:choose>
>    </xsl:variable>
>
>    <xsl:sequence select="string-join($vDays, ' and ')"/>
>  </xsl:template>
> </xsl:stylesheet>

That was my first crack, but as it iterates through nodes I need to add
each occurrence to the sequence.

> This can also be written in a shorter way as:
>
> <xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
>  xmlns:xs="http://www.w3.org/2001/XMLSchema";>
>  <xsl:output method="text"/>
>  <xsl:template match="/*">
>    <xsl:variable name="vDays" as="xs:string*" select=
>     "if(. eq 'Biology')
>         then ('Monday', 'Thursday')
>         else if (. eq 'Math')
>           then ('Tuesday', 'Friday')
>           else () "/>
>
>    <xsl:sequence select="string-join($vDays, ' and ')"/>
>  </xsl:template>
> </xsl:stylesheet>

I ended up not worrying about XSLT 1 support for the moment until
I revisit it and used:

    <xsl:variable name="MyVar" as="xs:string *">
      <xsl:sequence select="for $t in distinct-values(/object/property/@type)
return
                    if ($t='foo')
                      then 'a'
                    else if ($t='bar' or $t='baz' or $t='bof')
                      then 'b'
                    else 'c'" />
    </xsl:variable>

    <xsl:for-each select="distinct-values($MyVar)">
      <xsl:sort select="." />
      <xsl:text>...</xsl:text>
      <xsl:value-of select="." />
      <xsl:text>;&#x0D;&#x0A;</xsl:text>
    </xsl:for-each>

Thanks a lot Dimitre,
jlc

Current Thread