Reputation: 11
I have the following XML code, and need to convert this to a .csv file. I don't need the whole xml file, but i have to select some xml tags.
<contract_Set>
<contract_period>
<reference>111111</reference>
<startperiod>2017-09-01</startperiod>
<endperiod>2017-09-06</endperiod>
<vehicle_Set>
<vehicle>
<vehicle_id>4444</vehicle_id>
<make>Mercedes-Benz</make>
</vehicle>
</vehicle_Set>
<invoice_Set>
<invoice>
<id>12345</id>
<description>Some text</description>
</invoice>
</invoice_Set>
<invoice_Set>
<invoice>
<id>12222</id>
<description>More text</description>
</invoice>
</invoice_Set>
</contract_period>
<contract_period>
<reference>222222</reference>
<startperiod>2017-09-01</startperiod>
<endperiod>2017-09-30</endperiod>
<vehicle_Set>
<vehicle>
<vehicle_id>55555</vehicle_id>
<make>Audi</make>
</vehicle>
</vehicle_Set>
<invoice_Set>
<invoice>
<id>45678</id>
<description>Audi text</description>
</invoice>
</invoice_Set>
</contract_period></contract_Set>
I need my output to be like:
Reference;Make;Invoice_Id;Invoice_Description
111111;Mercedes-Benz;12345;Some text
111111;Mercedes-Benz;12222;More text
222222;Audi;45678;Audi text
How can i do this with XSLT 1.0? I have searched for solutions in similar questions, but no success. I'm looking to select values of some tags, not all tags.
Upvotes: 0
Views: 7364
Reputation: 3247
The following XSL will provide the desired output.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:variable name="separator" select="';'" />
<xsl:variable name="newline" select="' '" />
<xsl:template match="/">
<xsl:text>Reference;Make;Invoice_Id;Invoice_Description</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="//invoice_Set">
<xsl:value-of select="../reference" />
<xsl:value-of select="$separator" />
<xsl:value-of select="../vehicle_Set/vehicle/make" />
<xsl:value-of select="$separator" />
<xsl:value-of select="invoice/id" />
<xsl:value-of select="$separator" />
<xsl:value-of select="invoice/description" />
<xsl:value-of select="$separator" />
<xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Output
Reference;Make;Invoice_Id;Invoice_Description
111111;Mercedes-Benz;12345;Some text;
111111;Mercedes-Benz;12222;More text;
222222;Audi;45678;Audi text;
Upvotes: 2
Reputation: 186
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="/">
<xsl:text>Reference;Make;Invoice_Id;Invoice_Description</xsl:text>
<xsl:text>
</xsl:text>
<xsl:apply-templates select="contract_Set"/>
</xsl:template>
<xsl:template match="contract_period">
<xsl:value-of select="reference"/>;<xsl:value-of select="vehicle_Set/vehicle/make"/>;<xsl:value-of select="invoice_Set/invoice/id"/>;<xsl:value-of select="invoice_Set/invoice/description"/>;
</xsl:template>
</xsl:transform>
Upvotes: 0