xsl-list
[Top] [All Lists]

Re: [xsl] XSLT for CSV to XML Conversion

2019-02-16 10:35:33
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(., '&#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/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--

<Prev in Thread] Current Thread [Next in Thread>