Hi Folks,
Here are two sample inputs:
John Doe/2006N-05912E/Sally Smith
John Doe/-/Sally Smith
It is the field in the middle that is of interest.
The field is a composite field, i.e., it consists of a series of parts: lat
degrees, lat minutes, lat hemisphere, hyphen, long degrees, long minutes, long
hemisphere. No separator between the parts.
The field is nillable and the hyphen is the nil value.
The first input shown above succeeds, the second fails to parse.
What we have here is a variable length, nillable element with a complexType and
the nil value is not %ES;. As we have determined in previous posts, Daffodil
does not support this. So, the workaround is to place the element in a choice,
where the first branch of the choice is the element minus the nillable stuff
and the second branch is a plain string element that is nillable. Well, I
implemented that and Daffodil complains:
[error] Parse Error: Failed to parse infix separator. Cause: Parse Error:
Separator '/' not found
When I use the -V limited parse option I get a completely different set of
error messages, e.g.:
[error] Validation Error: LatitudeMinutes failed facet checks due to: facet
pattern(s):
[0-9]{2}|[0-9]{2}\.[0-9]{1}|[0-9]{2}\.[0-9]{2}|[0-9]{2}\.[0-9]{3}|[0-9]{2}\.[0-9]{4}
Am I doing something wrong in my DFDL schema (shown below) or is this a bug in
Daffodil? /Roger
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:format
alignment="1"
alignmentUnits="bytes"
emptyValueDelimiterPolicy="none"
encoding="ASCII"
encodingErrorPolicy="replace"
escapeSchemeRef=""
fillByte="%SP;"
floating="no"
ignoreCase="yes"
initiatedContent="no"
initiator=""
leadingSkip="0"
lengthKind="delimited"
lengthUnits="characters"
nilValueDelimiterPolicy="none"
occursCountKind="implicit"
outputNewLine="%CR;%LF;"
representation="text"
separator=""
separatorSuppressionPolicy="anyEmpty"
sequenceKind="ordered"
textBidi="no"
textPadKind="none"
textTrimKind="none"
trailingSkip="0"
truncateSpecifiedLengthString="no"
terminator=""
textNumberRep="standard"
textStandardBase="10"
textStandardZeroRep="0"
textNumberRounding="pattern"
textStandardExponentRep="E"
textNumberCheckPolicy="strict"/>
</xs:appinfo>
</xs:annotation>
<xs:element name="Test">
<xs:complexType>
<xs:sequence dfdl:separator="/" dfdl:separatorPosition="infix">
<xs:element name="A" type="xs:string"/>
<xs:choice dfdl:choiceLengthKind="implicit">
<xs:element name="Origin">
<xs:complexType>
<xs:sequence dfdl:separator="">
<xs:element name="LatitudeDegrees"
dfdl:lengthKind="explicit" dfdl:length="2">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LatitudeMinutes"
dfdl:lengthKind="pattern" dfdl:lengthPattern=".*?(?=(N|S))">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{1}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{2}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{3}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LatitudeHemisphere"
dfdl:lengthKind="explicit" dfdl:length="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="N"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="Hyphen"
dfdl:lengthKind="explicit" dfdl:length="1">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="-"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LongitudeDegrees"
dfdl:lengthKind="explicit" dfdl:length="3">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{3}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LongitudeMinutes"
dfdl:lengthKind="pattern" dfdl:lengthPattern=".*?(?=(E|W))">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{1}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{2}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{3}"/>
<xs:pattern
value="[0-9]{2}\.[0-9]{4}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LongitudeHemisphere">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="E"/>
<xs:enumeration value="W"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Origin_" type="xs:string" nillable="true"
dfdl:nilKind="literalValue" dfdl:nilValue="-"/>
</xs:choice>
<xs:element name="B" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>