We are prototyping such a feature in Daffodil. If we're happy with it, we will 
propose it for a future revision of DFDL.


We will show you some examples of it in use, but there is a writeup about it on 
the Daffodil wiki:


https://cwiki.apache.org/confluence/display/DAFFODIL/Proposal%3A+Feature+to+support+enumerations+and+typeValueCalc

________________________________
From: Costello, Roger L. <[email protected]>
Sent: Monday, April 29, 2019 7:33:25 AM
To: [email protected]
Subject: What is the easiest way to express an enumeration list in DFDL?

Hello DFDL community,

My input file contains an unsigned integer that represents the name of a 
machine (CPU). I want to output that raw integer plus the name of the machine 
that it corresponds to plus a description, e.g.,

<machine>
  <raw_value>3</raw_value>
  <constant>IMAGE_FILE_MACHINE_ARM</constant>
  <description>ARM</description>
</machine>

I know how to implement this using inputValueCalc. See below. Is there is 
another way to implement it, using xs:enumeration? Somehow, it would be really 
neat if the element declaration for the <constant> element could use 
xs:enumeration to enumerate its allowable values:

<xs:element name="constant">
    <xs:simpleType>
        <xs:restriction base="xs:string">
            <xs:enumeration value="IMAGE_FILE_MACHINE_UNKNOWN" />
            <xs:enumeration value="IMAGE_FILE_MACHINE_AM33" />
            <xs:enumeration value="IMAGE_FILE_MACHINE_AMD64" />
            <xs:enumeration value="IMAGE_FILE_MACHINE_ARM" />
        </xs:restriction>
    </xs:simpleType>
</xs:element>

Somehow, each enumeration value would then be correlated to a specific value of 
the <raw_value> element.

Is there a way to express this? That is, is there some way to leverage the XML 
Scheme enumeration facet to enumerate the list of allowable values of the 
<constant> element (as opposed to, essentially, using XPath the list the 
allowable values)?  /Roger

<xs:element name="machine">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="raw_value" type="xs:integer" />
            <xs:element name="constant" type="xs:string" dfdl:inputValueCalc="{
                if (../raw_value eq 0) then 'IMAGE_FILE_MACHINE_UNKNOWN'
                else if (../raw_value eq 1) then 'IMAGE_FILE_MACHINE_AM33'
                else if (../raw_value eq 2) then 'IMAGE_FILE_MACHINE_AMD64'
                else if (../raw_value eq 3) then 'IMAGE_FILE_MACHINE_ARM'
                else fn:error()
                }"/>
            <xs:element name="description" type="xs:string" 
dfdl:inputValueCalc="{
                if (../raw_value eq 0) then 'The contents of this field are 
assumed to be applicable to any machine type'
                else if (../raw_value eq 1) then 'Matsushita AM33'
                else if (../raw_value eq 2) then 'x64'
                else if (../raw_value eq 3) then 'ARM'
                else fn:error()
                }"/>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Reply via email to