[ask]xml to flat file

dear all,

i need your advice, i have xml file like this
input.xml

<?xml version="1.0" encoding="UTF-8"?>
<session xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<capture>
	<atribut name="tmp_Filename" value="INTest.rbs"/>
	<atribut name="size_Filename" value="INTest.rbs"/>
	<content destination="TXT_P2P" direction="MFH" encrypted="3DES, with compression" group="192.168.3.252" source="192.168.3.1" sourceMessageSize="170" transaction="3446429495">
		<note>
		<to>Tove</to>
		<from>Jani</from>
		<heading>Reminder</heading>
		<body>Don't forget me this weekend!</body>
		</note>
	</content>
<capture>
<capture>
	<atribut name="tmp_Filename" value="INTest2.rbs"/>
	<atribut name="size_Filename" value="INTest2.rbs"/>
	<content careof="S66955165" content="TXT_IM" destination="192.168.3.1" direction="MTH" encrypted="3DES, with compression" source="BBM_P2P" sourceMessageSize="74" transaction="2339604654">
		<note>
		<to>Jack</to>
		<from>JTove</from>
		<heading>Reminder</heading>
		<body>Ok</body>
		</note>
	</content>
<capture>
</session>

so i want output file like this.

output.txt

INTest.rbs|INTest.rbs|TXT_P2P|MFH|3DES, with compression|192.168.3.252|192.168.3.1|170|3446429495|Tove|Jani|Reminder|Don't forget me this weekend!
INTest2.rbs|INTest2.rbs|TXT_IM|192.168.3.1|MTH|3DES, with compression|BBM_P2P|74|2339604654|Jack|JTove|Reminder|Ok

how i can filter thats xml like output...any one can explain using awk or sed

thx before.

One solution is 1st to make all attributes to elements.

xml2elements.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:output indent="yes" />

<xsl:strip-space elements="*" />

<xsl:template match="*">
<xsl:copy>
   <xsl:if test="@*">
       <xsl:for-each select="@*">
	  <xsl:element name="{name()}">
	      <xsl:value-of select="." />
	  </xsl:element>
       </xsl:for-each>
   </xsl:if>
   <xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
# convert into elements
xsltproc xml2elements.xsl example.xml > example.2.xml

Convert xml to csv
xml2csv.xsl

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>

<xsl:param name="delim" select="';'" />
<xsl:param name="break" select="'
'" /><!-- xA = NL, xD = CR -->
<xsl:param name="colnames" select="'y'"/>

<xsl:strip-space elements="*" />


<xsl:template match="/*/child::*">
<!--headerline-->
<xsl:if test="$colnames = 'y'">
  <xsl:if test="position() = 1">
      <xsl:for-each select="child::*">
	     <xsl:value-of select="name()"/>
             <xsl:if test="position() != last()">
	           <xsl:value-of select="$delim"/>
             </xsl:if>
      </xsl:for-each>
      <!-- hardcode version newline -->
	<!--<xsl:text>
</xsl:text>-->
      <!-- linebreak, nicer -->
      <xsl:value-of select="$break" />
  </xsl:if>
</xsl:if>


<!--dataline-->
<xsl:for-each select="child::*">

<xsl:if test="position() != last()"><xsl:value-of select="normalize-space(.)"/>
	  <xsl:value-of select="$delim" />
</xsl:if>

<xsl:if test="position()  = last()"><xsl:value-of select="normalize-space(.)"/>
	  <xsl:value-of select="$break" />
</xsl:if>

</xsl:for-each>
</xsl:template>

</xsl:stylesheet>

Examples to use:

# convert into elements
xsltproc xml2elements.xsl example.xml > example.2.xml
# convert into csv, using default parameters
xsltproc xml2csv.xsl example.2.xml
# convert into csv, without column names
xsltproc -param colnames n xml2csv.xsl example.2.xml
# convert using delimiter | and without colnames
xsltproc -param colnames n -stringparam delim "|" xml2csv.xsl example.2.xml

I'm not xslt heavy user, found lot of examples and done those versions.

Sometimes also need to remove/flat/... before making csv. Here is some example to edit xml data.
remove.xsl

<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

   <xsl:output indent="yes" />
   <xsl:strip-space elements="*" />

   <!-- default copy all node -->
   <xsl:template match="@*|node()">
     <xsl:copy>
       <xsl:apply-templates select="@*|node()"/>
     </xsl:copy>
   </xsl:template>

   <!-- template for the document element -->
   <!-- = remove root node -->
   <xsl:template match="/*">
     <xsl:apply-templates select="node()" />
   </xsl:template>

  <!-- remove attributes  <xxx attr="some">value</xxx> -->
  <xsl:template match="@attr"/>
  <xsl:template match="@format"/>
  <xsl:template match="@author"/>


  <!-- remove element  <xxx>value</xxx> -->
  <xsl:template match="xxx"/>
  <xsl:template match="country"/>

  <!-- remove only element childs <xxx><child1>val</child1></xxx> -->
  <xsl:template match="xxx/*"  />

   <!-- move children element value for mother and remove child = more flat, 
           less hierarchical -->
   <xsl:template match="subnode/*">
     <xsl:apply-templates select="node()" />
   </xsl:template>

   <!-- remove some element but leave the child = more flat, less hierarchical -->
   <xsl:template match="some">
     <xsl:apply-templates select="node()" />
   </xsl:template>

   <!-- remove some data based on attribute value -->
   <xsl:template match="product[@id='p6']" />

   <!-- remove comments -->
   <xsl:template match="comment()"/>

   <!-- rename element name=>itemname -->
   <xsl:template match="name">
    <itemname>
      <xsl:apply-templates select="@*|node()"/>
    </itemname>
   </xsl:template>

</xsl:stylesheet>

Or use keyword awk xml to search many example in this forum.

thx for advice,

now i want to output xml like this:

<capture><atribut name="tmp_Filename" value="INTest.rbs"/><atribut name="size_Filename" value="INTest.rbs"/><note><to>Tove</to><from>Jani</from>/capture>
<capture><atribut name="tmp_Filename" value="INTest2.rbs"/><atribut name="size_Filename" value="INTest2.rbs"/><note><to>Jack</to><from>JTove</from><heading>Reminder</heading></note/></content>

from my input cause i want read line by line with this model

thx before