[xsl] Converting XML source to CSV output

Subject: [xsl] Converting XML source to CSV output
From: "Chris Pearson" <chrisp@xxxxxxxxxxx>
Date: Wed, 19 Sep 2001 14:41:08 -0400
Hi all.  A novice question that I can't seem to locate a solution for
...  I have an XML source that I need to convert to a text delimited
file.  

The xml source is:

<?xml version="1.0" encoding="UTF-8"?>
<DATA>
   <HEADER>
      <RECORD_A value="Header1 Record A" />
      <RECORD_B value="Header1 Record B" />
      <RECORD_n value="Header1 Record n" />
   </HEADER>
   <BODY>
      <BODY_RECORD_A value="Body1 Record A" />
      <BODY_RECORD_B value="Body1 Record B" />
      <BODY_RECORD_n value="Body1 Record n" />
      <DETAIL>
         <DET_RECORD_A value="Detail1 Record A" />
         <DET_RECORD_B value="Detail1 Record B" />
         <DET_RECORD_n value="Detail1 Record n" />
      </DETAIL>
      <DETAIL>
         <DET_RECORD_A value="Detail2 Record A" />
         <DET_RECORD_B value="Detail2 Record B" />
         <DET_RECORD_n value="Detail2 Record n" />
      </DETAIL>
   </BODY>
   <BODY>
      <BODY_RECORD_A value="Body2 Record A" />
      <BODY_RECORD_B value="Body2 Record B" />
      <BODY_RECORD_n value="Body2 Record n" />
      <DETAIL>
         <DET_RECORD_A value="Detail3 Record A" />
         <DET_RECORD_B value="Detail3 Record B" />
         <DET_RECORD_n value="Detail3 Record n" />
      </DETAIL>
      <DETAIL>
         <DET_RECORD_A value="Detail4 Record A" />
         <DET_RECORD_B value="Detail4 Record B" />
         <DET_RECORD_n value="Detail4 Record n" />
      </DETAIL>
   </BODY>
</DATA>

+++++++++++++++++++++++++++++++++++++++++++

My stylesheet is:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
   xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output method="text" media-type="text/plain" />
<xsl:strip-space elements="DATA HEADER BODY" />

<xsl:template match="DATA">
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="HEADER">
   <xsl:variable name="rec1" select="RECORD_A/@value" />
   <xsl:variable name="rec2" select="RECORD_B/@value" />
   <xsl:variable name="recn" select="RECORD_n/@value" />
   <xsl:variable name="Head_Line" 
      select="concat ($rec1, ',', $rec2, ',', $recn, ',')" />
   <xsl:value-of select="$Head_Line" />
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="BODY">
   <xsl:variable name="bodya" select="BODY_RECORD_A/@value" />
   <xsl:variable name="bodyb" select="BODY_RECORD_B/@value" />
   <xsl:variable name="bodyn" select="BODY_RECORD_n/@value" />
   <xsl:variable name="Body_Line" 
      select="concat ($bodya, ',', $bodyb, ',', $bodyn, ',')" />
   <xsl:value-of select="$Body_Line" />
   <xsl:apply-templates />
</xsl:template>

<xsl:template match="DETAIL">
   <xsl:variable name="deta" select="DET_RECORD_A/@value" />
   <xsl:variable name="detb" select="DET_RECORD_B/@value" />
   <xsl:variable name="detn" select="DET_RECORD_n/@value" />
   <xsl:variable name="Detail_Line" 
      select="concat ($deta, ',', $detb, ',', $detn)" />
   <xsl:value-of select="$Detail_Line" />
   <xsl:apply-templates />
</xsl:template>

</xsl:stylesheet>

++++++++++++++++++++++++++++++++++++++

And, my output is:

Header1 Record A,Header1 Record B,Header1 Record n,Body1 Record A,Body1
Record B,Body1 Record n,Detail1 Record A,Detail1 Record B,Detail1 Record
n
         
         
         
      Detail2 Record A,Detail2 Record B,Detail2 Record n
         
         
         
      Body2 Record A,Body2 Record B,Body2 Record n,Detail3 Record
A,Detail3 Record B,Detail3 Record n
         
         
         
      Detail4 Record A,Detail4 Record B,Detail4 Record n
         
++++++++++++++++++++++++++++++++++++++

What I want is:

Header1 Record A,Header1 Record B,Header1 Record n,Body1 Record A,Body1
Record B,Body1 Record n,Detail1 Record A,Detail1 Record B,Detail1 Record
n
Header1 Record A,Header1 Record B,Header1 Record n,Body1 Record A,Body1
Record B,Body1 Record n,Detail2 Record A,Detail2 Record B,Detail2 Record
n
Header1 Record A,Header1 Record B,Header1 Record n,Body2 Record A,Body2
Record B,Body2 Record n,Detail3 Record A,Detail3 Record B,Detail3 Record
n
Header1 Record A,Header1 Record B,Header1 Record n,Body2 Record A,Body2
Record B,Body2 Record n,Detail4 Record A,Detail4 Record B,Detail4 Record
n

I'm having 2 issues:

1) How to repeat the header (and Body data) for detail records
2) How to format it without extra white space

Is my approach flawed?  Any and all suggestions, comments, criticisms or
random postulations welcomed.  Thanks in advance!

Chris


         
         


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread