Hi Mike,

  *   It applies only to required elements, and when an empty representation is 
found and if the element is defaultable, then the default value is substituted.

I looked through the entire DFDL specification. I can't find anything about 
needing a default value and the default value substituting when the content is 
empty. Where does it talk about needing default value when using 
dfdl:emptyValueDelimiterPolicy?

/Roger



From: Beckerle, Mike <[email protected]>
Sent: Monday, September 16, 2019 3:46 PM
To: [email protected]
Subject: [EXT] Re: dfdl:emptyValueDelimiterPolicy doesn't do anything

This is one of the trickiest areas of DFDL. (ok, Maybe they're all tricky?)

It doesn't help that default values are only partly implemented in Daffodil.

In your example, the elements are required scalars, and have no default values, 
hence, emptyValueDelimiterPolicy is unused, as it makes no difference to 
anything. If the initiator is not found it will be an error.

dfdl:emptyValueDelimiterPolicy is intended to be used when a format requires a 
specific representation for an empty value. It applies only to required 
elements, and when an empty representation is found and if the element is 
defaultable, then the default value is substituted.

Consider

<xs:element name="x" type="xs:string" default="N/A"
      dfdl:initiator='[' dfdl:terminator=']'
      dfdl:emptyValueDelimiterPolicy="none"/
      minOccurs="3" maxOccurs="3"
      dfdl:occursCountKind="implicit">

So data like:

[A],,[C]

will result in

<x>A</x><x>N/A</x><x>C</x>

This unparses to:

[A][N/A][C]

If you change dfdl:emptyValueDelimiterPolicy="both", then to get that same 
infoset requires:

[A],[],[C]

and will unparse once again to:

[A][N/A][C]

However, daffodil only partly implements default values (only for parsing, and 
even then not all cases are covered I think), so I'm not sure the above will 
work.

Note if you unparse:

<x>A</x><x>C</x>

Then since there are 3 required elements, not 2, DFDL implementations should 
default a third value and you should get

[A],[C],[N/A]

I believe Daffodil will error here. It does not do defaulting on unparsing at 
all.


________________________________
From: Costello, Roger L. <[email protected]<mailto:[email protected]>>
Sent: Monday, September 16, 2019 10:40 AM
To: [email protected]<mailto:[email protected]> 
<[email protected]<mailto:[email protected]>>
Subject: dfdl:emptyValueDelimiterPolicy doesn't do anything


The specification says this about dfdl:emptyValueDelimiterPolicy:



'none' indicates that if the content region is empty neither the dfdl:initiator 
or dfdl:terminator must be present. On unparsing when the content region is 
empty nothing will be output.



My DFDL schema (see below) declares two elements, separated by newline, each 
with an initiator, the first element specifies 
dfdl:emptyValueDelimiterPolicy="none". The input has empty content for the 
first element.



FIRST

SECOND Hello, world



Daffodil does not behave correctly: If I remove the initiator from the input 
file for the first element, I get an error. Bug in Daffodil?  /Roger



<xs:element name="input">
    <xs:complexType>
        <xs:sequence dfdl:separator="%NL;"
                               dfdl:separatorPosition="infix">
            <xs:element name="A" type="xs:string"
                                dfdl:initiator="FIRST"
                                dfdl:emptyValueDelimiterPolicy="none" />
            <xs:element name="B" type="xs:string"
                                 dfdl:initiator="SECOND" />
        </xs:sequence>
    </xs:complexType>
</xs:element>


Reply via email to