[ 
https://issues.apache.org/jira/browse/DAFFODIL-2946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17891511#comment-17891511
 ] 

Steve Lawrence commented on DAFFODIL-2946:
------------------------------------------

This is intended behavior. Xerces is not aware of DFDL properties, such as 
dfdl:hiddenGroupRef--they are just ignored. So from its perspective the hidden 
group ref sequence just looks like "<sequence />" so it never sees the 
restrictions in the hidden group ref. And it also never sees Daffodils internal 
infoset that keeps track of hidden elements. It only sees the internal infoset 
projected into XML, which does not contain any hidden elements.

So there is no way for Xerces to validation hiddenGroupRef elements. Some 
workarounds if these need to validation:
1. Change the hiddenGoupRef to a normal group ref--if it's not hidden Xeres can 
validate it.
2. Switch to limited validation, which is done by Daffodil and can see and 
validate hidden groups
3. Use dfdl:assert with the dfdl:checkConstraints function and 
failureType="recoverableError" on the hidden elements. This creates validation 
diagnostics that can be checked, note that they are created regardless if 
validation is enabled or not
4. Have a non-hidden element (e.g "isValid") that has an inputValueCalc that 
calls checkcConstraints for elements in the hiddenGroup. The value of this 
element will be true or false depending on the results of the checkConstraints 
calls, and it can be validated by Xereces that is must be true. We lose 
specific information of what was invalid, but that's the nature of hiding things

