Variable number of occurrences, groups and identifiers

Here are two transformation examples that use variable number of occurrences, groups, and identifiers. Groups are containers used to manage a group of records and other groups, often with a variable number of occurrences. The number of occurrences of a record is controlled. You can use an identifier to identify a record.

Example 13 A

This example shows how a field and record-separated flat file with identifiers is transformed to XML.

Flat File Definition:

<BankRepository>
	<Files>
      <File>
         <ID>SampleThirteenA</ID>
			<Messages>
				<Message>
					<IgnorePrecedingFieldSeparator>1</IgnorePrecedingFieldSeparator>
					<DefaultEmptyFieldValue><Numeric>0</Numeric><Alpha></Alpha></DefaultEmptyFieldValue>
					<DefaultAlignment><Numeric>RIGHT</Numeric><Alpha>LEFT</Alpha></DefaultAlignment>
					<DefaultPadding><Numeric>0</Numeric><Alpha> </Alpha></DefaultPadding>
					<DefaultTrim><Numeric>1</Numeric><Alpha>0</Alpha></DefaultTrim>
					<Name>Purchases</Name>
					<TagName>PurchasedItems</TagName>										
					<EscapeChar/>
					<RecordSeparator>\n</RecordSeparator>
					<FieldSeparator>:</FieldSeparator>
               <Records>
                  <Group>
                     <Name>Purchase</Name>
                     <TagName>Purchase</TagName>
                     <MinOccur>0</MinOccur>
                     <MaxOccur>U</MaxOccur>
                     <Records>
                        <Record>
                           <Name>CustomerDetails</Name>
                           <TagName>CustomerDetails</TagName>
                           <MinOccur>1</MinOccur>
                           <MaxOccur>1</MaxOccur>
                           <Fields>
                              <Field>
                                 <Name>ID</Name>
                                 <TagName>Identifier</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue>CUSTOMER</DefaultValue>
                                 <Identifier>1</Identifier>
                              </Field>
                              <Field>
                                 <Name>Name</Name>
                                 <TagName>Name</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue></DefaultValue>
                                 <Identifier>0</Identifier>
                              </Field>
                              <Field>
                                 <Name>Number</Name>
                                 <TagName>Number</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue></DefaultValue>
                                 <Identifier>0</Identifier>
                              </Field>
                           </Fields>
                        </Record>
                        <Group>
                           <Name>Payment</Name>
                           <TagName>Payment</TagName>
                           <MinOccur>1</MinOccur>
                           <MaxOccur>1</MaxOccur>
                           <Records>
                              <Record>
                                 <Name>PaymentDetails</Name>
                                 <TagName>PaymentDetails</TagName>
                                 <MinOccur>0</MinOccur>
                                 <MaxOccur>1</MaxOccur>
                                 <Fields>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>PAYMENT</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>TYPE</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>CARD</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>CardType</Name>
                                       <TagName>CardType</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue></DefaultValue>
                                       <Identifier>0</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>CardNumber</Name>
                                       <TagName>CardNumber</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue></DefaultValue>
                                       <Identifier>0</Identifier>
                                    </Field>
                                 </Fields>
                              </Record>
                              <Record>
                                 <Name>PaymentDetails</Name>
                                 <TagName>PaymentDetails</TagName>
                                 <MinOccur>0</MinOccur>
                                 <MaxOccur>1</MaxOccur>
                                 <Fields>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>PAYMENT</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>TYPE</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                    <Field>
                                       <Name>ID</Name>
                                       <TagName>Identifier</TagName>
                                       <DataType>Alpha</DataType>
                                       <PaddingChar/>
                                       <DecimalLength/>
                                       <Alignment>LEFT</Alignment>
                                       <StartPos>0</StartPos>
                                       <Length>0</Length>
                                       <DefaultValue>CASH</DefaultValue>
                                       <Identifier>1</Identifier>
                                    </Field>
                                 </Fields>
                              </Record>
                           </Records>
                        </Group>
                        <Record>
                           <Name>Date</Name>
                           <TagName>Date</TagName>
                           <MinOccur>1</MinOccur>
                           <MaxOccur>1</MaxOccur>
                           <Fields>
                              <Field>
                                 <Name>ID</Name>
                                 <TagName>Identifier</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue>DATE</DefaultValue>
                                 <Identifier>1</Identifier>
                              </Field>
                              <Field>
                                 <Name>Day</Name>
                                 <TagName>Day</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue></DefaultValue>
                                 <Identifier>0</Identifier>
                              </Field>
                              <Field>
                                 <Name>Month</Name>
                                 <TagName>Month</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue></DefaultValue>
                                 <Identifier>0</Identifier>
                              </Field>
                              <Field>
                                 <Name>Year</Name>
                                 <TagName>Year</TagName>
                                 <DataType>Alpha</DataType>
                                 <PaddingChar/>
                                 <DecimalLength/>
                                 <Alignment>LEFT</Alignment>
                                 <StartPos>0</StartPos>
                                 <Length>0</Length>
                                 <DefaultValue></DefaultValue>
                                 <Identifier>0</Identifier>
                              </Field>
                           </Fields>
                        </Record>
                     </Records>
                     <Group>
                        <Name>Items</Name>
                        <TagName>Items</TagName>
                        <MinOccur>1</MinOccur>
                        <MaxOccur>1</MaxOccur>
                        <Records>
                           <Group>
                              <Name>Item</Name>
                              <TagName>Item</TagName>
                              <MinOccur>1</MinOccur>
                              <MaxOccur>U</MaxOccur>
                              <Records>
                                 <Record>
                                    <Name>ItemDetails</Name>
                                    <TagName>ItemDetails</TagName>
                                    <MinOccur>1</MinOccur>
                                    <MaxOccur>1</MaxOccur>
                                    <Fields>
                                       <Field>
                                          <Name>ID</Name>
                                          <TagName>Identifier</TagName>
                                          <DataType>Alpha</DataType>
                                          <PaddingChar/>
                                          <DecimalLength/>
                                          <Alignment>LEFT</Alignment>
                                          <StartPos>0</StartPos>
                                          <Length>0</Length>
                                          <DefaultValue>ITEM</DefaultValue>
                                          <Identifier>1</Identifier>
                                       </Field>
                                       <Field>
                                          <Name>Name</Name>
                                          <TagName>Name</TagName>
                                          <DataType>Alpha</DataType>
                                          <PaddingChar/>
                                          <DecimalLength/>
                                          <Alignment>LEFT</Alignment>
                                          <StartPos>0</StartPos>
                                          <Length>0</Length>
                                          <DefaultValue></DefaultValue>
                                          <Identifier>0</Identifier>
                                       </Field>
                                       <Field>
                                          <Name>Quantity</Name>
                                          <TagName>Quantity</TagName>
                                          <DataType>Alpha</DataType>
                                          <PaddingChar/>
                                          <DecimalLength/>
                                          <Alignment>LEFT</Alignment>
                                          <StartPos>0</StartPos>
                                          <Length>0</Length>
                                          <DefaultValue></DefaultValue>
                                          <Identifier>0</Identifier>
                                       </Field>
                                       <Field>
                                          <Name>Price</Name>
                                          <TagName>Price</TagName>
                                          <DataType>Alpha</DataType>
                                          <PaddingChar/>
                                          <DecimalLength/>
                                          <Alignment>LEFT</Alignment>
                                          <StartPos>0</StartPos>
                                          <Length>0</Length>
                                          <DefaultValue></DefaultValue>
                                          <Identifier>0</Identifier>
                                       </Field>
                                    </Fields>
                                 </Record>
                              </Records>
                           </Group>
                        </Records>
                     </Group>
                  </Group>
               </Records>
				</Message>
			</Messages>
		</File>
	</Files>
