Great explanation.  I'm going to re-read this over the weekend and absorb
what you have said.  Then I can play around with it and I'll let you know
how it goes.

On Fri, May 31, 2019, 5:13 PM Steve Lawrence <[email protected]> wrote:

> Thanks for the information. That makes things more clear.
>
> The issue here is that with dfdl:occursCountKind="parsed", Daffodil
> keeps parsing parameters until an error occurs (parse error, assertion
> error, etc.). Such an error implies that we've found all of the
> occurrences of the element, that the one it just tried and fail to parse
> wasn't actually one of the occurrences. In this case, there are no more
> elements to parse in the Paremeters element so it skips the remaining
> bits of the fixed length Parameters element. This is called the "Unused
> region". Since Daffodil just skips those bits, you do not get an error.
>
> One thing we like to point out is the difference between "valid" data
> and "well-formed" data. Sometimes the data is syntactically correct and
> one would still be able to create a full infoset, but parts of the
> infoset are things that are not "valid". For example the Record_Type is
> 4. Maybe a value of 4 meets the specification, but is just not
> technically valid.
>
> In this case, we often recommend that you parse the
> well-formed/syntactically correct data, allowing invalid fields and an
> infoest to be created. Then at the end you can perform validation on
> that infoset to determine if what was parsed is valid or not. The
> benefit here is that you can determine what actions to take on invalid
> data. Maybe you fail it entirely, or maybe you just filter out the
> invalid fields. If you always fail well-formed but invalid data, you do
> not have that flexibility.
>
> That said, if an invalid Result_Type really does mean the data is
> not-well formed and you cannot continue to parse, or you do not want to
> consider well-formed but invalid data, you can take the approach
> described below.
>
> By failing the assert, you are not telling Daffodil that the data is
> wrong. You are just telling Daffodil that this was not an occurence of
> the Parameters array. If you instead want to tell Daffodil that this
> Record_Type was invalid error, you need to first tell Daffodil that this
> was, in fact, an actual occurrence of the Parameters array using a
> discriminator, and then perform the assert to tell Daffodil this
> occurence was invalid. So something like this:
>
>   <xs:complexType name="parameters_record">
>     <xs:sequence>
>       <xs:element name="Record_Type" type="xs:short"/>
>       <xs:sequence>
>         <xs:annotation>
>           <xs:appinfo source="http://www.ogf.org/dfdl/";>
>             <dfdl:discriminator test="{ fn:true() }"/>
>           </xs:appinfo>
>         </xs:annotation>
>       </xs:sequence>
>       <xs:sequence>
>          <xs:annotation>
>            <xs:appinfo source="http://www.ogf.org/dfdl/";>
>              <dfdl:assert message="..." test="..."/>
>            </xs:appinfo>
>          </xs:annotation>
>        </xs:sequence>
>      ...
>      </xs:sequence>
>   </xs:complexType>
>
> If we fail to parse a Record_Type, it must have meant that we reach the
> end of the fixed length Parameters element and things will work as
> expected. However, if we successfully parse a Record_Type, that means
> there was still some Parameter data available. So we then set a
> discriminator to fn:true() to alert Daffodil to that we found another
> occurrence of the Parameter array. Then we evaluate the assert. If that
> assert fails, Daffodil will report it as an error because the
> discriminator was set.
>
> - Steve
>
>
> On 5/31/19 3:47 PM, Kevin Moser wrote:
> >
> > Here is snippet of schema:
> > ...
> > <xs:element name="Parameters_Length" type="xs:int"/>
> > <xs:choice dfdl:choiceDispatchKey="{ Parameters_Length eq 0 }">
> >      <xs:element name="Parameters_Empty" dfdl:choiceBranchKey"true"
> >          type="xs:hexBinary" dfdl:lengthUnits="bytes" dfdl:length="{0}"
> > dfdl:lengthKind="explicit"/>
> >      <xs:element name="Parameters" dfdl:choiceBranchKey="false"
> > dfdl:lengthKind="explicit" dfdl:length="{ ../Parameters_Length }">
> >          <xs:complexType>
> >              <xs:sequence>
> >                  <xs:element name="Parameter" type="parameters_record"
> > minOccurs="0" maxOccurs="unbounded" dfdl:occursCountKind="parsed"/>
> >              </xs:sequence>
> >          </xs:complexType>
> >      </xs:element>
> > </xs:choice>
> > ...
> >
> > <xs:complexType name="parameters_record">
> >      <xs:sequence>
> >          <xs:element name="Record_Type" type="xs:short"/>
> >          <xs:sequence>
> >              <xs:annotation>
> >                  <xs:appinfo source="http://www.ogf.org/dfdl/";>
> >                      <dfdl:assert message="Only record types 1, 2, & 3
> are
> > allowed." test="{ Record_Type eq 1 or Record_Type eq 2 or Record_Type eq
> 3 }"/>
> >                  </xs:appinfo>
> >              </xs:annotation>
> >           </xs:sequence>
> >           ...
> >       </xs:sequence>
> > </xs:complexType>
> >
> > When I send bad data containing an invalid setting for Record_Type
> (e.g., 5),
> > the assert is not triggered and the xml output is produced.
> >
> > The xml output looks as follows:
> > ...
> > <Parameters_Length>16</Parameters_Length>
> > <Parameters></Parameters>
> >
> > I need the assert to be triggered and error thrown.
> >
> > Thanks,
> >
> > Kevin
> >
> >
> >
> >
> >
> >
> >
> > On Fri, May 31, 2019 at 7:40 AM Steve Lawrence <[email protected]
> > <mailto:[email protected]>> wrote:
> >
> >     It's not 100% clear to me what behavior you are seeing and what you
> >     expect to see. Could you maybe provide a schema snippet of your
> complex
> >     and assert and what result you are looking for?
> >
> >     - Steve
> >
> >     On 5/30/19 3:49 PM, Kevin Moser wrote:
> >      > Another question related to this topic.  During testing, we
> noticed that
> >      > dfdl:asserts were not failing (sending bad data to parser) if
> using
> >     "parsed".
> >      > The asserts are located within the parameter complex type to
> check if valid
> >      > record type. Any insight?
> >      >
> >      > On Tue, May 28, 2019, 3:14 PM Kevin Moser <[email protected]
> >     <mailto:[email protected]>
> >      > <mailto:[email protected] <mailto:[email protected]>>> wrote:
> >      >
> >      >     Working on schema and am hoping to get some assistance on
> writing
> >     schema to
> >      >     perform an iterative process.  The protocol contains a length
> of
> >     parameters
> >      >     field.  It does not contain the number of parameters.  I want
> to
> >     write the
> >      >     schema to handle a variable number of parameters until the
> length of
> >      >     parameters field is consumed (essentially a for loop or while
> loop).  Any
> >      >     suggestions?
> >      >     Thanks, Kevin
> >      >
> >
>
>

Reply via email to