So I think your requirements are this:
* fixed length 5
* the hyphen nil indicator may have spaces around it
* canonical form is left justified for "-" or any value.

This is the best I could do. I had to surround the nillable element with
another element so as to get left-justification by way of filling of the
unused region of a complex type, with fillByte which is %SP;.

If you want center justified hyphens for the nil case and left-justified
strings for the value case, then I think it's not possible to model this
without using separate elements for the nil and value. (That solution not
shown here.)

<element name="Foo"
         dfdl:length="5"
         dfdl:lengthKind="explicit"
         dfdl:terminator="/"
         dfdl:fillByte="%SP;">
  <!--
  The above achieves canonical unparse
  as left-justified fixed length because
  the fillByte will be used to fill unused
  space on the right.

  This only works for fixed length left-justified data.
  If this was right-justified, this trick would not work.
  -->
<complexType>
  <sequence>
    <!--
    The below achieves trimming of spaces either side,
    but only when parsing. Nothing is added when unparsing.
    -->
    <element name="value" nillable="true"
             dfdl:nilValue="-"
             dfdl:lengthKind="delimited"
             dfdl:textStringJustification="center"
             dfdl:textTrimKind="padChar"
             dfdl:textPadKind="none">
      <simpleType>
        <restriction base="xs:string">
          <enumeration value="AB"/>
          <enumeration value="ABC"/>
        </restriction>
      </simpleType>
    </element>
    </sequence>
 </complexType>
</element>


The TDML file I created for this has these tests in it showing that this
works:

  <parserTestCase name="foo1" root="Foo" model="s" roundTrip="onePass">
    <document>-    /</document>
    <infoset>
      <dfdlInfoset>
        <ex:Foo xmlns=""><value xsi:nil="true"/></ex:Foo>
      </dfdlInfoset>
    </infoset>
  </parserTestCase>

  <parserTestCase name="foo2" root="Foo" model="s" roundTrip="twoPass">
    <document> -   /</document>
    <infoset>
      <dfdlInfoset>
        <ex:Foo xmlns=""><value xsi:nil="true"/></ex:Foo>
      </dfdlInfoset>
    </infoset>
  </parserTestCase>

  <parserTestCase name="foo3" root="Foo" model="s" roundTrip="twoPass">
    <document> AB  /</document>
    <infoset>
      <dfdlInfoset>
        <ex:Foo xmlns=""><value>AB</value></ex:Foo>
      </dfdlInfoset>
    </infoset>
  </parserTestCase>

  <parserTestCase name="foo4" root="Foo" model="s" roundTrip="onePass">
    <document>AB   /</document>
    <infoset>
      <dfdlInfoset>
        <ex:Foo xmlns=""><value>AB</value></ex:Foo>
      </dfdlInfoset>
    </infoset>
  </parserTestCase>





On Mon, Aug 8, 2022 at 10:22 AM Roger L Costello <coste...@mitre.org> wrote:

> Hi Mike,
>
>
>
> I gave your suggested approach a try. It failed.
>
>
>
> With this input:
>
>
>
> …/AB /…
>
>
>
> it works.
>
>
>
> With this input:
>
>
>
> …/ - /…
>
>
>
> it fails, producing this error:
>
>
>
> [error] Validation Error: Foo failed facet checks due to: facet
> enumeration(s): AB|ABC
>
>
>
> Further, even if the approach were to work with this example where the
> field length is 3, it would be an untenable approach for longer fixed
> fields. For example, if the field length was 10, then the nilValue would
> need something like 10-factorial whitespace-separated values.
>
>
>
> Do you have another suggested approach?
>
>
>
> /Roger
>
>
>
> *From:* Mike Beckerle <mbecke...@apache.org>
> *Sent:* Monday, August 8, 2022 9:38 AM
> *To:* users@daffodil.apache.org
> *Subject:* [EXT] Re: Conflicting requirements: fixed length field,
> nillable, some enumeration values shorter than the required length
>
>
>
> I would try making the nilValue "%SP;-%SP; -". That is two separate
> possibilities for nilValue, one is space-hyphen-space, the other just
> hyphen. (It's a whitespace-separated list of nil values tokens.)
>
>
>
> The first one will be used for unparsing. Both will be tried for parsing.
>
>
>
> That along with justification left might work.
>
>
>
>
>
>
>
>
>
>
>
>
>
> On Mon, Aug 8, 2022 at 8:01 AM Roger L Costello <coste...@mitre.org>
> wrote:
>
> Hi Folks,
>
> I have an input field that is fixed length (3). If there is no data, the
> field is to be populated with a hyphen (of course, it must be padded with
> spaces to the required length). The schema has a simpleType with
> enumeration facets. Some enumeration values are less than the required
> length.
>
> Here's how I specify the field:
>
> <xs:element name="Foo"
>     nillable="true"
>     dfdl:nilKind="literalValue"
>     dfdl:nilValue="-"
>     dfdl:lengthKind="explicit"
>     dfdl:length="3"
>     dfdl:textTrimKind="padChar"
>     dfdl:textPadKind="padChar"
>     dfdl:textStringPadCharacter="%SP;"
>     dfdl:textStringJustification="center">
>     <xs:simpleType>
>         <xs:restriction base="xs:string">
>             <xs:enumeration value="AB"/>
>             <xs:enumeration value="ABC"/>
>         </xs:restriction>
>     </xs:simpleType>
> </xs:element>
>
> Notice dfdl:textStringJustification="center" which is fine for the
> nillable value (hyphen) but not for a regular value such as AB which should
> be left justified. As the schema is, the input could contain this (assume
> slash separators):
>
> .../ AB/...
>
> which is incorrect.
>
> So, there are conflicting requirements: the nillable value needs
> dfdl:textStringJustification="center" whereas the normal values need
> dfdl:textStringJustification="left". What to do about this?
>
> /Roger
>
>

Reply via email to