[prev in list] [next in list] [prev in thread] [next in thread] 

List:       xsl-list
Subject:    Re: [xsl] XSLT for CSV to XML Conversion
From:       "Martin Honnen martin.honnen () gmx ! de" <xsl-list-service () lists ! mulberrytech ! com>
Date:       2019-02-16 16:35:57
Message-ID: 20190216113527.78008 () lists ! mulberrytech ! com
[Download RAW message or body]

On 15.02.2019 18:15, Rahul Singh rahulsinghindia15@gmail.com wrote:

> I wrote XSL code for CSV to XML conversion but i am not getting proper 
> output as for #Id 3 in XML. and, Also I need output as per given 
> expected output below.
> 
> Need yours help for given Input CSV, XSL Code, Current Output, Expected 
> Output please:
> 
> *Input CSV:*
> 
> <root>ID|Value|Number|descr1|descr2|descr3|descr4
> 1|AAAAA|1|aaaaaaaaaaa|aaaaaaaaaaa|aaaaaaaaaaa|aaaaaaaaaaa
> 2|AAAAA|2|aaaaaaaaaaa|aaaaaaaaaa|aaaaaaaa|aaaaaaaaaaaa
> 3|AAAAA|3|aaaaaaaaaaa
> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|aaaaaaaaaaa|aaaaaaaaaaa|aaaaaaaaaaa</root>
> 

> *Expected Output:*
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <root>
> <row>
> <ID>1</ID>
> <Value>AAAAA</Value>
> <Number>1</Number>
> <descr1>aaaaaaaaaaa</descr1>
> <descr2>aaaaaaaaaaa</descr3>
> <descr3>aaaaaaaaaaa</descr3>
> <descr4>aaaaaaaaaaa</descr4>
> </row>
> <row>
> <ID>2</ID>
> <Value>AAAAA</Value>
> <Number>2</Number>
> <descr1>aaaaaaaaaaa</descr1>
> <descr2>aaaaaaaaaa</descr2>
> <descr3>aaaaaaaa</descr3>
> <descr4>aaaaaaaaaaaa</descr4>
> </row>
> <row>
> <Id>3</Id>
> <Value>AAAAA</Value>
> <Number>3</Number>
> 
> <descr1>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</descr1>
>  <descr2>aaaaaaaaaaa</descr2>
> <descr3>aaaaaaaaaaa</descr3>
> <descr4>aaaaaaaaaaa</descr4>
> </row>
> </root>

It is not clear why you do not simply use the XPath 2 and later 
"tokenize" function to break up your text into record or row lines and 
each record or row into columns.

Here is a suggestion to to it in XSLT 3 (supported by Saxon 9.8 or later):

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:xs="http://www.w3.org/2001/XMLSchema"
	exclude-result-prefixes="#all"
	version="3.0">

   <xsl:output method="xml" indent="yes"/>

   <xsl:template match="root">
       <xsl:copy>
           <xsl:variable name="lines" as="xs:string*" 
select="tokenize(., '&#10;')"/>
           <xsl:variable name="cols" select="tokenize(head($lines), '\|')"/>
           <xsl:apply-templates select="tail($lines)" mode="row">
               <xsl:with-param name="cols" select="$cols"/>
           </xsl:apply-templates>
       </xsl:copy>
   </xsl:template>

   <xsl:template match=".[. instance of xs:string]" mode="row">
       <xsl:param name="cols"/>
       <row>
           <xsl:for-each select="tokenize(., '\|')">
               <xsl:element name="{let $p := position() return 
$cols[$p]}" expand-text="yes">{.}</xsl:element>
           </xsl:for-each>
       </row>
   </xsl:template>

</xsl:stylesheet>

Online sample at https://xsltfiddle.liberty-development.net/ncdD7m6
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/651070
or by email: xsl-list-unsub@lists.mulberrytech.com
--~--


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic