Hi Geert and Joe, Thanks for the suggestion. I read the article, and I can make chameleon schema work for me.
One question here is: it looks like including chameleon schema will make the element to use the parent schema's target namespace. It works good if I want them to be in the same namespace. If I want to do the following: I have a chameleon schema which defines phone structure called common.xsd then in my document schema, I want to include common.xsd to my account.xsd, and I want to have phone to be in a different namespace other than the account target namespace. I 'm trying to think if I can make author in one namespace other than target namespace, and make editor to be in another namespace other than target namespace. (Does it make sense? Am I too crazy here?) following this idea, I tried proxy schema: my chameleon common schema: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="qualified"> <xs:annotation> <xs:documentation>This scheme defines common shared data object types.</xs:documentation> </xs:annotation> <xs:complexType name="PhoneNumber"> <xs:sequence> <xs:element name="countryCode" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="areaCode" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="exchange" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="number" type="xs:string" minOccurs="0" maxOccurs="1"/> <xs:element name="extension" type="xs:string" minOccurs="0" maxOccurs="1"/> </xs:sequence> </xs:complexType> </xs:schema> my proxy schema: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:pxtns="http://www.aa.com/datamodel/proxy-common" targetNamespace="http://www.aa.com/datamodel/proxy-common" elementFormDefault="qualified" attributeFormDefault="qualified"> <xs:annotation> <xs:documentation>This is a proxy schema to make chameleon common.xsd to have different namespace</xs:documentation> </xs:annotation> <xs:include schemaLocation="common_chameleon.xsd"/> </xs:schema> then my contact schema which import proxy schema: <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://www.aa.com/datamodel/account" xmlns:pxtns="http://www.aa.com/datamodel/proxy-common" targetNamespace="http://www.aa.com/datamodel/account" elementFormDefault="qualified" attributeFormDefault="qualified"> <xs:annotation> <xs:documentation>This schema defines data object types used for interfaces</xs:documentation> </xs:annotation> <xs:import namespace="http://www.aa.com/datamodel/proxy-common" schemaLocation="common_proxy.xsd"/> <xs:element name="contactInfo" type="tns:ContactInfo"/> <xs:complexType name="ContactInfo"> <xs:sequence> <xs:element name="phone" type="pxtns:PhoneNumber" minOccurs="0"/> </xs:sequence> </xs:complexType> </xs:schema> I have two problems here: 1. when I tried to generate sampel xml, the child elements of phone didn't show up. Can you point out where I'm wrong? 2. I realize that phone is still in the target namespace of contactInfo. I guess suppose the children of phone will be in proxy namespace. The generated sample xml is like the following: <?xml version="1.0" encoding="UTF-8"?> <tns:contactInfo xsi:schemaLocation="http://www.aa.com/datamodel/account accountContact_proxy.xsd" xmlns:tns="http://www.aa.com/datamodel/account" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <tns:phone/> </tns:contactInfo> To me it seems like it is the nature of xml schema, you define an element inside a sequence, then this element has to be in the same namespace as of target namespace, even the child elements are in different namespace. Is it possible that I can make my scenario work from schema? I know I'm not fully understand schema yet. (my scenario is: I 'm trying to think if I can make author in one namespace other than target namespace, and make editor to be in another namespace other than target namespace.) Thanks, Helen On Wed, Jul 13, 2011 at 12:28 PM, Geert Josten <[email protected]> wrote: > Nice.. :) > > -----Oorspronkelijk bericht----- > Van: [email protected] > [mailto:[email protected]] Namens Joseph Bryan > Verzonden: woensdag 13 juli 2011 18:15 > Aan: General MarkLogic Developer Discussion > Onderwerp: Re: [MarkLogic Dev General] question about organizing schema > > Hi Helen, > > The XML Schema design pattern that allows you to import a "common" > schema and have it inherit the namespace of the schema that imports it > is sometimes called a "Chameleon" namespace design. > > This is achieved by placing the "common" schema in the empty > namespace, and using the following method to import it into another > schema and apply a namespace to it: > > <xs:include schemaLocation="common.xsd"/> > > There is a good write-up of it here: > http://www.xfront.com/ZeroOneOrManyNamespaces.html#mixed > > Thanks. > > -jb > > > On Wed, Jul 13, 2011 at 12:00 PM, helen chen <[email protected]> wrote: >> Hi Geert, >> >> I played a little bit, I created a common schema with type PhoneNumber >> in namespace "http://www.aa.com/datamodel/common" , and then a >> contactInfo schema in namespace "http://www.aa.com/datamodel/account" >> which imports the common schema. The schema is as following: >> >> common schema: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >> xmlns:tns="http://www.aa.com/datamodel/common" >> targetNamespace="http://www.aa.com/datamodel/common" >> elementFormDefault="qualified" attributeFormDefault="qualified"> >> <xs:annotation> >> <xs:documentation>This scheme defines common shared data >> object >> types.</xs:documentation> >> </xs:annotation> >> <xs:complexType name="PhoneNumber"> >> <xs:sequence> >> <xs:element name="countryCode" type="xs:string" >> minOccurs="0" >> maxOccurs="1"/> >> <xs:element name="areaCode" type="xs:string" >> minOccurs="0" maxOccurs="1"/> >> <xs:element name="exchange" type="xs:string" >> minOccurs="0" maxOccurs="1"/> >> <xs:element name="number" type="xs:string" >> minOccurs="0" maxOccurs="1"/> >> <xs:element name="extension" type="xs:string" >> minOccurs="0" maxOccurs="1"/> >> </xs:sequence> >> </xs:complexType> >> </xs:schema> >> >> >> then the contactInfo schema like following: >> <?xml version="1.0" encoding="UTF-8"?> >> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" >> xmlns:tns="http://www.aa.com/datamodel/account" >> xmlns:data-common="http://www.aa.com/datamodel/common" >> targetNamespace="http://www.aa.com/datamodel/account" >> elementFormDefault="qualified" attributeFormDefault="qualified"> >> <xs:annotation> >> <xs:documentation>This schema defines data object types used >> for >> interfaces</xs:documentation> >> </xs:annotation> >> <xs:import namespace="http://www.aa.com/datamodel/common" >> schemaLocation="common.xsd"/> >> <xs:element name="contactInfo" type="tns:ContactInfo"/> >> <xs:complexType name="ContactInfo"> >> <xs:sequence> >> <xs:element name="phone" type="data-common:PhoneNumber" >> minOccurs="0"/> >> </xs:sequence> >> </xs:complexType> >> </xs:schema> >> >> >> Then I used XMLspy to create sample xml based on contactInfo schema: >> >> <?xml version="1.0" encoding="UTF-8"?> >> <tns:contactInfo >> xsi:schemaLocation="http://www.aa.com/datamodel/account >> accountContact.xsd" xmlns:tns="http://www.aa.com/datamodel/account" >> xmlns:data-common="http://www.aa.com/datamodel/common" >> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> >> <tns:phone> >> <data-common:countryCode>String</data-common:countryCode> >> <data-common:areaCode>String</data-common:areaCode> >> <data-common:exchange>String</data-common:exchange> >> <data-common:number>String</data-common:number> >> <data-common:extension>String</data-common:extension> >> </tns:phone> >> </tns:contactInfo> >> >> >> you can see for contactInfo, the element phone is in the same >> namespace of contactinfo, but all the child elements inside phone are >> in common namespace. >> >> This result is not what I want. I think usually I would prefer the >> element phone and all its' children are in the same namespace (like >> common). >> >> Did I miss anything here? >> >> Thanks, Helen >> >> >> >> On Wed, Jul 13, 2011 at 2:56 AM, Geert Josten <[email protected]> >> wrote: >>> Hi Helen, >>> >>> I'd recommend to make a shared schema file (more or less your option 2) >>> that contains complex types for things like address and person. When >>> defining an editor, you simply say that the type of that element is that of >>> the complex type person. That way editor will be in its own namespace, but >>> person as type still shareable.. >>> >>> HTH >>> >>> Kind regards, >>> Geert >>> >>> -----Oorspronkelijk bericht----- >>> Van: [email protected] >>> [mailto:[email protected]] Namens helen chen >>> Verzonden: dinsdag 12 juli 2011 21:48 >>> Aan: [email protected] >>> Onderwerp: [MarkLogic Dev General] question about organizing schema >>> >>> Hello there, >>> >>> I'm learning xml schema, and I have a question that somewhat confuses me. >>> >>> if I have a structure like the following: >>> >>> person >>> profile >>> firstname >>> lastname >>> title >>> address >>> street >>> city >>> state >>> zip >>> >>> in Marklogic, if I have element editor and author, and I want to >>> distinguish them in different namespace so when I do search by name, I >>> won't mix editor's name and author's name. >>> >>> I can have two ways to design the schema: >>> >>> 1. when I design the schema, I would put editor into one schema with >>> one namespace, and put author into another schema with another >>> namespace. this way inside document editor and author are seperated by >>> namespace. This way can fit the marklogic search. >>> >>> 2. just by looking at the structure, I'm very easily to think about >>> putting profile and address into a common schema with namespace like >>> "common-ns". and then another schema for person, which will import the >>> the common schema to reuse the profile element and address element. >>> but the person schema usually will be in another namespace. I have >>> this thinking is because I do java a lot and this way seems to make >>> element reusable. >>> but the problem for this approach is: since editor and author are >>> all type of person, and person will import common schema, so all the >>> profiles for editor and author will be in same namespace, then in >>> marklogic I won't be able to distinguish them and cannot do search. >>> >>> Maybe I mixed the schema design with Marklogic. I'm kind of new to >>> schema design, and to me both way seems to have their purpose. >>> >>> I'm wondering in general when designing schema, do we make reusable >>> element in a common schema? if so, then what is best/common way for >>> using namespace in schema? >>> >>> Or in this case, what is the common way to design the schema? Does the >>> common way schema design always fit Marklogic? >>> >>> One idea pops up to me is: maybe Marklogic is for data manipulate, so >>> we have one schema for marklogic, and then another schema to be used >>> for public. >>> >>> I hope to get some help on this topic, or maybe point me to some >>> articles that describe the common sense of schema design. >>> >>> Thanks a lot, >>> Helen >>> _______________________________________________ >>> General mailing list >>> [email protected] >>> http://developer.marklogic.com/mailman/listinfo/general >>> _______________________________________________ >>> General mailing list >>> [email protected] >>> http://developer.marklogic.com/mailman/listinfo/general >>> >> _______________________________________________ >> General mailing list >> [email protected] >> http://developer.marklogic.com/mailman/listinfo/general >> > _______________________________________________ > General mailing list > [email protected] > http://developer.marklogic.com/mailman/listinfo/general > _______________________________________________ > General mailing list > [email protected] > http://developer.marklogic.com/mailman/listinfo/general > _______________________________________________ General mailing list [email protected] http://developer.marklogic.com/mailman/listinfo/general
