RE: [xml] Failed schema validation with substitution groups and choice
- From: "Buchcik, Kasimier" <k buchcik 4commerce de>
- To: "Michael Romer" <michael romer mail utexas edu>
- Cc: xml gnome org
- Subject: RE: [xml] Failed schema validation with substitution groups and choice
- Date: Tue, 9 May 2006 22:11:14 +0200
Hi,
Fixed in CVS, xmlschemas.c, revision 1.201.
See http://bugzilla.gnome.org/show_bug.cgi?id=341150
In xmlSchemaBuildContentModelForSubstGroup(),
xmlAutomataNewOnceTrans2() was incorrectly used instead of
xmlAutomataNewTransition2(); seems like a copy&paste bug from
the XML_SCHEMA_TYPE_ALL section in xmlSchemaBuildAContentModel().
The usage of xmlAutomataNewOnceTrans2() restricted the members
of substitution-groups (except the group's head) to the occurence
of 1.
Thanks for the thorough report!
Regards,
Kasimier
-----Original Message-----
From: xml-bounces gnome org [mailto:xml-bounces gnome org] On
Behalf Of Michael Romer
Greetings. While working on an XML based project for work, I
ran into the
following bug with the libxml2 validator. I've attached a
simple test case
that, when run through xmllint, should reproduce the same results I am
receiving.
The problem is as follows. The supplied libxml2 validator,
xmllint, will fail
to validate the following instance document against the
schema specified below
if you uncomment the line specified in the instance document;
however when it
is commented, the instance document will validate just fine.
Instance document:
------------------
<?xml version="1.0" encoding="UTF-8"?>
<TestRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="common-schema.xsd">
<Events>
<TestEvent>Test 1.</TestEvent>
<!-- Uncomment the following element to cause
libxml's xmllint to
fail to validate. -->
<!-- <TestEvent>Test 2.</TestEvent> -->
</Events>
</TestRoot>
Schema to validate against:
---------------------------
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified">
<!-- This is the head of our substitution group for
events that have only
simple content. -->
<xs:element name="SimpleEvent" type="SimpleEventType"/>
<!-- All SimpleEvent elements have the required set of
attributes -->
<xs:complexType name="SimpleEventType">
<xs:simpleContent>
<xs:extension base="xs:anySimpleType">
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- Common members of the SimpleEvent substitution group -->
<xs:element name="TestEvent" substitutionGroup="SimpleEvent">
<xs:complexType>
<xs:simpleContent>
<xs:restriction base="SimpleEventType">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<!-- Root element -->
<xs:element name="TestRoot" type="TestRootType"/>
<!-- Core data type of an audit trail -->
<xs:complexType name="TestRootType">
<xs:sequence>
<xs:element name="Events">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element ref="SimpleEvent"/>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>
I have done numerous test cases and pinned the problem to be
the fact that a
substitution group is being used inside the choice group
element, which is
specified to appear zero or more times in an instance
document. The key is
that each choice group contains one SimpleEvent, or any
element that can be
substitutable for SimpleEvent (in this case, TestEvent is
declared to be part
of the SimpleEvent substitution group, so it should work just
fine). In
essense, any choice group that contains an element that can
be substituted by
another element in the corresponding substitution group, and
if the schema
allows for that choice group to appear multiple times in an
instance document,
then the validator will fail to validate any instance
document that has more
than substitutable element specified (as in the above case
when the second
SimpleElement is uncommented from the instance document).
From what I can gather, the libxml2 validator is getting
confused and instead of
thinking that the two TestEvent elements in the original
instance document
belong to two separate choice groups, it actually thinks that
they are both in
the same choice group. If this is true, this would explain
the error message
that is obtained when I run xmllint:
"element TestEvent: Schemas validity error : Element
'TestEvent': This element
is not expected."
I have tried changing the choice group to a sequence group,
and the exact same
error occurs. I have also used the following validators, and
they all will
validate the supplied instance document against the supplied
schema without any
problem: Xerces, MSXML 4.0 SP2, MSXML.NET, and XSV, hence
leading me to believe
this is truly a bug with the libxml2 validator.
I've also filled out a Bugzilla bug report describing what
has been described in
this post.
Thanks,
Michael Romer
_______________________________________________
xml mailing list, project page http://xmlsoft.org/
xml gnome org
http://mail.gnome.org/mailman/listinfo/xml
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]