Thanks Steve, your suggested approach works great. With this input:
00 00 00 00 12 34 56 78
I get this XML:
<Test_Symbol_Name>
<LeadingZeros>00000000</LeadingZeros>
<Offset>12345678</Offset>
</Test_Symbol_Name>
With this input:
2E 64 61 74 61 00 00 00
I get this XML:
<Test_Symbol_Name>
<Name>.data</Name>
</Test_Symbol_Name>
Here is the working DFDL schema:
<xs:element name="Symbol_Name">
<xs:complexType>
<xs:sequence>
<xs:choice>
<xs:sequence>
<xs:element name="LeadingZeros" type="xs:hexBinary"
dfdl:length="4" dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes">
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:discriminator test="{xs:string(.) eq
'00000000'}" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="Offset" type="xs:hexBinary"
dfdl:length="4" dfdl:lengthKind="explicit" dfdl:lengthUnits="bytes" />
</xs:sequence>
<xs:element name="Name" type="xs:string"
dfdl:textTrimKind="padChar"
dfdl:textStringPadCharacter="%NUL;"
dfdl:textStringJustification="left"
dfdl:lengthUnits="characters" dfdl:lengthKind="explicit"
dfdl:length="8"
dfdl:representation="text" dfdl:encoding="utf-8" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
-----Original Message-----
From: Steve Lawrence <[email protected]>
Sent: Tuesday, January 22, 2019 9:27 AM
To: [email protected]; Costello, Roger L. <[email protected]>
Subject: [EXT] Re: Input is 8 bytes, representing either a name or an offset
(if the first 4 bytes are zero)
We'll have to look into the unexpected exception. If you could provide the
stacktrace when you get the bug, that might help us reproduce it.
I think the way I would model this is via a choice and with backtracking. The
first choice branch would have two 4-byte xs:hexBinary elements and a
discriminiator requiring that the first element is all zeros. If that
discriminator fails, then it backtracks and takes the second branch of the
choice, which would just be a 8-byte string with right NUL padding like we've
talked about in previous email threads. For
example:
<xs:element name="Symbol_Name">
<xs:complexType>
<xs:choice>
<xs:sequence>
<xs:element name="LeadingZeros" type="xs:hexBinary"
dfdl:length="4" ...>
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:discriminator test="{ xs:string(.) eq "00000000" />
</xs:appinfo>
</xs:annotation>
</xs:element>
<xs:element name="Offset" type="xs:hexBinary" dfdl:length="4"
... />
</xs:sequence>
<xs:element name="Name" type="xs:string" dfdl:length="8" ... />
</xs:choice>
</xs:complexType>
</xs:element>
- Steve
On 1/21/19 4:27 PM, Costello, Roger L. wrote:
> Hello DFDL community,
>
> My input contains 8 bytes. If the first 4 bytes are all zeroes, then
> the remaining four bytes represent an offset. Otherwise, the 8 bytes
> represent a null-terminated string. For example, if the input is this:
>
> 2E 64 61 74 61 00 00 00
>
> Then the XML output should be this:
>
> <Name>.data</Name>
>
> If the input is this:
>
> 00 00 00 00 12 34 56 78
>
> Then the XML output should be this:
>
> <Offset>12345678</Offset>
>
> I have no idea how to write a DFDL schema for this input. Below is my
> attempt, but it just produces "An unexpected exception occurred. This is a
> bug" message.
>
> Would you give some guidance on how to create a DFDL schema for the
> input, please? /Roger
>
> <xs:elementname="Symbol_Name">
> <xs:complexType>
> <xs:sequence>
> <xs:sequencedfdl:hiddenGroupRef="hidden_hexBinary8_Group"/>
> <xs:choice>
> <xs:sequence>
> <xs:annotation>
> <xs:appinfosource="http://www.ogf.org/dfdl/">
> <dfdl:discriminatortest="{xs:string(Hidden_byte1) eq '00' and
> xs:string(Hidden_byte2) eq '00' and
> xs:string(Hidden_byte3) eq '00' and
> xs:string(Hidden_byte4) eq '00'}"/>
> </xs:appinfo> </xs:annotation>
> <xs:elementname="Offset"type="xs:hexBinary"dfdl:inputValueCalc="{
> fn:concat(xs:string(../Hidden_byte8),
> xs:string(../Hidden_byte7),
> xs:string(../Hidden_byte6),
> xs:string(../Hidden_byte5))}"
> />
> </xs:sequence>
> <xs:sequence>
> <xs:annotation>
> <xs:appinfosource="http://www.ogf.org/dfdl/">
> <dfdl:discriminatortest="{xs:string(Hidden_byte1) ne '00'}"/>
> </xs:appinfo> </xs:annotation>
> <xs:elementname="Name"type="xs:string"dfdl:representation="text"
> dfdl:encoding="ISO-8859-1"dfdl:inputValueCalc="{
> fn:concat(xs:string(../Hidden_byte1),
> xs:string(../Hidden_byte2),
> xs:string(../Hidden_byte3),
> xs:string(../Hidden_byte4),
> xs:string(../Hidden_byte5),
> xs:string(../Hidden_byte6),
> xs:string(../Hidden_byte7),
> xs:string(../Hidden_byte8))}"
> />
> </xs:sequence>
> </xs:choice>
> </xs:sequence>
> </xs:complexType>
> </xs:element>
>
>
> <xs:groupname="hidden_hexBinary8_Group">
> <xs:sequence>
> <xs:elementname="Hidden_byte1"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte2"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte3"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte4"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte5"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte6"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte7"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/>
> <xs:elementname="Hidden_byte8"type="hexBinary1"dfdl:outputValueCalc='{
> . }'/> </xs:sequence> </xs:group>
>
>
> <xs:simpleTypename="hexBinary1"dfdl:length="1"dfdl:lengthKind="explici
> t"dfdl:lengthUnits="bytes">
> <xs:restrictionbase="xs:hexBinary"/>
> </xs:simpleType>
>