Yep. The key is to use DFDL variables.
You first need to define the variable using dfdl:defineVariable in the
schema annotation, providing the name, type, and optional default value,
e.g.:
<schema ...>
<annotation>
<appinfo source="http://www.ogf.org/dfdl/">
...
<dfdl:defineVariable name="FieldSep" type="xs:string"
defaultValue="|"/>
...
</appinfo>
</annotation>
...
Then on the element that parses that delimiter you use dfdl:setVariable
to set it based on the parsed value, e.g.:
<element name="FieldSeparator" type="xs:string"
dfdl:lengthKind="explicit" dfdl:length="1">
<annotation>
<appinfo source="http://www.ogf.org/dfdl/">
<dfdl:setVariable ref="FieldSep" value="{.}" />
</appinfo>
</annotation>
</element>
And finally, specific an expression that evaluates to that variable
placed on the appropriate sequence, e.g.
<sequence dfdl:separator="{ $FieldSep }">
...
</sequence>
For a real world example, the EDIFACT schema does something very
similar. Here is the Daffodil development branch for that schema:
https://github.com/DFDLSchemas/EDIFACT/tree/daffodil-dev
Everything I mentioned is in the src/main/resource/EDIFACT-Common/
files. Though it is a bit more complicated since it defines new formats
that use the variable and then the sequence uses dfdl:ref to refer to
those formats (instead of directly setting the separator to the variable
like above), and it has a slightly more complicated setVariable
expression to conditionally set the variables. But the core idea is the
same.
On 10/17/22 3:52 PM, John Dziurlaj wrote:
I am attempting to create a DFDL schema for a HL7 derived language. HL7
has a feature that all the delimiters in a message are mapped using the
first few bytes of the input itself. For example: |*MSH|^~\&*| specifies
the various delimiters, in order of field separator ||| component
separator |^|, repetition separator |~|, escape character |\|,
subcomponent separator |&|.
Can an DFDL schema be produced that does not hardcode these tokens?
John Dziurłaj