I added the discriminator to the schema as you suggested.  I'm still
getting the same output.
Daffodil is not reporting an error if Record_Type is invalid value.  Any
more suggestions?

On Fri, May 31, 2019 at 5:21 PM Kevin Moser <[email protected]> wrote:

> 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