On 15.02.2019 18:15, Rahul Singh rahulsinghindia15(_at_)gmail(_dot_)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/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--