Can you send your updated schema?

On 12/1/21 10:58 AM, Nestor Fernandez wrote:
Thank you Steve.

I believe I have already tried something like that.

Unless I am missing something from your response, this is what I get now, which
includes the wrapper element but it is wrong (order-items are not parsed 
properly).

<?xml version="1.0" encoding="UTF-8"?>
<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'ORD</price>
    </order-item>
</Order>
[warning] Left over data. Consumed 1024 bit(s) with at least 232 bit(s) 
remaining.
Left over data (Hex) starting at byte 129 is: (0x2b322b312b323939...)
Left over data (UTF-8) starting at byte 129 is: (+2+1+299...)

The output format is right, but the EDI parsing is not.


On Wed, Dec 1, 2021 at 4:19 PM Steve Lawrence <slawre...@apache.org
<mailto:slawre...@apache.org>> wrote:

     You should be able to add a new complex type and move existing elements
     to be children of that new type, and then reference that type where your
     children were referenced.

     For example, in your schema you could create a new OrderInfo complex
     type and move your "header" and "customer-details" elements to children
     of that:

           <xsd:complexType name="OrderInfo">
               <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:sequence>
           </xsd:complexType>

     Note that we also copy over the dfdl:initiatedContent property from the
     previous containing sequence.

     We now need to modify the Order element to reference this new complex
     type. You might think we can simply replace the header and customer
     details elements with our new type, like so:

           <xsd:element name="Order">
               <xsd:complexType>
                   <xsd:sequence dfdl:initiatedContent="yes">
                       <xsd:element name="order-info" type="OrderInfo" />
                       <xsd:element dfdl:initiator="ORD" name="order-item"
     maxOccurs="unbounded" type="ORD"/>
                   </xsd:sequence>
               </xsd:complexType>
           </xsd:element>

     But this doesn't actually work because the order-info element doesn't
     have an initiator (and it shouldn't, it's just a wrapper that doesn't
     consume any data itself). So it can't be inside the sequence with
     dfdl:initiatedContent="yes". To deal with this, we just need to move it
     outside the initiated content sequence into a new sequence that doesn't
     have initiated content. So we end up with nested sequences, something
     like this:

           <xsd:element name="Order">
               <xsd:complexType>
                   <xsd:sequence>
                       <xsd:element name="order-info" type="OrderInfo" />
                       <xsd:sequence dfdl:initiatedContent="yes">
                           <xsd:element dfdl:initiator="ORD" name="order-item"
     maxOccurs="unbounded" type="ORD"/>
                       </xsd:sequence>
                   </xsd:sequence>
               </xsd:complexType>
           </xsd:element>

     With those two changes, this should add a new order-info wrapper element
     around the header and customer-details elements like in your desired XML.

     And this same pattern should work for most cases where you want a new
     wrapper element. Create a new complex type, move elements into that
     type, and reference that new type where your elements used to be. This
     gets a bit more complicated if the sequence containing the elements had
     properties that shouldn't apply to the new complex type, but in that
     case you can probably just move the new complex reference outside that
     sequence.



     On 12/1/21 9:36 AM, Nestor Fernandez 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>
      > <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/>
      > <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>
      > <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>
      > <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/> <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