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@uk.ibm.com
tel:+44-1962-815848
From:
John Coutinh <john.coutinh@gmail.com>
To:
dfdl-wg@ogf.org,
Date:
25/03/2014 02:47
Subject:
[DFDL-WG] Initiator
with leading variable text
Sent by:
dfdl-wg-bounces@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@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