Steve Lawrence created DAFFODIL-2887:
----------------------------------------

             Summary: Choice branch array with discriminator or direct dispatch 
broken
                 Key: DAFFODIL-2887
                 URL: https://issues.apache.org/jira/browse/DAFFODIL-2887
             Project: Daffodil
          Issue Type: Bug
          Components: Front End
    Affects Versions: 3.7.0
            Reporter: Steve Lawrence


Say we have this schema:

{code:xml}
<schema
  xmlns="http://www.w3.org/2001/XMLSchema";
  xmlns:xs="http://www.w3.org/2001/XMLSchema";
  xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/";
  xmlns:ex="http://example.com";
  targetNamespace="http://example.com";
  elementFormDefault="unqualified">

  <include schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd" 
/>

  <annotation>
    <appinfo source="http://www.ogf.org/dfdl/";>
      <dfdl:format ref="ex:GeneralFormat" lengthKind="delimited"/>
    </appinfo>
  </annotation>

  <element name="file">
    <complexType>
      <sequence dfdl:separator="%SP;">
        <element name="Type" type="xs:string" />
        <element name="Values">
          <complexType>
            <choice>
              <element name="Foo" type="xs:string" maxOccurs="unbounded">
                <annotation>
                  <appinfo source="http://www.ogf.org/dfdl/";>
                    <dfdl:discriminator test="{ ../Type eq 'foo' }" />
                  </appinfo>
                </annotation>
              </element>
              <element name="Bar" type="xs:string" maxOccurs="unbounded">
                <annotation>
                  <appinfo source="http://www.ogf.org/dfdl/";>
                    <dfdl:discriminator test="{ ../../Type eq 'bar' }" />
                  </appinfo>
                </annotation>
              </element>
            </choice>
          </complexType>
        </element>
      </sequence>
    </complexType>
  </element>

</schema>
{code}

So it is a space separated list of items, where the first is either "foo" or 
"bar", and that defines the type of all following items to be an array of Foo's 
or an array of Bar's.

This currently fails to compile with the error

{code}
 Relative path '../../Type eq foo' past root element
{code}

If we remove an up step and change the discriminators to "../Type eq 'foo'", 
then we get the error:

{code}
No element corresponding to step {}Type found. Possibilities for this step 
include: {}Foo, {}Bar.
{code}

So there is no way to reference Type using up-steps. 

A workaround is to wrap the array elemens in a sequence so the choice branches 
are now sequenes instead of arrays. Doing this allows the scheme to work. But 
when a choice branch is an array, there is an implied surrounding sequence so 
these should be exactly the same.

Potentially related, if we change the above snippet to remove the 
discriminators and instead use direct dispatch and put dfdl:choiceDispatchKey 
on the choice and dfdl:choiceBranchKey on the Foo/Bar arrays, we get the 
warning and error:
{code}
DFDL property was ignored: choiceBranchKey="foo" (id: ignoreDFDLProperty)
[error] Parse Error: Choice dispatch branch failed: List(Parse Error: Array 
element parsed succesfully, but consumed no data and is stuck in an infinite 
loop as it is unbounded.
{code}

Something seems to be wrong with our implied sequence choice branches.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to