Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

building an XSLT string (variable) in a foreach loop

The problem I'm facing seems simple, but being a novice in everything XSL - I'm yet to find a proper solution. What I want to do is build a string by concatenating the results of a foreach element loop, that I can later on use as a value for an attribute of a HTML element.

Given:

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
    <cd>
        <country>UK</country>
        <company>CBS Records</company>
    </cd>
    <cd>
        <country>USA</country>
        <company>RCA</company>
    </cd>
    <cd>
        <country>UK</country>
        <company>Virgin records</company>
    </cd>
</catalog>

Desired output: CBS;RCA;Virgin records

I need a valid portion of XSLT code that would perform this transformation in a way described above. I believe I need an xsl-variable that would hold the result of concatenating <company> and a separator character ;. How can this be done? Thank you.

like image 981
electroglow Avatar asked Aug 12 '12 01:08

electroglow


2 Answers

I don't believe you can use XSL variables to concatenate, because once a variable value is set, it can't be changed. Instead, I think you want something like:

<xsl:for-each select="catalog/cd">
    <xsl:choose>
        <xsl:when test="position() = 1">
            <xsl:value-of select="country"/>
        </xsl:when>
        <xsl:otherwise>
            ;<xsl:value-of select="country"/>
        </xsl:otherwise>
    </xsl:choose>
</xsl:for-each>

Does that make sense to you?

Edit: Just realized I may have misread how you were intending to use the variable. The snippet I posted above can be wrapped in a variable element for later use, if that's what you meant:

<xsl:variable name="VariableName">
    <xsl:for-each select="catalog/cd">
        <xsl:choose>
            <xsl:when test="position() = 1">
                <xsl:value-of select="country"/>
            </xsl:when>
            <xsl:otherwise>
                ;<xsl:value-of select="country"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:for-each>
</xsl:variable>
like image 190
Erika E Avatar answered Sep 20 '22 06:09

Erika E


If you can use XSLT 2.0 then either of the following would work:

Use the string-join() function:

<xsl:variable name="companies" select="string-join(catalog/cd/company, ';')" />

Use @separator with xsl:value-of:

<xsl:variable name="companies" >
   <xsl:value-of select="catalog/cd/company" separator=";" />
</xsl:variable>
like image 45
Mads Hansen Avatar answered Sep 20 '22 06:09

Mads Hansen