You'll need to use lengthKind="pattern" in this case. You could combine
your pattern restrictions in to a big regex of alternatives, or you
could do something a little less verbose like this:
<xs:element name="LatitudeMinutes" dfdl:lengthKind="pattern"
dfdl:lengthPattern="[0-9]{2}(\.[0-9]{1,4})?" />
Matches the same thing, but is a bit more compact. The same pattern
could be used for the restriction.
Alternatively, if you wanted to differentiate between well-formed/valid
(i.e. different length pattern than restriction pattern), you could even
do something like this:
<xs:element name="LatitudeMinutes" dfdl:lengthKind="pattern"
dfdl:lengthPattern="[0-9]+(\.[0-9]+)?" />
So parsing would accept any decimal number with optional decimal digits,
and then validation could restrict this to the appropriate number of
digits using the existing facets. Note that treating it as an xs:decimal
instead of xs:string might give more you control (e.g. value must be >=
0 and < than 60).
The Hemisphere element would have an explicit length of 1, e.g.
<xs:element name="Hemisphere" dfdl:lengthKind="explicit" dfdl:length="1">
On 8/18/22 12:03 PM, Roger L Costello wrote:
Thanks Steve. Unfortunately, specifying an explicit length on each element is
not going to work. The second element - LatitudeMinutes - can actually be 2, 4,
5, 6, or 7 characters in length:
<xs:element name="LatitudeMinutes">
<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>
And after it are more elements. For example, following it is this element
<xs:element name="Hemisphere">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="N"/>
<xs:enumeration value="S"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
How to handle this situation?
/Roger
-----Original Message-----
From: Steve Lawrence <[email protected]>
Sent: Thursday, August 18, 2022 11:54 AM
To: [email protected]
Subject: [EXT] Re: Bug in Daffodil
You haven't specified a length of the LatitudeDegrees (or
LatitudeMinutes). So the lengthKind is just delimited and so will end up
delimited by the nearest enclosing delimiter, which is the /. So
LatatitudeDegrees is parsed as "2006", and things go off the rails.
Instead, you want your LatitudeDegrees/Minutes elements to have
lengthKind="explicit" with length="2", e.g.:
<xs:element name="Origin">
<xs:complexType>
<xs:sequence>
<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="explicit" dfdl:length="2">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
On 8/18/22 11:08 AM, Roger L Costello wrote:
Hi Folks,
Daffodil is unable to parse DFDL schemas containing two consecutive element
declarations, each with a simpleType which has a facet.
With this input:
John Doe/2006/Sally Smith
The part of interest is the middle part - 2006 - which consists of two
subparts: 20 (LatitudeDegrees) and 06 (LatitudeMinutes). Each subpart is
constrained via XSD facets.
I get this error message when I parse using Daffodil version 3.2.1 (using the
-V limited option):
[error] Validation Error: LatitudeMinutes failed facet checks due to: facet
enumeration(s): 06
Below is my DFDL schema.
I believe this is a bug, yes? Is there a workaround?
<xs:schema xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation xmlns:f="function" xmlns:fn="http://www.w3.org/2005/xpath-functions"
xmlns:regex="regex-functions">
<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:element name="Origin">
<xs:complexType>
<xs:sequence dfdl:separator="">
<xs:element name="LatitudeDegrees">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]{2}"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
<xs:element name="LatitudeMinutes">
<xs:simpleType>
<xs:restriction base="xs:string">
<!--<xs:pattern value="[0-9]{2}"/>-->
<!-- This also fails -->
<xs:enumeration value="06" />
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="B" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>