Anonymous - 2012-02-24

Goodmorning,

I'm using the 1.1.2 version and I 'have a problem to transfomr an XML input file to a flat file separated.

I expect the following output:

name,surname,state;city;street;number;zip;type|prefix|numbertype|prefix|numberstate;city;street;number;zip;type|prefix|numbertype|prefix|number

but when using the framework i have the following output:

name,surname,state;city;street;number;zip;type|prefix|numbertype|prefix|number,state;city;street;number;zip;type|prefix|numbertype|prefix|number

in details are missing:

"|" separetor between number and type fileld.

Could you help me to understand what is wrong in my mapping?

There is a way to insert a "," (comma) separator between number and state? (the last field of phone structure and first field of address structure?

These are the input and the mapping.

input:
<root>
<customer>
<name>name</name>
<surname>surname</surname>
<addresses>
<address>
<state>state</state>
<city>city</city>
<street>street</street>
<number>number</number>
<zipCode>zip</zipCode>
<phones>
<phone>
<type>type</type>
<prefix>prefix</prefix>
<number>number</number>
</phone>
<phone>
<type>type</type>
<prefix>prefix</prefix>
<number>number</number>
</phone>
</phones>
</address>
<address>
<state>state</state>
<city>city</city>
<street>street</street>
<number>number</number>
<zipCode>zip</zipCode>
<phones>
<phone>
<type>type</type>
<prefix>prefix</prefix>
<number>number</number>
</phone>
<phone>
<type>type</type>
<prefix>prefix</prefix>
<number>number</number>
</phone>
</phones>
</address>
</addresses>
</customer>
</root>

Mapping:

<?xml version="1.0"?>

<sx:resources xmlns:sx="http://www.servingxml.com/core">

<sx:service id="customer">
<sx:recordStream>
<sx:subtreeRecordReader>
<sx:inverseRecordMapping ref="myMapping"/>
<sx:transform>
<sx:document/>
</sx:transform>
</sx:subtreeRecordReader>
<sx:flatFileWriter>
<sx:flatFile ref="output"/>
</sx:flatFileWriter>
</sx:recordStream>
</sx:service>

<sx:recordContent id="customer">
<sx:flatFileReader>
<sx:flatFile ref="output"/>
</sx:flatFileReader>
<sx:inverseRecordMapping ref="myMapping"/>
</sx:recordContent>

<sx:flatFile id="output">
<sx:flatFileBody>
<sx:flatRecordType ref="myRecord"/>
</sx:flatFileBody>
</sx:flatFile>

<sx:flatRecordType id="myRecord" name="myRecord">
<sx:fieldDelimiter value=","/>
<sx:delimitedField name="name"/>
<sx:delimitedField name="surname"/>
<sx:repeatingGroup name="address">
<sx:flatRecordType name="addressRecord">
<sx:fieldDelimiter value=";"/>
<sx:delimitedField name="state"/>
<sx:delimitedField name="city"/>
<sx:delimitedField name="street"/>
<sx:delimitedField name="number"/>
<sx:delimitedField name="zipCode"/>
<sx:repeatingGroup name="phone">
<sx:flatRecordType name="phoneRecord">
<sx:fieldDelimiter value="|"/>
<sx:delimitedField name="type"/>
<sx:delimitedField name="prefix"/>
<sx:delimitedField name="number"/>
</sx:flatRecordType>
</sx:repeatingGroup>
</sx:flatRecordType>
</sx:repeatingGroup>
</sx:flatRecordType>

<sx:inverseRecordMapping id="myMapping">
<sx:onSubtree path="/root/customer">
<sx:flattenSubtree recordType="customer">
<sx:subtreeFieldMap select="name" field="name"/>
<sx:subtreeFieldMap select="surname" field="surname"/>
<sx:subtreeFieldMap match="addresses/address" field="address">
<sx:flattenSubtree recordType="addressRecord">
<sx:subtreeFieldMap select="state" field="state"/>
<sx:subtreeFieldMap select="city" field="city"/>
<sx:subtreeFieldMap select="street" field="street"/>
<sx:subtreeFieldMap select="number" field="number"/>
<sx:subtreeFieldMap select="zipCode" field="zipCode"/>
<sx:subtreeFieldMap match="phones/phone" field="phone">
<sx:flattenSubtree recordType="phoneRecord">
<sx:subtreeFieldMap select="type" field="type"/>
<sx:subtreeFieldMap select="prefix"
field="prefix"/>
<sx:subtreeFieldMap select="number"
field="number"/>
</sx:flattenSubtree>
</sx:subtreeFieldMap>
</sx:flattenSubtree>
</sx:subtreeFieldMap>
</sx:flattenSubtree>
</sx:onSubtree>
</sx:inverseRecordMapping>
</sx:resources>

Regards.

Mauro.