That's a very good point. So far, the physical structure has pretty much matched that desired structure, just with some extra complex types thrown in and minor tweaks needed. Though it wouldn't surprise me if we run into limitations getting this EDI XML to look exactly like you want. At which point we'll have to resort to the input/outputValueCalc approach, which can get messy fast, or the need for XSLT or some other transformation language.

On 12/14/21 8:07 AM, Mike Beckerle wrote:
In general, the shape of the XML you get from dfdl is constrained by the format
needs.

You dont generally get to decide what you want the XML to look like and then use
dfdl to populate that.

In that situation you really have two problems:
1) describe the structure of the physical data (as is)
2) describe how to map it to the structure you want instead.

Dfdl is only about problem (1) above, and we have consciously tried not to turn
it into a mapping language as for (2).

Now, all that said, using hidden groups, dfdl:inputValueCalc and
dfdl:outputValueCalc, you really can get it to do pretty complex mappings.

Witness this example
https://github.com/OpenDFDL/examples/tree/master/pairsTransform
<https://github.com/OpenDFDL/examples/tree/master/pairsTransform> which converts
data that is physically stored as a pair of lists into XML that is a list of
pairs, effectively this is transposing a matrix.

Another example is parsing IPv4 packets. If you want the IP addresses to show up
in the XML as <src>1.2.3.4</src> then you have to create quite complex dfdl
which is too complex to be considered declarative description. I consider this
as a good example of what NOT to do in dfdl.  See
https://github.com/DFDLSchemas/ethernetIP/blob/master/src/main/resources/com/owlcyberdefense/dfdl/xsd/ipAddress.dfdl.xsd
<https://github.com/DFDLSchemas/ethernetIP/blob/master/src/main/resources/com/owlcyberdefense/dfdl/xsd/ipAddress.dfdl.xsd>
starting at line 56 to see what I mean. It is definitely possible to get dfdl to
do this. It is just not recommended as a good practice.

So philosophically, it can be helpful to think of dfdl as only being about
describing the original data format. But ....  one can do more transforming than
this if you must.




