In your dfdl:outputValueCalc expression, your final else is
else "daf:error()"
Which is a string because of the quotes. So your if-expression results
in either a number or a string, which isn't allowed. You instead want to
call daf:error() by removing the quotes, e.g.
else daf:error()
Also note that fn:error() is now part of the DFDL spec, with daf:error()
being deprecated. So changing to this:
else fn:error()
will remove any warnings you might be seeing. The daf namespace has also
been deprecated. Functions are now either in the dfdlx namespace if they
are Daffodil specific functions:
xmlns:dfdlx="http://www.ogf.org/dfdl/dfdl-1.0/extensions"
or are in the fn namespace.
- Steve
On 2023-03-17 08:18 AM, Roger L Costello wrote:
Hi Folks,
I have a one-byte binary input file. If the input is 0 then I want the XML output to be "No Signal". If the
input is 1 then I want the output to be "Green". If the input is 2 then I want the output to be
"Yellow". If the input if 3 then I want the output to be "Red". For all other inputs, generate an
error.
<xs:sequence dfdl:hiddenGroupRef="raw_Signal" />
<xs:element name='Signal' type='xs:string' dfdl:inputValueCalc='{
if (../binary_Signal eq 0) then "No Signal"
else if (../binary_Signal eq 1) then "Green"
else if (../binary_Signal eq 2) then "Yellow"
else if (../binary_Signal eq 3) then "Red"
else "Error"
}' />
<xs:group name="raw_Signal">
<xs:sequence>
<xs:element name="binary_Signal" type="unsignedint2"
dfdl:outputValueCalc='{
if (../Signal eq "No Signal") then 0
else if (../Signal eq "Green") then 1
else if (../Signal eq "Yellow") then 2
else if (../Signal eq "Red") then 3
else "daf:error()"
}' />
</xs:sequence>
</xs:group>
That results in Daffodil generating this error message:
Error: If-expression branches must have similar types, but were int and string
What am I doing wrong? Below is the entire DFDL schema. /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/"
xmlns:fn="http://www.w3.org/2005/xpath-functions">
<xs:annotation>
<xs:appinfo source="http://www.ogf.org/dfdl/">
<dfdl:format
alignment="1"
alignmentUnits="bits"
binaryFloatRep="ieee"
binaryNumberRep="binary"
bitOrder="leastSignificantBitFirst"
byteOrder="littleEndian"
calendarPatternKind="implicit"
choiceLengthKind="implicit"
documentFinalTerminatorCanBeMissing="yes"
emptyValueDelimiterPolicy="none"
encoding="ISO-8859-1"
encodingErrorPolicy="replace"
escapeSchemeRef=""
fillByte="f"
floating="no"
ignoreCase="no"
initiatedContent="no"
initiator=""
leadingSkip="0"
lengthKind="implicit"
lengthUnits="bits"
nilKind="literalValue"
nilValueDelimiterPolicy="none"
occursCountKind="implicit"
outputNewLine="%CR;%LF;"
representation="binary"
separator=""
separatorPosition="infix"
separatorSuppressionPolicy="anyEmpty"
sequenceKind="ordered"
textStandardZeroRep="0"
textStandardDecimalSeparator="."
textStandardInfinityRep="Inf"
textStandardExponentRep="E"
textStandardNaNRep="NaN"
textNumberPattern="#,##0.###;-#,##0.###"
textNumberRounding="explicit"
textNumberRoundingMode="roundUnnecessary"
textNumberRoundingIncrement="0"
textStandardGroupingSeparator=","
terminator=""
textBidi="no"
textNumberCheckPolicy="strict"
textNumberRep="standard"
textOutputMinLength="0"
textPadKind="none"
textStandardBase="10"
textTrimKind="none"
trailingSkip="0"
truncateSpecifiedLengthString="no"
utf16Width="fixed"/>
</xs:appinfo>
</xs:annotation>
<xs:element name="Test">
<xs:complexType>
<xs:sequence>
<xs:element name="Segment">
<xs:complexType>
<xs:sequence>
<xs:sequence dfdl:hiddenGroupRef="raw_Signal" />
<xs:element name='Signal' type='xs:string'
dfdl:inputValueCalc='{
if (../binary_Signal eq 0) then "No Signal"
else if (../binary_Signal eq 1) then "Green"
else if (../binary_Signal eq 2) then "Yellow"
else if (../binary_Signal eq 3) then "Red"
else "Error"
}' />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:group name="raw_Signal">
<xs:sequence>
<xs:element name="binary_Signal" type="unsignedint2"
dfdl:outputValueCalc='{
if (../Signal eq "No Signal") then 0
else if (../Signal eq "Green") then 1
else if (../Signal eq "Yellow") then 2
else if (../Signal eq "Red") then 3
else "daf:error()"
}' />
</xs:sequence>
</xs:group>
<xs:simpleType name="unsignedint2" dfdl:length="2" dfdl:lengthKind="explicit">
<xs:restriction base="xs:unsignedInt"/>
</xs:simpleType>
</xs:schema>