- From: Kasimier Buchcik <kbuchcik@4commerce.de>
- Date: Thu, 11 Aug 2005 15:09:54 +0200
- To: XML-SCHEMA <xmlschema-dev@w3.org>
Hi, I'm about to implement redefinitions and tried to create some initial tests for this purpose. I would be glad if you could find time to comment/correct my observations and tests - especially what the intended outcome of the tests is. Reading the spec, plus the mail archives I learned - and wonder - the following: - Redefines are pervasive with regard to references. I.e. all references to components, wherever they may be will resolve to the redefined components only. - Multiple redefinitions of the same component are disallowed; be it in different schemas, inside a single <redefine> or with multiple <redefines> referring to the same document inside a single document. Only chains of redefinitions are allowed - with a chain of documents. This refers to http://lists.w3.org/Archives/Public/xmlschema-dev/2005Apr/0004.html However, the 2nd scenario presented in http://lists.w3.org/Archives/Public/xmlschema-dev/2005Apr/0011.html looks like a nice-to-have to redefine components in a compact way; i.e. without extense use of chained schema documents. But I guess the reason for ruling this out, is the unwanted dependancy on the order of components. Hmm, although one could remove the dependancy by introducing attributes (like "refer" for IDCs) to clearly define chains of redefinitions; after all, a document is more overhead than two additional attributes. - Redefinition of simple/complex types produce two components, the newly redefined and a copy of the base type with an "absent" name. The unnamed component: what is it needed for here exactly? I don't understand the spec here. Further, if the redefining schema is itself included into a parent schema, is this unnamed component added to the parent schema as well? - When components of included/redefined/imported schemas are added to the parent schema, is the pervasive effect expected to have been already applied? An example for this would be in "final.xsd" below: here we include a "base" type, and after this we include a schema, which redefined this "base" type. If we wouldn't hold back component inclusion until all redefinitions are known, we would violate sch-props-correct.2, since both the original "base" type and the derived type would be included. So it looks like the sequence here should be: 1. parse the schemas and create the components 2. find the top-most redefinitions, check if there are duplicate redefinitions of the same component, apply redefinitions globally 3. add components of included/imported schemas to parent schemas Tests ----- I would _really_ be nice if you could spare the time to comment the results of the tests. I used Xerces-J 2.7.1 and XSV 2.10-1 for the tests. I get very different results for Xerces and XSV. Often Xerces reports the name "base_fn3dktizrknc9pi" for the base type "base", so I wonder where this comes from, and how this is related to the errors. Does this reflect the "unnamed" component? base.xsd -------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="base"> <xs:restriction base="xs:integer"> <xs:maxInclusive value="5"/> </xs:restriction> </xs:simpleType> </xs:schema> derived.xsd ----------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="4"/> </xs:restriction> </xs:simpleType> </xs:redefine> </xs:schema> derived2.xsd ------------ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="3"/> </xs:restriction> </xs:simpleType> </xs:redefine> </xs:schema> derived3.xsd (note that this is the same as derived.xsd) ------------ <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="4"/> </xs:restriction> </xs:simpleType> </xs:redefine> </xs:schema> chain-dummy.xsd --------------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="base.xsd"/> </xs:schema> final.xsd --------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="base.xsd"/> <xs:include schemaLocation="derived.xsd"/> <xs:element name="foo" type="base"/> </xs:schema> final2.xsd ---------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="4"/> </xs:restriction> </xs:simpleType> </xs:redefine> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="3"/> </xs:restriction> </xs:simpleType> </xs:redefine> <xs:element name="foo" type="base"/> </xs:schema> final3.xsd ---------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="derived2.xsd"/> <xs:include schemaLocation="derived.xsd"/> <xs:element name="foo" type="base"/> </xs:schema> final4.xsd ---------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="derived3.xsd"/> <xs:include schemaLocation="derived.xsd"/> <xs:element name="foo" type="base"/> </xs:schema> final5.xsd ---------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="base.xsd"/> <xs:redefine schemaLocation="base.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="4"/> </xs:restriction> </xs:simpleType> </xs:redefine> <xs:element name="foo" type="base"/> </xs:schema> final6.xsd ---------- <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include schemaLocation="base.xsd"/> <xs:redefine schemaLocation="chain-dummy.xsd"> <xs:simpleType name="base"> <xs:restriction base="base"> <xs:maxInclusive value="4"/> </xs:restriction> </xs:simpleType> </xs:redefine> <xs:element name="foo" type="base"/> </xs:schema> instance.xml ------------ <foo> 3 </foo> Validation of instance.xsd with final.xsd -------------------------------------------- Xerces-J: base.xsd:3,29: (Error) sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ',base_fn3dktizrknc9pi'. XSV: no errors This would fall into the category: first apply redefinitions, then include the components. Looks like this should not fail. Validation of instance.xsd with final2.xsd ------------------------------------------ Xerces-J: final2.xsd:13,30: (Error) sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ',base'. XSV: no errors Should this fail due to multiple redefinitions of the same component? Validation of instance.xsd with final3.xsd ------------------------------------------ Xerces-J: derived2.xsd:4,30: (Error) sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ',base_fn3dktizrknc9pi'. XSV: no errors This is interesting, since the instance is still valid with XSV if we change the integer simple content of <foo> to 4. So it seems like the 2nd include of "derived.xsd" overwrote the restriction made in "derived2.xsd". How does this work? Is this correct? This is the sequence I would expect: - "base" is included - "base" is redefined in "derive2.xsd" to maxInclusive == 3 - redefines are pervasive with an "unbounded" scope, so all operations to come on "base", should be performed on the redefined "base" - the redefined "base" is tried to be redefined in "derive.xsd", but should fail since maxInclusive == 4 is not a valid restriction of maxInclusive == 3 I checked if XSV perhaps simply does not catch the restriction error, and indeed, in a standalone test, XSV does not bark when maxInclusive == 3 is restricted with maxInclusive == 4. Although I tend to think that this is just a restriction bug, clarification is needed if XSV perhaps redefined the original "base" in "derived.xsd" a second time and overwrote previous redefinitions. Anyway, shouldn't this test fail due to multiple redefinitions of the same component? Validation of instance.xsd with final4.xsd ------------------------------------------ Xerces-J: derived3.xsd:4,30: (Error) sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ',base_fn3dktizrknc9pi'. XSV: no errors I think here, Xerces should not bark since the components are identic. I.e. the redefinitions of "base" in "derived.xsd" and "derived3.xsd" produce identic types; component identity is still implementation dependant, so they, like us, don't try yet to check for identity. But maybe something different happens here as the report comes with a name of "base_fn3dktizrknc9pi" for the type. What's going on here exactly? Validation of instance.xsd with final5.xsd ------------------------------------------ Xerces-J: base.xsd:3,29: (Error) sch-props-correct.2: A schema cannot contain two global components with the same name; this schema contains two occurrences of ',base_fn3dktizrknc9pi'. XSV: no errors We include and redefine the same schema document here. This is comparable to "final.xsd", with the difference that the redefinition is in-line here, rather than via an other document. Validation of instance.xsd with final6.xsd ------------------------------------------ Xerces-J: no errors XSV: no errors Now, that's interesting. Xerces doesn't bark, although we just used a dummy middle-man for the redefine. In what way is this so different from "final5.xsd"? This is the reduced scenario reported in http://lists.w3.org/Archives/Public/xmlschema-dev/2005Feb/0008.html Regards, Kasimier
Received on Thursday, 11 August 2005 13:11:21 UTC