How to get comma separated values as an array from a string?

Gayara Kumari 65 Reputation points
2023-01-24T09:33:13.94+00:00

We are using XSLT 1.0 mapping to transform one xml file to another xml.

We need to transform comma separated string into sequence of parent-child elements as below.

Input String

User's image

Expected Output

User's image

Please advise on this.

Thank You.

Developer technologies C#
{count} votes

Accepted answer
  1. Reza Aghaei 4,986 Reputation points MVP Volunteer Moderator
    2023-01-27T09:00:12.6+00:00

    Have you checked the following link:

    Split function in XLST1.0

    2 people found this answer helpful.

1 additional answer

Sort by: Most helpful
  1. Yitzhak Khabinsky 26,586 Reputation points
    2023-01-30T14:58:31.1333333+00:00

    Hi @Gayara Kumari,

    Please try the following solution.

    Input XML

    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    	<PONumber>100, 200, 770</PONumber>
    </root>
    
    

    XSLT 1.0

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    	<xsl:output method="xml" encoding="utf-8" indent="yes" omit-xml-declaration="no"/>
    	<xsl:strip-space elements="*"/>
    
    	<xsl:variable name="string" select="/root/PONumber"/>
    	<xsl:variable name="cnt" select="1"/>
    
    	<xsl:template match="/">
    		<OrderNumberCollection>
    			<xsl:call-template name="tokenize">
    				<xsl:with-param name="string" select="$string"/>
    				<xsl:with-param name="delim" select="','"/>
    				<xsl:with-param name="cnt" select="$cnt"/>
    			</xsl:call-template>
    		</OrderNumberCollection>
    	</xsl:template>
    
    	<xsl:template name="tokenize">
    		<xsl:param name="string"/>
    		<xsl:param name="delim"/>
    		<xsl:param name="cnt"/>
    
    		<xsl:choose>
    			<xsl:when test="contains($string, $delim)">
    				<OrderNumber>
    					<Sequence><xsl:value-of select="$cnt"/></Sequence>
    					<OrderReference>
    						<xsl:value-of select="normalize-space(substring-before($string, $delim))"/>
    					</OrderReference>
    				</OrderNumber>
    				<xsl:call-template name="tokenize">
    					<xsl:with-param name="string" select="substring-after($string, $delim)"/>
    					<xsl:with-param name="delim" select="$delim"/>
    					<xsl:with-param name="cnt" select="$cnt+1"/>
    				</xsl:call-template>
    			</xsl:when>
    			<xsl:otherwise>
    				<OrderNumber>
    					<Sequence><xsl:value-of select="$cnt"/></Sequence>
    					<OrderReference>
    						<xsl:value-of select="normalize-space($string)"/>
    					</OrderReference>
    				</OrderNumber>
    			</xsl:otherwise>
    		</xsl:choose>
    	</xsl:template>
    </xsl:stylesheet>
    
    

    Output XML

    <?xml version='1.0' encoding='utf-8' ?>
    <OrderNumberCollection>
      <OrderNumber>
        <Sequence>1</Sequence>
        <OrderReference>100</OrderReference>
      </OrderNumber>
      <OrderNumber>
        <Sequence>2</Sequence>
        <OrderReference>200</OrderReference>
      </OrderNumber>
      <OrderNumber>
        <Sequence>3</Sequence>
        <OrderReference>770</OrderReference>
      </OrderNumber>
    </OrderNumberCollection>
    
    3 people found this answer helpful.
    0 comments No comments

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.