[DFDL-WG] Initiator with leading variable text
Steve Hanson
smh at uk.ibm.com
Tue Mar 25 06:34:10 EDT 2014
Hi John
DFDL does not support regex in initiators, but that's not a problem as I
think the best way to model this is using discriminators.
Try a model that looks like this, where (s) means xs:sequence and (c)
means xs:choice. I've assumed that there could be several records
following CONTROLRECORD, of varying types.
Data (s)
Header (s) (1:1)
Body (s) (0:unbounded)
Control (s) (1:1)
Record (c) (0:unbounded)
Type1 (s) (1:1)
Type2 (s) (1:1)
...
TypeN (s) (1:1)
Trailer (s) (1:1)
In each record, model the prefix number as an integer element and the
record type as a string element.
Use a discriminator on the record type of Control and each Type1, Type2
etc, that checks the value is the one expected, eg:
<dfdl:discriminator test="{. eq 'CONTROLRECORD'} />
<dfdl:discriminator test="{. eq 'RECORDTYPE1'} />
Here's how this works, using your data as an example:
- Parser parses Header - success
- Parser goes into Body 1
- Parser parses Control
- Discriminator is true - success - we are in Body 1
- Parser goes into Record 1
- Parser assumes Type1 and parses it
- Discriminator is true - success - we are in Record 1
- Parser goes into Record 2
- Parser assumes Type 1 and parses it
- Discriminator is false (because record type is 'CONTROLRECORD') - parser
backtracks
- Parser assumes Type 2 and parses it
- Discriminator is false (because record type is 'CONTROLRECORD') - parser
backtracks
- <repeat until all branches tried>
- Parser can't match any branch of the choice so concludes that there is
no Record 2
- Parser goes into Body 2
- Parser parses Control
- Discriminator is true - success - we are in Body 2
- Parser goes into Record 1
- Parser assumes Type1 and parses it
- Discriminator is true - success - we are in Record 1
- Parser goes into Record 2
- Parser assumes Type1 and parses it
- Discriminator is false (because record type is 'CONTROLRECORD') - parser
backtracks
- Parser assumes Type 2 and parses it
- Discriminator is false (because record type is 'CONTROLRECORD') - parser
backtracks
- <repeat until all branches tried>
- Parser can't match any branch of the choice so concludes that there is
no Record 2
- Parser goes into Body 3
- Parser parses Control
- Discriminator is false (because record type is 'TRAILER') - parser
backtracks
- Parser concludes that there is no Body 3
- Parser parses Trailer - success
The NACHA schemas on GitHub follow a similar style to your example.
https://github.com/DFDLSchemas/NACHA
Regards
Steve Hanson
Architect, IBM DFDL
Co-Chair, OGF DFDL Working Group
IBM SWG, Hursley, UK
smh at uk.ibm.com
tel:+44-1962-815848
From: John Coutinh <john.coutinh at gmail.com>
To: dfdl-wg at ogf.org,
Date: 25/03/2014 02:47
Subject: [DFDL-WG] Initiator with leading variable text
Sent by: dfdl-wg-bounces at ogf.org
Hi All,
I have the following data to parse.
0000|HEADER|value1|value2|value3
0001|CONTROLRECORD|value1|value2|value3
0001|RECORDTYPE1|value101|value101
0002|CONTROLRECORD|value10|value20|value30
0002|RECORDTYPE1|value1010|value1010
0000|TRAILER|value1|value2|value3
The header and trailer are always prefixed with '0000'. I am having
trouble with the CONTROLRECORD.
The number '0001' before '|CONTROLRECORD|' applies to following record
types until the next number|CONTROLRECORD|.
Can an initiator include a regular expression as part of it's text. If
however possible, could an example be provided.
I tried using setVariable based on the number with no success.
Any ideas would be appreciated.
Thanks
John--
dfdl-wg mailing list
dfdl-wg at ogf.org
https://www.ogf.org/mailman/listinfo/dfdl-wg
Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.ogf.org/pipermail/dfdl-wg/attachments/20140325/72e6667c/attachment.html>
More information about the dfdl-wg
mailing list