- From: <info@xml4pharma.com>
- Date: Mon, 29 Sep 2008 12:41:53 +0200
- To: <info@XML4Pharma.com>
- To: <xmlschema-dev@w3.org>
- To: <mike@saxonica.com>
Dear Mike,
I left it out for brevity. Here is the (extremely simple) schema C-ns.xsd:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="C-namespace" xmlns="C-namespace">
<xs:element name="C"></xs:element>
<xs:attribute name="C_Attribute"/>
</xs:schema>
It just defines a new element and attribute in the C-namespace.
With best regards,
Jozef Aerts
XML4Pharma
===========================
One of your schema document imports C-ns.xsd, but you haven't supplied
anything with this name.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: xmlschema-dev-request@w3.org
> [mailto:xmlschema-dev-request@w3.org] On Behalf Of XML4Pharma
> Sent: 26 September 2008 09:04
> To: xmlschema-dev@w3.org
> Subject: redefine of redefine in series of schemas
>
>
> I have a schema wich defines an element A in namespace "A-namespace".
> I made it so that the A-element is extensible with child
> elements and attributes from another namespace, so that I can
> have e.g.
>
>
> <?xml version="1.0" encoding="UTF-8"?>
> <A xmlns="A-namespace" xmlns:b="B-namespace" b:B_Attribute="Hallo">
> <b:B/>
> </A>
>
> My schemas for the A-namespace are:
>
> A.xsd:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema targetNamespace="A-namespace" xmlns="A-namespace"
> xmlns:xs=http://www.w3.org/2001/XMLSchema
> elementFormDefault="qualified" attributeFormDefault="unqualified">
> <!-- include base schema -->
> <xs:include schemaLocation="A-ns.xsd"/>
> </xs:schema>
>
> and A-ns.xsd:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> targetNamespace="A-namespace" xmlns="A-namespace"
> elementFormDefault="qualified" attributeFormDefault="unqualified">
>
> <!-- attributes to A element -->
> <xs:attributeGroup name="A_AttributeDefinition">
> <xs:attribute name="A_Attribute"/>
> </xs:attributeGroup>
>
> <!-- allow extension attributes to A element -->
> <xs:attributeGroup name="A_AttributeExtension"></xs:attributeGroup>
>
> <!-- allow extension child elements to A element -->
> <xs:group name="A_ElementExtension"><xs:sequence/></xs:group>
>
> <!-- A element complexType definition -->
> <xs:complexType name="MycomplexTypeDefinition-A">
> <xs:sequence>
> <xs:group ref="A_ElementExtension" minOccurs="0"
> maxOccurs="unbounded"/>
> </xs:sequence>
> <xs:attributeGroup ref="A_AttributeDefinition"/>
> <xs:attributeGroup ref="A_AttributeExtension"/>
> </xs:complexType>
>
> <!-- A element definition -->
> <xs:element name="A" type="MycomplexTypeDefinition-A"/>
>
> </xs:schema>
>
> For the B-namespace I have the following schemas:
> - B.xsd is the main schema
> - B-ns.xsd defines the elements of attributes of namespace
> "B-namespace"
> - B-extensionToA.xsd defines how the elements/attributes from the
> B-namespace may be added to those of the A-namespace.
>
> B.xsd:
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xs:schema targetNamespace="A-namespace" xmlns="A-namespace"
> xmlns:xs=http://www.w3.org/2001/XMLSchema xmlns:b="B-namespace"
> elementFormDefault="qualified" attributeFormDefault="unqualified">
>
> <xs:include schemaLocation="B-extensionToA.xsd"/>
>
> </xs:schema>
>
> B-ns.xsd:
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xs:schema targetNamespace="B-namespace"
> xmlns="http://www.w3.org/2001/XMLSchema"
> xmlns:xs=http://www.w3.org/2001/XMLSchema xmlns:b="B-namespace"
> elementFormDefault="qualified" attributeFormDefault="unqualified">
>
> <!-- define a B element that is extensible -->
>
> <!-- attributes to B element - definition -->
> <xs:attributeGroup name="B_AttributeDefinition">
> <xs:attribute name="B_Attribute"/> <!-- defines a simple
> attribute
> "B_Attribute" -->
> </xs:attributeGroup>
>
> <!-- allow extension attributes to B element -->
> <xs:attributeGroup name="B_AttributeExtension"></xs:attributeGroup>
> <!-- allow extension child elements to B element -->
> <xs:group name="B_ElementExtension"><xs:sequence/></xs:group>
>
> <!-- B element complexType definition -->
> <xs:complexType name="MycomplexTypeDefinition-B">
> <xs:sequence>
> <xs:group ref="b:B_ElementExtension" minOccurs="0"
> maxOccurs="unbounded"/>
> </xs:sequence>
> <xs:attributeGroup ref="b:B_AttributeDefinition"/>
> <xs:attributeGroup ref="b:B_AttributeExtension"/>
> </xs:complexType>
>
> <!-- B element definition -->
> <xs:element name="B" type="b:MycomplexTypeDefinition-B"/>
> </xs:schema>
>
> B_ExtensionToA.xsd:
>
> <?xml version="1.0" encoding="ISO-8859-1"?>
> <xs:schema targetNamespace="A-namespace" xmlns="A-namespace"
> xmlns:b="B-namespace" xmlns:xs=http://www.w3.org/2001/XMLSchema
> elementFormDefault="qualified" attributeFormDefault="unqualified">
>
> <!-- allow to use elements from the B-namespace in elements from the
> A-namespace -->
> <xs:import namespace="B-namespace" schemaLocation="B-ns.xsd"/>
>
> <!-- add extensions to A schema -->
> <xs:redefine schemaLocation="A.xsd">
>
> <!-- allow an attribute B_Attribute to the A element -->
> <xs:attributeGroup name="A_AttributeExtension">
> <xs:attributeGroup ref="A_AttributeExtension"/>
> <xs:attribute ref="b:B_Attribute"/>
> </xs:attributeGroup>
>
> <!-- allow B element to be a child element of A -->
> <xs:group name="A_ElementExtension">
> <xs:sequence>
> <xs:group ref="A_ElementExtension"/>
> <xs:element ref="b:B" minOccurs="0"/>
> </xs:sequence>
> </xs:group>
> </xs:redefine>
>
> </xs:schema>
>
> This works great !
>
> Now comes the difficult part:
>
> I need to make the elements of as well the A-namespace as the
> B-namespace
> extensible so that I can add elements/attributes to A-elements and
> B-elements from a third namespace, the "C-namespace".
>
> So I use the same mechanism in the B-namespace as I did for
> the A-namespace
> (see B-ns.xsd above).
>
> So for the C-extension schema C-extensionToB.xsd I write:
>
> <?xml version="1.0" encoding="UTF-8"?>
> <xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema
> targetNamespace="A-namespace" xmlns="A-namespace"
> xmlns:b="B-namespace"
> xmlns:c="C-namespace">
>
> <!-- import elements from C-namespace -->
> <xs:import namespace="C-namespace" schemaLocation="C-ns.xsd"/>
> <!--xs:import namespace="B-namespace" schemaLocation="B-ns.xsd"/-->
>
>
> <xs:redefine schemaLocation="B-extensionToA.xsd">
> <!-- Add C element to A element -->
> <xs:group name="A_ElementExtension">
> <xs:sequence>
> <xs:group ref="A_ElementExtension"/>
> <xs:element ref="c:C"/>
> </xs:sequence>
> </xs:group>
>
> <!-- Add C element to B element --><!-- causes problems -->
> <xs:group name="B_ElementExtension">
> <xs:sequence>
> <xs:group ref="B_ElementExtension"/>
> <xs:element ref="c:C"/>
> </xs:sequence>
> </xs:group>
> </xs:redefine>
>
> </xs:schema>
>
> With this I can add elements/attributes from the C-namespace
> to elements of
> the A-namespace, e.g.
>
> <?xml version="1.0" encoding="UTF-8"?>
> <A xmlns="A-namespace" xmlns:b="B-namespace" xmlns:c="C-namespace"
> b:B_Attribute="Hallo">
> <b:B/>
> <c:C/>
> </A>
>
> I can however NOT add elements from the C-namespace to those of the
> B-namespace.
>
> For example, the following seems not to be possible - I get
> an error "cannot
> resolve the name 'B_ElementExtension_....." to a 'group' component
>
> <?xml version="1.0" encoding="UTF-8"?>
> <A xmlns="A-namespace" xmlns:b="B-namespace" xmlns:c="C-namespace"
> b:B_Attribute="Hallo">
> <b:B>
> <c:C/>
> </b:B>
> <c:C/>
> </A>
>
> It looks as using the "redefine" mechanism, it is only
> possible to add
> elements/attributes to elements of the namespace that is the
> "targetNamespace".
>
> The problem seems to be in the snippet in the C_ExtensionToB.xsd:
>
> <xs:group name="B_ElementExtension">
> <xs:sequence>
> <xs:group ref="B_ElementExtension"/>
> <xs:element ref="c:C"/>
> </xs:sequence>
> </xs:group>
>
> i.e. I am trying to add a C-element to an element in the
> B-namespace that is
> not the targetNamespace.
>
> So my question: is there another way to make this possible ?
>
> Of course I could make a single XSD (or a small set) to have
> all this, but
> there are some requirements from my employer:
> - all the schemas for the A-namespace must reside in a single
> directory
> - all the schemas for the B-namespace must reside in another single
> directory. This directory may not contain any copies of
> schemas from the
> A-directory
>
> Until here, no problem. The next requirements is:
> - all the schemas for the C-namespace must reside in a third
> directory. No
> copies of schemas from the A-directory nor from the
> B-directory may be
> present.
> I.e. the C-schemas should use (unaltered) schemas from the A- and
> B-directory directly
>
> The idea behind these requirements is that we have a fixed
> library of A- and
> B-Schemas, and that schema developers can define totally
> different schemas
> that have elements/attributes that extend as well the A- as
> B- elements.
>
> The top element of all the instance documents will however
> ALWAYS be in the
> A-namespace.
>
> Any proposals how this can be accomplished are very welcome.
>
> Jozef
>
> Jozef Aerts
>
> XML4Pharma
>
>
>
>
Received on Monday, 29 September 2008 10:42:36 UTC