Hi Steve, > dfdl:lengthPattern="foo|bar|-"
That's really interesting. In my data format, the dash is to be used only to indicate there is no data available. Doesn't that lengthPattern mean, "The allowable values for this element are foo, bar, or dash"? If I use that lengthPattern, is there any reason to use nillable="true" and dfdl:nilValue="-"? /Roger -----Original Message----- From: Steve Lawrence <[email protected]> Sent: Wednesday, April 27, 2022 3:04 PM To: [email protected] Subject: [EXT] Re: Bug in Daffodil? Your pattern length must include something that matches the nil content as well, otherwise Daffodil doesn't actaully know how long your nil content is. So your pattern needs to look something like this: dfdl:lengthPattern="foo|bar|-" Additionally, because the "A" element could be nilled, you also need to update your assertion. This is because when an element is nilled it doesn't actually have a value, so accessing the value to compare it to the empty string will cause an SDE. Instead, your assertion wants to be something like this: <dfdl:assert test="{ fn:nilled(.) or . ne '' }"/> This asserts that either your element is nilled or its value is not the empty string. - Steve On 4/27/22 2:11 PM, Roger L Costello wrote: > Hi Folks, > > My input consists of one field terminated by // > > The value of the field is either foo or bar. > > Here is a sample input: > > foo// > > My DFDL schema works fine with that input. > > The field is nillable and the nilValue is a hyphen. Here is a valid input: > > -// > > My DFDL schema fails with that input. > > I specify the field using dfdl:lengthKind="pattern" and > dfdl:lengthPattern="foo|bar" > > Below is my DFDL schema. Am I doing something wrong or is this a bug in > Daffodil? If so, is there a workaround? /Roger > > <?xml version="1.0" encoding="UTF-8"?> > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > xmlns:dfdl="http://www.ogf.org/dfdl/dfdl-1.0/" elementFormDefault="qualified"> > <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" > nilKind="literalValue" > nilValue="-" > 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" dfdl:terminator="//"> > <xs:complexType> > <xs:sequence dfdl:separator="/" dfdl:separatorPosition="infix"> > <xs:element name="A" type="non-zero-length-string" > nillable="true" > dfdl:lengthPattern="foo|bar" > dfdl:nilValue="-" /> > </xs:sequence> > </xs:complexType> > </xs:element> > > <xs:simpleType name="non-zero-length-string" dfdl:lengthKind="pattern"> > <xs:annotation> > <xs:appinfo source="http://www.ogf.org/dfdl/"> > <dfdl:assert test="{ . ne '' }"/> > </xs:appinfo> > </xs:annotation> > <xs:restriction base="xs:string"/> > </xs:simpleType> > > </xs:schema>