</BankRepository>

Input file:

CUSTOMER:Jonas:0123456:
PAYMENT:TYPE:CARD:VISA:98765432:
DATE:09:10:2002:
ITEM:Hub cap:4:199.00:
ITEM:Tyre:4:679.00:
ITEM:Fuzzy dice:1:37.50:
CUSTOMER:Magnus:1234567:
PAYMENT:TYPE:CASH:
DATE:10:10:2002:
ITEM:SAAB Oil pump:1:1229.00:
ITEM:SAAB Oil filter:1:56.00:

The expected result is:

<PurchasedItems>
	<Purchase>
		<CustomerDetails>
			<Identifier>CUSTOMER</Identifier>
			<Name>Jonas</Name>
			<Number>0123456</Number>
		</CustomerDetails>
		<Payment>
			<PaymentDetails>
				<Identifier>PAYMENT</Identifier>
				<Identifier>TYPE</Identifier>
				<Identifier>CARD</Identifier>
				<CardType>VISA</CardType>
				<CardNumber>98765432</CardNumber>
			</PaymentDetails>
		</Payment>
		<Date>
			<Identifier>DATE</Identifier>
			<Day>09</Day>
			<Month>10</Month>
			<Year>2002</Year>
		</Date>
		<Items>
			<Item>
				<ItemDetails>
					<Identifier>ITEM</Identifier>
					<Name>Hub cap</Name>
					<Quantity>4</Quantity>
					<Price>199.00</Price>
				</ItemDetails>
			</Item>
			<Item>
				<ItemDetails>
					<Identifier>ITEM</Identifier>
					<Name>Tyre</Name>
					<Quantity>4</Quantity>
					<Price>679.00</Price>
				</ItemDetails>
			</Item>
			<Item>
				<ItemDetails>
					<Identifier>ITEM</Identifier>
					<Name>Fuzzy dice</Name>
					<Quantity>1</Quantity>
					<Price>37.50</Price>
				</ItemDetails>
			</Item>
		</Items>
	</Purchase>
	<Purchase>
		<CustomerDetails>
			<Identifier>CUSTOMER</Identifier>
			<Name>Magnus</Name>
			<Number>1234567</Number>
		</CustomerDetails>
		<Payment>
			<PaymentDetails>
				<Identifier>PAYMENT</Identifier>
				<Identifier>TYPE</Identifier>
				<Identifier>CASH</Identifier>
			</PaymentDetails>
		</Payment>
		<Date>
			<Identifier>DATE</Identifier>
			<Day>10</Day>
			<Month>10</Month>
			<Year>2002</Year>
		</Date>
		<Items>
			<Item>
				<ItemDetails>
					<Identifier>ITEM</Identifier>
					<Name>SAAB Oil pump</Name>
					<Quantity>1</Quantity>
					<Price>1229.00</Price>
				</ItemDetails>
			</Item>
			<Item>
				<ItemDetails>
					<Identifier>ITEM</Identifier>
					<Name>SAAB Oil filter</Name>
					<Quantity>1</Quantity>
					<Price>56.00</Price></ItemDetails>
			</Item>
		</Items>
	</Purchase>
