Search code examples
xsltappendsoabpel

XSLT to join elements bpel


I have an input

<features>
<feature name="Television" featureSpecID="2000">
    <displayName>TV</displayName>
    <parameters>
        <parameter name="Remote" >
        </parameter>
        <parameter name="Cable Box">
        </parameter>
        <parameter name="Carrier"/>
    </parameter>
</parameters>

where I should convert as

<productname>Remote;Cable Box;Carrier</productname>

I tried my code by doing for-each of parameter

<xsl:if test='count(tns:parameters/tns:parameter) > "0"'>
    <xsl:for-each select="tns:parameters/tns:parameter">
       <productname>
         <xsl:value-of select='concat(@name,";")'/>
        </productname>
    </xsl:for-each>
 </xsl:if>

Solution

  • The <productname> node should be outside the <xsl:for-each> loop. Please modify it as below

    <productname>
        <xsl:for-each select="tns:parameters/tns:parameter">
            ...
        </xsl:for-each>
    </productname>
    

    A condition needs to be added to not append the semi-colon at the end of the product names according to sample output.

    <xsl:if test="position() != last()">
        <xsl:value-of select="';'"/>
    </xsl:if>
    

    XSLT code change

    <productname>
        <xsl:for-each select="tns:parameters/tns:parameter">
            <xsl:value-of select="@name" />
            <xsl:if test="position() != last()">
                <xsl:value-of select="';'"/>
            </xsl:if>
        </xsl:for-each>
    </productname>
    

    Output

    <productname>Remote;Cable Box;Carrier</productname>