Thank you Mike and Steve!
To pick up on what Steve suggested:
<xs:sequence dfdl:choiceBranchKey="0 6 7">
<xs:sequence dfdl:hiddenGroupRef="hidden-SPARE-5" />
</xs:sequence>
Is this correct:
If ENVIRONMENT/BitCode = 0, then unparsing will produce 00000
If ENVIRONMENT/BitCode = 6, then unparsing will produce 00000
If ENVIRONMENT/BitCode = 7, then unparsing will produce 00000
So, unparsing produces the wrong output when ENVIRONMENT/BitCode = 6 or
ENVIRONMENT/BitCode = 7, right?
I see what Mike is saying about inserting a non-hidden (bogus) element for the
hidden fields.
These are poor solutions. There’s got to be a better solution.
From: Steve Lawrence <[email protected]>
Sent: Friday, May 31, 2024 11:58 AM
To: [email protected]
Subject: [EXT] Re: Best way to design DFDL for a choice with multiple branches
that create hidden fields?
Note that in this specific case, since your hidden branches are all the same,
you can silence the warning by combining them into a single branch, e. g. .. .
<xs: sequence dfdl: choiceBranchKey="0 6 7"> <xs: sequence dfdl:
hiddenGroupRef="hidden-SPARE-5"
ZjQcmQRYFpfptBannerEnd
Note that in this specific case, since your hidden branches are all the same,
you can silence the warning by combining them into a single branch, e.g.
...
<xs:sequence dfdl:choiceBranchKey="0 6 7">
<xs:sequence dfdl:hiddenGroupRef="hidden-SPARE-5" />
</xs:sequence>
...
This way there is only one hidden branch so Daffodil will know that this branch
is the only option to unparse if there is nothing in the infoset where this
choice is.
But this doesn't work if any of your hidden branches are different (e.g. one was
SPARE-5 and another was SPARE-6). In that case, you would need to do what Mike
suggests and have some non-hidden element to let Daffodil know whether to
unparse a SPARE-5 or -6.
On 2024-05-31 11:26 AM, Mike Beckerle wrote:
>
> There is no way in DFDL v1.0 to make choices at unparse time that are not
> guided
> by what the contents of the non-hidden infoset are.
>
> If all this stuff is hidden it is not in the infoset for consideration on how
> to
> unparse it.
>
> That means that somehow the unparser has to figure out, from the infoset that
> is
> present, what part of the hidden infoset it needs to create.
>
> The dfdl:choiceDispatchKey and dfdl:choiceBranchKey are parse-time-only. They
> are not evaluated at unparse time.
>
> There is no dfdlx:choiceDispatchKey/ForUnparse/ (though I have considered it.)
>
> I suspect that the only thing you can do is put some non-hidden element in
> each
> branch of the choice. That way the unparser can know what branch to unparse.
> Everything else about that branch of the choice can be hidden. This can just
> be
> a marker element with no content, but it needs to be the first thing in each
> branch.
>
>
>
> On Fri, May 31, 2024 at 7:17 AM Roger L Costello <[email protected]
> <mailto:[email protected]>> wrote:
>
> I have an xs:choice which has 3 branches that create hidden fields.
> Daffodil
> generates this warning message:____
>
> __ __
>
> /Multiple choice branches with no required elements detected and the
> infoset
> does not specify a branch, selecting the first branch for unparsing.____/
>
> __ __
>
> What is the best way to design DFDL for this situation?____
>
> __ __
>
> ____
>