</PurchasedItems>

Example 13 B

This example shows how a field and record-separated flat file without identifiers is transformed to XML.

Link Flat File Definition:

<BankRepository>
	<Files>
		<File>
			<ID>SampleThirteenB</ID>
			<Messages>
				<Message><IgnorePrecedingFieldSeparator>1</IgnorePrecedingFieldSeparator>
             <DefaultEmptyFieldValue><Numeric>0</Numeric><Alpha></Alpha></DefaultEmptyFieldValue>
             <DefaultAlignment><Numeric>RIGHT</Numeric><Alpha>LEFT</Alpha></DefaultAlignment>
             <DefaultPadding><Numeric>0</Numeric><Alpha> </Alpha></DefaultPadding>
             <DefaultTrim><Numeric>1</Numeric><Alpha>0</Alpha></DefaultTrim>
					<Name>TopNode</Name>
					<TagName>TopNode</TagName>
					
					
					<EscapeChar/>
					<RecordSeparator>crlf</RecordSeparator>
					<FieldSeparator></FieldSeparator>
					<Records>
						<Group>
							<Name>People</Name>
							<TagName>People</TagName>
							<MinOccur>1</MinOccur>
							<MaxOccur>1</MaxOccur>
							<Records>
								<Group>
									<Name>Person</Name>
									<TagName>Person</TagName>
									<MinOccur>1</MinOccur>
									<MaxOccur>0</MaxOccur>
									<Records>
										<Record>
											<Name>PersonDetails</Name>
											<TagName>PersonDetails</TagName>
											<MinOccur>1</MinOccur>
											<MaxOccur>1</MaxOccur>
											<Fields>
												<Field>
													<Name>FirstName</Name>
													<TagName>FirstName</TagName>
													<DataType>Alpha</DataType>
													<PaddingChar/>
													<DecimalLength/>
													<Alignment>LEFT</Alignment>
													<StartPos>1</StartPos>
													<Length>10</Length>
													<DefaultValue></DefaultValue>
													<Identifier>0</Identifier>
												</Field>
												<Field>
													<Name>LastName</Name>
													<TagName>LastName</TagName>
													<DataType>Alpha</DataType>
													<PaddingChar/>
													<DecimalLength/>
													<Alignment>LEFT</Alignment>
													<StartPos>11</StartPos>
													<Length>10</Length>
													<DefaultValue></DefaultValue>
													<Identifier>0</Identifier>
												</Field>
												<Field>
													<Name>Organization</Name>
													<TagName>Organization</TagName>
													<DataType>Alpha</DataType>
													<PaddingChar/>
													<DecimalLength/>
													<Alignment>LEFT</Alignment>
													<StartPos>21</StartPos>
													<Length>10</Length>
													<DefaultValue></DefaultValue>
													<Identifier>0</Identifier>
												</Field>
												<Field>
													<Name>E-Mail</Name>
													<TagName>EMail</TagName>
													<DataType>Alpha</DataType>
													<PaddingChar/>
													<DecimalLength/>
													<Alignment>LEFT</Alignment>
													<StartPos>31</StartPos>
													<Length>40</Length>
													<DefaultValue></DefaultValue>
													<Identifier>0</Identifier>
												</Field>
											</Fields>
										</Record>
										<Group>
											<Name>Address</Name>
											<TagName>Address</TagName>
											<MinOccur>0</MinOccur>
											<MaxOccur>1</MaxOccur>
											<Records>
												<Record>
													<Name>AddressLine</Name>
													<TagName>AddressLine</TagName>
													<MinOccur>1</MinOccur>
													<MaxOccur>0</MaxOccur>
													<Fields>
														<Field>
															<Name>Text</Name>
															<TagName>Text</TagName>
															<DataType>Alpha</DataType>
															<PaddingChar/>
															<DecimalLength/>
															<Alignment>LEFT</Alignment>
															<StartPos>0</StartPos>
															<Length>40</Length>
															<DefaultValue></DefaultValue>
															<Identifier>0</Identifier>
														</Field>
													</Fields>
												</Record>
											</Records>
										</Group>
									</Records>
								</Group>
							</Records>
						</Group>
					</Records>
				</Message>
			</Messages>
		</File>
	</Files>
