You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@daffodil.apache.org by ji...@gmail.com,
ji...@gmail.com on 2018/07/12 13:48:01 UTC
Is there a way to reuse a structure but with a different name?
It seems DFDL is very verbose. I have to copy and paste a lot of lines to reuse a structure definition.
Or am I missing a trick? I can do this with simple types.
<!-- Register instance - Current usage --->
<xs:element name="AP_Input" >
<xs:complexType>
<xs:sequence>
<xs:element ref="register" >
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- WISH: Register instance - compact form-->
<xs:element name="AP_Input" type="register" >
<!-- register structure definition -->
<xs:element name="register" >
<xs:complexType>
<xs:sequence>
<xs:element name="App_Slot" type="xs:unsignedByte"/>
<xs:element name="App_Array" type="xs:unsignedByte"/>
<xs:element name="App_Index" type="xs:unsignedShort"/>
</xs:sequence>
</xs:complexType>
</xs:element>
****************** Expected output:
<AP_Input>
<register>
<App_Slot>0</App_Slot>
<App_Array>0</App_Array>
<App_Index>0</App_Index>
</register>
</AP_Input>
Re: Is there a way to reuse a structure but with a different name?
Posted by Mike Beckerle <mb...@tresys.com>.
The trick you need is using a named complex type definition, and/or a named group definition.
E.g.,
<xs:element name="AP_Input" type="registerType"/>
<xs:complexType name="registerType">
<xs:sequence>
<xs:element name="App_Slot" type="xs:unsignedByte"/>
<xs:element name="App_Array" type="xs:unsignedByte"/>
<xs:element name="App_Index" type="xs:unsignedShort"/>
</xs:sequence>
</xs:complexType>
If you want to reuse groups of fields within various types, you can use named groups for that. E.g.,
<xs:group name="registerGroup">
<xs:sequence>
<xs:element name="App_Slot" type="xs:unsignedByte"/>
<xs:element name="App_Array" type="xs:unsignedByte"/>
<xs:element name="App_Index" type="xs:unsignedShort"/>
</xs:sequence>
</xs:group>
Then you use this with a group reference from within as many named complex types as you want.
<xs:complexType name="registerType">
<xs:group ref="registerGroup"/>
</xs:complexType>
<xs:complexType name="someOtherType">
<xs:sequence>
<xs:group ref="registerGroup" />
... reference other reusable groups of fields here too, or define directly here.
</xs:sequence>
</xs:complexType>
In general anywhere you can put a xs:sequence or xs:element you can put a xs:group reference.
So I think one can avoid the troublesome repetition of definitions you were trying to avoid.
-Mike Beckerle
Tresys
________________________________
From: jimwelchok@gmail.com <ji...@gmail.com>
Sent: Thursday, July 12, 2018 9:48:01 AM
To: users@daffodil.apache.org
Subject: Is there a way to reuse a structure but with a different name?
It seems DFDL is very verbose. I have to copy and paste a lot of lines to reuse a structure definition.
Or am I missing a trick? I can do this with simple types.
<!-- Register instance - Current usage --->
<xs:element name="AP_Input" >
<xs:complexType>
<xs:sequence>
<xs:element ref="register" >
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- WISH: Register instance - compact form-->
<xs:element name="AP_Input" type="register" >
<!-- register structure definition -->
<xs:element name="register" >
<xs:complexType>
<xs:sequence>
<xs:element name="App_Slot" type="xs:unsignedByte"/>
<xs:element name="App_Array" type="xs:unsignedByte"/>
<xs:element name="App_Index" type="xs:unsignedShort"/>
</xs:sequence>
</xs:complexType>
</xs:element>
****************** Expected output:
<AP_Input>
<register>
<App_Slot>0</App_Slot>
<App_Array>0</App_Array>
<App_Index>0</App_Index>
</register>
</AP_Input>