XSLT to IDoc-XML to Plain Text File

565 Views Asked by At

Recently I have a requirement where I need to convert Idoc-xml to plain text .txt file and transfer to external partner. I'm new to this XSLT programming , so any example or link will be very helpful.

My XML look like this:

<info>
 <Segment1>
  <Segment2>
   <Segment3>
    <PO>876522</PO>
   </Segment3>
   <Segment4>
    <Date>20171224</Date>
   </Segment4>
   <Segment5>
    <Invoice>312</Invoice>
   </Segment5>
  </Segment2>
 </Segment1>
 <Segment6>
  <Segment7>
   <Material>435-A90</Material>
   <Quatity>7</Quatity>
   <Price>12.00</Price>
   <Expiry>01.12.2020</Expiry>
   <Item>780AD09</Item>
   <Descp>Pencil-56AP</Descp>
  </Segment7>
 </Segment6>
 <Segment6>
  <Segment7>
   <Material>901-K78</Material>
   <Quatity>7</Quatity>
   <Price>12.00</Price>
   <Expiry>25.01.2028</Expiry>
   <Item>90KL76Y</Item>
   <Descp>Rubber-90AP</Descp>
  </Segment7>
 </Segment6>
 <Segment6>
  <Segment7>
   <Material>123-65D</Material>
   <Quatity>10</Quatity>
   <Price>67.00</Price>
   <Expiry>01.01.2020</Expiry>
   <Item>LOERF90</Item>
   <Descp>Pen-19EU</Descp>
  </Segment7>
 </Segment6>
</info>

And my expected output :

876522|24.12.2017|312|435-A90|7|12.00|01.12.2020|780AD09|Pencil-56AP
876522|24.12.2017|312|901-K78|7|12.00|25.01.2028|90KL76Y|Rubber-90AP
876522|24.12.2017|312|123-65D|10|67.00|01.01.2020|LOERF90|Pen-19EU

I need to loop on item level which is "Segment 6". Thank you very much.

1

There are 1 best solutions below

7
Rupesh_Kr On

Try this

    <?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    exclude-result-prefixes="xs"
    version="2.0">

    <xsl:output method="text"></xsl:output>

    <xsl:template match="/">
        <xsl:for-each select="//Segment6">
            <xsl:if test="position() != 1"><xsl:text>&#xA;</xsl:text></xsl:if>
            <xsl:value-of select="//Segment3/PO"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="//Segment4/replace(Date, '([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])', '$3.$2.$1')"/>
            <xsl:text>|</xsl:text>
            <xsl:value-of select="//Segment5/Invoice|Segment7/*" separator="|"/>
        </xsl:for-each>
    </xsl:template>

</xsl:stylesheet>