> Xerces Validation not working for element in HiddenGroupRef
> -----------------------------------------------------------
>
>                 Key: DAFFODIL-2946
>                 URL: https://issues.apache.org/jira/browse/DAFFODIL-2946
>             Project: Daffodil
>          Issue Type: Bug
>          Components: Back End
>    Affects Versions: 3.9.0
>            Reporter: Olabusayo Kilo
>            Priority: Major
>
> When you have a schema defined with a group referenced with elements that 
> have facet restrictions, Xerces (validation = on) accurately validates the 
> elements [ex1]. However if that group is referenced as a hidden group ref, 
> Xerces no longer validates the elements in the hidden group [ex2].
> ex1
> {code:xml}
> <tdml:defineSchema name="s2" elementFormDefault="unqualified">
>     <xs:include 
> schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
>     <dfdl:format ref="ex:GeneralFormat" lengthUnits="bits" 
> encoding="X-DFDL-HEX-LSBF"
>         byteOrder="littleEndian" bitOrder="leastSignificantBitFirst" 
> alignment="1" alignmentUnits="bits"/>
>     <xs:group name="group1">
>       <xs:sequence>
>         <xs:element name="o4" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"/>
>         <xs:element name="o3" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"/>
>         <xs:element name="o2" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"/>
>         <xs:element name="o1" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"/>
>       </xs:sequence>
>     </xs:group>
>     <xs:simpleType name="string1">
>       <xs:restriction base="xs:string">
>         <xs:length value="1"/>
>       </xs:restriction>
>     </xs:simpleType>
>     <xs:simpleType name="valid_0_through_9">
>       <xs:restriction base="ex:string1">
>         <xs:enumeration value="0"/>
>         <xs:enumeration value="1"/>
>         <xs:enumeration value="2"/>
>         <xs:enumeration value="3"/>
>         <xs:enumeration value="4"/>
>         <xs:enumeration value="5"/>
>         <xs:enumeration value="6"/>
>         <xs:enumeration value="7"/>
>         <xs:enumeration value="8"/>
>         <xs:enumeration value="9"/>
>         <!-- NOTE that 10-15 is illegal, so we use the facet above to 
> represent that
>         while they are well-formed, they are invalid -->
>       </xs:restriction>
>     </xs:simpleType>
>     <xs:element name="r">
>       <xs:complexType>
>         <xs:sequence>
>           <xs:element name="e1">
>             <xs:complexType>
>               <xs:group ref="ex:group1"/>
>             </xs:complexType>
>           </xs:element>
>           <xs:element name="e2">
>             <xs:complexType>
>               <xs:group ref="ex:group1"/>
>             </xs:complexType>
>           </xs:element>
>         </xs:sequence>
>       </xs:complexType>
>     </xs:element>
>   </tdml:defineSchema>
>  <tdml:parserTestCase name="test2"  model="s2">
>     <tdml:document bitOrder="LSBFirst">
>       <!-- 
> _______________________________________________________________________ 1     
> 2     3     4    -->
>       <tdml:documentPart type="bits" bitOrder="LSBFirst" 
> byteOrder="RTL"><![CDATA[ 0001 0010 0011 0100 ]]></tdml:documentPart>
>       <!-- 
> _______________________________________________________________________ 
> invalid = anything above 9 -->
>       <tdml:documentPart type="bits" bitOrder="LSBFirst" 
> byteOrder="RTL"><![CDATA[ 1010 1001 0101 1111 ]]></tdml:documentPart>
>     </tdml:document>
>     <tdml:infoset>
>       <tdml:dfdlInfoset>
>         <ex:r>
>           <e1>
>             <o4>4</o4>
>             <o3>3</o3>
>             <o2>2</o2>
>             <o1>1</o1>
>           </e1>
>           <e2>
>             <o4>F</o4>
>             <o3>5</o3>
>             <o2>9</o2>
>             <o1>A</o1>
>           </e2>
>         </ex:r>
>       </tdml:dfdlInfoset>
>     </tdml:infoset>
>     <tdml:validationErrors>
>       <tdml:error>value 'A' of element 'o1' is not valid</tdml:error>        
>       <tdml:error>value 'F' of element 'o4' is not valid</tdml:error>     
>     </tdml:validationErrors>
>   </tdml:parserTestCase>
> {code}
> ex2
> {code:xml}
>   <tdml:defineSchema name="s3" elementFormDefault="unqualified">
>     <xs:include 
> schemaLocation="/org/apache/daffodil/xsd/DFDLGeneralFormat.dfdl.xsd"/>
>     <dfdl:format ref="ex:GeneralFormat" lengthUnits="bits" 
> encoding="X-DFDL-HEX-LSBF"
>         byteOrder="littleEndian" bitOrder="leastSignificantBitFirst" 
> alignment="1" alignmentUnits="bits"/>
>     <xs:group name="group1">
>       <xs:sequence>
>         <xs:element name="o4" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"
>             dfdl:outputValueCalc="{ fn:substring(../value, 4, 1) }"/>
>         <xs:element name="o3" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"
>             dfdl:outputValueCalc="{ fn:substring(../value, 3, 1) }"/>
>         <xs:element name="o2" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"
>             dfdl:outputValueCalc="{ fn:substring(../value, 2, 1) }"/>
>         <xs:element name="o1" type="ex:valid_0_through_9" dfdl:length="4" 
> dfdl:lengthKind="explicit"
>             dfdl:outputValueCalc="{ fn:substring(../value, 1, 1) }"/>
>       </xs:sequence>
>     </xs:group>
>     <xs:group name="group2">
>       <xs:sequence>
>         <xs:sequence dfdl:hiddenGroupRef="ex:group1"/>
>         <xs:element name="value" type="ex:string4" dfdl:inputValueCalc="{ 
> fn:concat(../o1, ../o2, ../o3, ../o4) }"/>
>       </xs:sequence>
>     </xs:group>
>     <xs:simpleType name="string1">
>       <xs:restriction base="xs:string">
>         <xs:length value="1"/>
>       </xs:restriction>
>     </xs:simpleType>
>     <xs:simpleType name="string4">
>       <xs:restriction base="xs:string">
>         <xs:length value="4"/>
>       </xs:restriction>
>     </xs:simpleType>
>     <xs:simpleType name="valid_0_through_9">
>       <xs:restriction base="ex:string1">
>         <xs:enumeration value="0"/>
>         <xs:enumeration value="1"/>
>         <xs:enumeration value="2"/>
>         <xs:enumeration value="3"/>
>         <xs:enumeration value="4"/>
>         <xs:enumeration value="5"/>
>         <xs:enumeration value="6"/>
>         <xs:enumeration value="7"/>
>         <xs:enumeration value="8"/>
>         <xs:enumeration value="9"/>
>         <!-- NOTE that 10-15 is illegal, so we use the facet above to 
> represent that
>         while they are well-formed, they are invalid -->
>       </xs:restriction>
>     </xs:simpleType>
>     <xs:element name="r">
>       <xs:complexType>
>         <xs:sequence>
>           <xs:element name="e1">
>             <xs:complexType>
>               <xs:group ref="ex:group2"/>
>             </xs:complexType>
>           </xs:element>
>           <xs:element name="e2">
>             <xs:complexType>
>               <xs:group ref="ex:group2"/>
>             </xs:complexType>
>           </xs:element>
>         </xs:sequence>
>       </xs:complexType>
>     </xs:element>
>   </tdml:defineSchema>
> <tdml:parserTestCase name="test3"  model="s3" >
>     <tdml:document bitOrder="LSBFirst">
>       <!-- 
> _______________________________________________________________________ 1     
> 2     3     4    -->
>       <tdml:documentPart type="bits" bitOrder="LSBFirst" 
> byteOrder="RTL"><![CDATA[ 0001 0010 0011 0100 ]]></tdml:documentPart>
>       <!-- 
> _______________________________________________________________________ 
> invalid = anything above 9 -->
>       <tdml:documentPart type="bits" bitOrder="LSBFirst" 
> byteOrder="RTL"><![CDATA[ 1010 1001 0101 1111 ]]></tdml:documentPart>
>     </tdml:document>
>     <tdml:infoset>
>       <tdml:dfdlInfoset>
>         <ex:r>
>           <e1><value>1234</value></e1>
>           <e2><value>A95F</value></e2>
>         </ex:r>
>       </tdml:dfdlInfoset>
>     </tdml:infoset>
>     <tdml:validationErrors><!--fails with no ValidationErrors found-->
>       <tdml:error>value 'A' of element 'o1' is not valid</tdml:error>
>       <tdml:error>value 'F' of element 'o4' is not valid</tdml:error>
>     </tdml:validationErrors>
>   </tdml:parserTestCase>
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to