Hi Mukul,
Thank you for your response and suggestion. The current error report is clear 
and useful. But I still think it will be nice if both 'A' and 'B' are listed in 
the error report, since both of them are not expected to be there.  
Herong
    On Friday, June 19, 2020, 2:47:09 PM GMT+8, Mukul Gandhi 
<muk...@apache.org> wrote:  
 
 Hi Herong,
On Thu, Jun 18, 2020 at 12:29 PM Herong Yang <herong_y...@yahoo.com> wrote:

By default, Xerces2 only reports only the first invalid sub-element and skips 
other subsequent invalid siblings. Is the any way to set Xerces2 to report all 
invalid sub-elements?

I don't think that, what you're asking for is possible with Xerces-J.
Personally, I do find the error report you're getting with your XML and XSD 
document samples, from Xerces-J to be useful. 
Here is the sample XML: <?xml version="1.0"?><root> <X/> <A/> <Y/> <B/></root>
Here is the XML Schema: <?xml version="1.0"?><xs:schema 
xmlns:xs="http://www.w3.org/2001/XMLSchema";>  <xs:element name="root"> 
<xs:complexType> <xs:all> <xs:element name="X" minOccurs="0"/> <xs:element 
name="Y" minOccurs="0"/> </xs:all> </xs:complexType> </xs:element></xs:schema>
Here is the Xerces2 validation output: [Error] simple_4.xml:4:6: 
cvc-complex-type.2.4.a: Invalid content was found starting with element 'A'. 
One of '{Y}' is expected.
I want to see both element 'A' and element 'B' being reported in the output.

For your requirements stated above, I could probably suggest the following XML 
Schema 1.1 document (which makes the intent of XML Schema logic more clear),
<?xml version="1.0"?><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema";>
   <xs:element name="root">      <xs:complexType>  <xs:sequence>    <xs:any 
processContents="skip" minOccurs="0" maxOccurs="2"/>  </xs:sequence>  
<xs:assert test="if (count(*) = 0) then true() else                             
if (count(*) = 1) then (*[1]/name() = ('X', 'Y')) else                          
   if (count(*) = 2) then ((*[1]/name() = 'X' and *[2]/name() = 'Y')            
                                                   or                           
                                  (*[1]/name() = 'Y' and *[2]/name() = 'X')) 
else                             false()"/>      </xs:complexType>   
</xs:element>   </xs:schema>
 
-- 
Regards,
Mukul Gandhi
  

Reply via email to