[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(., ' ')"/>
<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