On Wed, Dec 1, 2021, 9:37 AM Nestor Fernandez <nestor.fernan...@chakray.co.uk
<mailto:nestor.fernan...@chakray.co.uk>> wrote:

     Hi team,

     We have a requirement that some of the resulting XML elements after parsing
     an EDIFACT file should be nested or wrapped by some grouping element.

     Given an edi file with a flat structure like this:

     segment1
     segment2
     segment3
     segment4

     our final goal would be to get an xml file with a more complex structure
     such as this:

     <xml>
          <segment1/>
          <segment-wrapper>
              <segment-wrapper>
                  <segment2/>
                  <segment3/>
              </segment-wrapper>
              <segment4/>
          </segment-wrapper>
     </xml>

     I know we could just use XSLT, but is it even possible just with Daffodil
     libraries? I am new to DFDL, and thought this would be very simple, but all
     things I tried have failed (either XSD is not valid, or I get daffodil
     runtime errors). I am using apache-daffodil-3.1.0 command line interface.


     I put together a more practical example:

     INPUT EDI file:

     HDR+1+0+59.97+64.92+4.95+Wed Nov 15 13?:45?:28 EST
     2006'CUS+user1+Harry:Fletcher+SD'ORD+1+1+364+The 40-Year-Old
     Virgin+29.98'ORD+2+1+299+Pulp Fiction+29.99'


     DFDL XSD Schema file:

     <?xml version="1.0" encoding="UTF-8" standalone="no"?>
     <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema
     <http://www.w3.org/2001/XMLSchema>"
     xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/
     <http://www.ogf.org/dfdl/dfdl-1.0/>"
     xmlns:ibmEdiFmt="http://www.ibm.com/dfdl/EDI/Format
     <http://www.ibm.com/dfdl/EDI/Format>">
          <xsd:import namespace="http://www.ibm.com/dfdl/EDI/Format
     <http://www.ibm.com/dfdl/EDI/Format>" schemaLocation="IBM_EDI_Format.xsd"/>
          <xsd:annotation>
              <xsd:appinfo source="http://www.ogf.org/dfdl/
     <http://www.ogf.org/dfdl/>">
                  <dfdl:format ref="ibmEdiFmt:EDIFormat"/>
              </xsd:appinfo>
          </xsd:annotation>
          <xsd:element name="Order">
              <xsd:complexType>
                  <xsd:sequence dfdl:initiatedContent="yes">
                      <xsd:element dfdl:initiator="HDR"
     dfdl:ref="ibmEdiFmt:EDISegmentFormat" name="header" type="HDR"/>
                      <xsd:element dfdl:initiator="CUS"
     dfdl:ref="ibmEdiFmt:EDISegmentFormat" name="customer-details" type="CUS"/>
                      <xsd:element dfdl:initiator="ORD"
     dfdl:ref="ibmEdiFmt:EDISegmentFormat" name="order-item"
     maxOccurs="unbounded" type="ORD"/>
                  </xsd:sequence>
              </xsd:complexType>
          </xsd:element>
          <xsd:complexType name="HDR">
              <xsd:sequence dfdl:ref="ibmEdiFmt:EDISegmentSequenceFormat">
                  <xsd:element name="order-id" type="xsd:string"/>
                  <xsd:element name="status-code" type="xsd:string"/>
                  <xsd:element name="net-amount" type="xsd:string"/>
                  <xsd:element name="total-amount" type="xsd:string"/>
                  <xsd:element name="tax" type="xsd:string"/>
                  <xsd:element name="date" type="xsd:string"/>
              </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="CUS">
              <xsd:sequence dfdl:ref="ibmEdiFmt:EDISegmentSequenceFormat">
                  <xsd:element name="username" type="xsd:string"/>
                  <xsd:element name="name">
                      <xsd:complexType>
                          <xsd:sequence
     dfdl:ref="ibmEdiFmt:EDICompositeSequenceFormat">
                              <xsd:element name="firstname" type="xsd:string"/>
                              <xsd:element name="lastname" type="xsd:string"/>
                          </xsd:sequence>
                      </xsd:complexType>
                  </xsd:element>
                  <xsd:element name="state" type="xsd:string"/>
              </xsd:sequence>
          </xsd:complexType>
          <xsd:complexType name="ORD">
              <xsd:sequence dfdl:ref="ibmEdiFmt:EDISegmentSequenceFormat">
                  <xsd:element name="position" type="xsd:string"/>
                  <xsd:element name="quantity" type="xsd:string"/>
                  <xsd:element name="product-id" type="xsd:string"/>
                  <xsd:element name="title" type="xsd:string"/>
                  <xsd:element name="price" type="xsd:string"/>
              </xsd:sequence>
          </xsd:complexType>
     </xsd:schema>


     OUTPUT:

     <Order>
          <header>
              <order-id>1</order-id>
              <status-code>0</status-code>
              <net-amount>59.97</net-amount>
              <total-amount>64.92</total-amount>
              <tax>4.95</tax>
              <date>Wed Nov 15 13:45:28 EST 2006</date>
          </header>
          <customer-details>
              <username>user1</username>
              <name>
                  <firstname>Harry</firstname>
                  <lastname>Fletcher</lastname>
              </name>
              <state>SD</state>
          </customer-details>
          <order-item>
              <position>1</position>
              <quantity>1</quantity>
              <product-id>364</product-id>
              <title>The 40-Year-Old Virgin</title>
              <price>29.98</price>
          </order-item>
          <order-item>
              <position>2</position>
              <quantity>1</quantity>
              <product-id>299</product-id>
              <title>Pulp Fiction</title>
              <price>29.99</price>
          </order-item>
     </Order>


     Let's say we want to nest XML elements (originally EDI segments), header 
and
     custom-details, and get something similar to this:

     EXAMPLE OF DESIRED OUTPUT:

     <Order>
          <order-info>
              <header>
                  <order-id>1</order-id>
                  <status-code>0</status-code>
                  <net-amount>59.97</net-amount>
                  <total-amount>64.92</total-amount>
                  <tax>4.95</tax>
                  <date>Wed Nov 15 13:45:28 EST 2006</date>
              </header>
              <customer-details>
                  <username>user1</username>
                  <name>
                      <firstname>Harry</firstname>
                      <lastname>Fletcher</lastname>
                  </name>
                  <state>SD</state>
              </customer-details>
          </order-info>
          <order-item>
              <position>1</position>
              <quantity>1</quantity>
              <product-id>364</product-id>
              <title>The 40-Year-Old Virgin</title>
              <price>29.98</price>
          </order-item>
          <order-item>
              <position>2</position>
              <quantity>1</quantity>
              <product-id>299</product-id>
              <title>Pulp Fiction</title>
              <price>29.99</price>
          </order-item>
     </Order>


     Any ideas would be appreciated.

     Thanks and regards


Reply via email to