</BankRepository>

The input is a field and record-separated file without identifiers:

1234567890123456789012345678901234567890123456789012345678901234567890
Jonas Fügedi IRD jonas.fugedi@infor.se
Vendevägen 89
181 82 Danderyd
Joakim Hemligt HEM joakim.hemligt@infor.se
Vendevägen 89
Magnus Persson ICS magnus.persson@infor.se
Vendevägen 89

The expected result is:

<TopNode>
	<People>
		<Person>
			<PersonDetails>
				<FirstName>1234567890</FirstName>
				<LastName>1234567890</LastName>
				<Organization>1234567890</Organization>
				<EMail>1234567890123456789012345678901234567890</EMail>
			</PersonDetails>
		</Person>
		<Person>
			<PersonDetails>
				<FirstName>Jonas</FirstName>
				<LastName>Fügedi</LastName>
				<Organization>IRD</Organization>
				<EMail>jonas.fugedi@intentia.se</EMail>
			</PersonDetails>
			<Address>
				<AddressLine>
					<Text>Vendevägen 89</Text>
				</AddressLine>
				<AddressLine>
					<Text>181 82 Danderyd</Text>
				</AddressLine>
			</Address>
		</Person>
		<Person>
			<PersonDetails>
				<FirstName>Joakim</FirstName>
				<LastName>Hemligt</LastName>
				<Organization>HEM</Organization>
				<EMail>joakim.hemligt@intentia.se</EMail>
			</PersonDetails>
			<Address>
				<AddressLine>
					<Text>Vendevägen 89</Text>
				</AddressLine>
			</Address>
		</Person>
		<Person>
			<PersonDetails>
				<FirstName>Magnus</FirstName>
				<LastName>Persson</LastName>
				<Organization>ICS</Organization>
				<EMail>magnus.persson@intentia.se</EMail>
			</PersonDetails>
			<Address>
				<AddressLine>
					<Text>Vendevägen 89</Text>
				</AddressLine>
			</Address>
		</Person>
	</People>
</TopNode>