// Creates an <xs:element> element defining the presence of the named element // representing a class public XElement CreateXsElementForNofClass(XDocument xsdDoc, XElement element, bool addCardinality) { // gather details from XML element string localName = element.Name.LocalName; // <xs:element name="AO11ConfirmAnimalRegistration"> // <xs:complexType> // <xs:sequence> // <xs:element ref="nof:title"/> // <!-- placeholder --> // </xs:sequence> // <xs:attribute ref="nof:feature" // default="class"/> // <xs:attribute ref="nof:oid"/> // <xs:attribute ref="nof:annotation"/> // <xs:attribute ref="nof:fqn"/> // </xs:complexType> // </xs:element> // xs:element/@name="class name" // add to XML schema as a global attribute XElement xsElementForNofClassElement = XsMetaModel.CreateXsElementElement(xsdDoc, localName, addCardinality); // xs:element/xs:complexType // xs:element/xs:complexType/xs:sequence XElement xsComplexTypeElement = XsMetaModel.ComplexTypeFor(xsElementForNofClassElement); XElement xsSequenceElement = XsMetaModel.SequenceFor(xsComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element ref="nof:title" XElement xsTitleElement = XsMetaModel.CreateXsElement(Helper.DocFor(xsSequenceElement), "element"); xsTitleElement.SetAttributeValue("ref", NofMetaModel.NofMetamodelNsPrefix + ":" + "title"); xsSequenceElement.Add(xsTitleElement); XsMetaModel.SetXsCardinality(xsTitleElement, 0, 1); // xs:element/xs:complexType/xs:sequence/xs:element ref="extensions" //addXsElementForAppExtensions(xsSequenceElement, extensions); // xs:element/xs:complexType/xs:attribute ... XsMetaModel.AddXsNofFeatureAttributeElements(xsComplexTypeElement, "class"); XsMetaModel.AddXsNofAttribute(xsComplexTypeElement, "oid"); XsMetaModel.AddXsNofAttribute(xsComplexTypeElement, "fqn"); XsMetaModel.AddXsNofAttribute(xsComplexTypeElement, "singular"); XsMetaModel.AddXsNofAttribute(xsComplexTypeElement, "plural"); XsMetaModel.AddXsNofAttribute(xsComplexTypeElement, "annotation"); element.AddAnnotation(xsElementForNofClassElement); return(xsElementForNofClassElement); }
///** // * Creates an <xs:element> element defining the presence of the named element // * representing a collection in a class; appended to xs:sequence element // */ public XElement CreateXsElementForNofCollection(XElement parentXsElementElement, XElement xmlCollectionElement, string referencedClassName) { // gather details from XML element string fieldName = xmlCollectionElement.Name.LocalName; // <xs:element name="%owning object%"> // <xs:complexType> // <xs:sequence> // <xs:element name="%%field object%%"> // <xs:complexType> // <xs:sequence> // <xs:element ref="nof:oids" minOccurs="0" maxOccurs="1"/> // <!-- nested element definitions go here --> // </xs:sequence> // <xs:attribute ref="nof:feature" fixed="collection"/> // <xs:attribute ref="nof:type" fixed="%%appX%%:%%type%%"/> // <xs:attribute ref="nof:size"/> // <xs:attribute ref="nof:annotation"/> // </xs:complexType> // </xs:element> // </xs:sequence> // </xs:complexType> // </xs:element> // xs:element/xs:complexType/xs:sequence XElement parentXsComplexTypeElement = XsMetaModel.ComplexTypeFor(parentXsElementElement); XElement parentXsSequenceElement = XsMetaModel.SequenceFor(parentXsComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element name="%field object%%" XElement xsFieldElementElement = XsMetaModel.CreateXsElementElement(Helper.DocFor(parentXsSequenceElement), fieldName); parentXsSequenceElement.Add(xsFieldElementElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType XElement xsFieldComplexTypeElement = XsMetaModel.ComplexTypeFor(xsFieldElementElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence XElement xsFieldSequenceElement = XsMetaModel.SequenceFor(xsFieldComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element ref="nof:oids" XElement xsFieldOidsElement = XsMetaModel.CreateXsElement(Helper.DocFor(xsFieldSequenceElement), "element"); xsFieldOidsElement.SetAttributeValue("ref", NofMetaModel.NofMetamodelNsPrefix + ":" + "oids"); xsFieldSequenceElement.Add(xsFieldOidsElement); XsMetaModel.SetXsCardinality(xsFieldOidsElement, 0, 1); // extensions // addXsElementForAppExtensions(xsFieldSequenceElement, extensions); // // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:choice // XElement xsFieldChoiceElement = XsMetaModel.choiceFor(xsFieldComplexTypeElement); // placeholder // XsMetaModel.setXsCardinality(xsFieldChoiceElement, 0, Integer.MAX_VALUE); // XElement xsFieldTitleElement = addXsNofRefElementElement(xsFieldSequenceElement, "title"); // XElement xsReferencedElementSequenceElement = sequenceFor(xsFieldSequenceElement); // setXsCardinality(xsReferencedElementSequenceElement, 0, 1); XsMetaModel.AddXsNofFeatureAttributeElements(xsFieldComplexTypeElement, "collection"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "type", "app:" + referencedClassName, false); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "size"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "annotation"); return(xsFieldElementElement); }
// Creates an <xs:element> element defining the presence of the named element // representing a reference to a class; appended to xs:sequence element public XElement CreateXsElementForNofReference(XElement parentXsElementElement, XElement xmlReferenceElement, string referencedClassName) { // gather details from XML element string fieldName = xmlReferenceElement.Name.LocalName; // <xs:element name="%owning object%"> // <xs:complexType> // <xs:sequence> // <xs:element name="%%field object%%"> // <xs:complexType> // <xs:sequence> // <xs:element ref="nof:title" minOccurs="0"/> // <xs:element name="nof-extensions"> // <xs:complexType> // <xs:sequence> // <xs:element name="app:%extension class short name%" minOccurs="0" maxOccurs="1" default="%value%"/> // <xs:element name="app:%extension class short name%" minOccurs="0" maxOccurs="1" default="%value%"/> // ... // <xs:element name="app:%extension class short name%" minOccurs="0" maxOccurs="1" default="%value%"/> // </xs:sequence> // </xs:complexType> // </xs:element> // <xs:sequence minOccurs="0" maxOccurs="1"/> // </xs:sequence> // <xs:attribute ref="nof:feature" fixed="reference"/> // <xs:attribute ref="nof:type" default="%%appX%%:%%type%%"/> // <xs:attribute ref="nof:isEmpty"/> // <xs:attribute ref="nof:annotation"/> // </xs:complexType> // </xs:element> // </xs:sequence> // </xs:complexType> // </xs:element> // xs:element/xs:complexType/xs:sequence XElement parentXsComplexTypeElement = XsMetaModel.ComplexTypeFor(parentXsElementElement); XElement parentXsSequenceElement = XsMetaModel.SequenceFor(parentXsComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element name="%%field object%" XElement xsFieldElementElement = XsMetaModel.CreateXsElementElement(Helper.DocFor(parentXsSequenceElement), fieldName); parentXsSequenceElement.Add(xsFieldElementElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence XElement xsFieldComplexTypeElement = XsMetaModel.ComplexTypeFor(xsFieldElementElement); XElement xsFieldSequenceElement = XsMetaModel.SequenceFor(xsFieldComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element ref="nof:title" XElement xsFieldTitleElement = XsMetaModel.CreateXsElement(Helper.DocFor(xsFieldSequenceElement), "element"); xsFieldTitleElement.SetAttributeValue("ref", NofMetaModel.NofMetamodelNsPrefix + ":" + "title"); xsFieldSequenceElement.Add(xsFieldTitleElement); XsMetaModel.SetXsCardinality(xsFieldTitleElement, 0, 1); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element name="nof-extensions" //addXsElementForAppExtensions(xsFieldSequenceElement, extensions); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:sequence // placeholder XElement xsReferencedElementSequenceElement = XsMetaModel.SequenceFor(xsFieldSequenceElement); XsMetaModel.SetXsCardinality(xsReferencedElementSequenceElement, 0, 1); XsMetaModel.AddXsNofFeatureAttributeElements(xsFieldComplexTypeElement, "reference"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "type", "app:" + referencedClassName, false); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "isEmpty"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "annotation"); return(xsFieldElementElement); }
// Creates an <code>xs:element</code> element to represent a value field in a class. // // The returned element should be appended to <code>xs:sequence</code> element of the // xs:element representing the type of the owning object. public XElement CreateXsElementForNofValue(XElement parentXsElementElement, XElement xmlValueElement) { // gather details from XML element XAttribute datatype = xmlValueElement.Attribute(NofMetaModel.Nof + "datatype"); string fieldName = xmlValueElement.Name.LocalName; // <xs:element name="%owning object%"> // <xs:complexType> // <xs:sequence> // <xs:element name="%%field object%%"> // <xs:complexType> // <xs:sequence> // <xs:element name="nof-extensions"> // <xs:complexType> // <xs:sequence> // <xs:element name="%extensionClassShortName%" default="%extensionObjString" minOccurs="0"/> // <xs:element name="%extensionClassShortName%" default="%extensionObjString" minOccurs="0"/> // ... // <xs:element name="%extensionClassShortName%" default="%extensionObjString" minOccurs="0"/> // </xs:sequence> // </xs:complexType> // </xs:element> // </xs:sequence> // <xs:attribute ref="nof:feature" fixed="value"/> // <xs:attribute ref="nof:datatype" fixed="nof:%datatype%"/> // <xs:attribute ref="nof:isEmpty"/> // <xs:attribute ref="nof:annotation"/> // </xs:complexType> // </xs:element> // </xs:sequence> // </xs:complexType> // </xs:element> // xs:element/xs:complexType/xs:sequence XElement parentXsComplexTypeElement = XsMetaModel.ComplexTypeFor(parentXsElementElement); XElement parentXsSequenceElement = XsMetaModel.SequenceFor(parentXsComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element name="%%field object%" XElement xsFieldElementElement = XsMetaModel.CreateXsElementElement(Helper.DocFor(parentXsSequenceElement), fieldName); parentXsSequenceElement.Add(xsFieldElementElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType XElement xsFieldComplexTypeElement = XsMetaModel.ComplexTypeFor(xsFieldElementElement); // NEW CODE TO SUPPORT EXTENSIONS; // uses a complexType/sequence // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence //XElement xsFieldSequenceElement = XsMetaModel.SequenceFor(xsFieldComplexTypeElement); // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element name="nof-extensions" // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:sequence //addXsElementForAppExtensions(xsFieldSequenceElement, extensions); XsMetaModel.AddXsNofFeatureAttributeElements(xsFieldComplexTypeElement, "value"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "datatype", datatype == null ? "" : datatype.Value); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "isEmpty"); XsMetaModel.AddXsNofAttribute(xsFieldComplexTypeElement, "annotation"); // ORIGINAL CODE THAT DIDN'T EXPORT EXTENSIONS // uses a simpleContent // (I've left this code in in case there is a need to regenerate schemas the "old way"). // <xs:element name="%owning object%"> // <xs:complexType> // <xs:sequence> // <xs:element name="%%field object%%"> // <xs:complexType> // <xs:simpleContent> // <xs:extension base="xs:string"> // <xs:attribute ref="nof:feature" fixed="value"/> // <xs:attribute ref="nof:datatype" fixed="nof:%datatype%"/> // <xs:attribute ref="nof:isEmpty"/> // <xs:attribute ref="nof:annotation"/> // </xs:extension> // </xs:simpleContent> // </xs:complexType> // </xs:element> // </xs:sequence> // </xs:complexType> // </xs:element> // xs:element/xs:complexType/xs:sequence/xs:element/xs:complexType/xs:simpleContent/xs:extension // XElement xsFieldSimpleContentElement = XsMetaModel.simpleContentFor(xsFieldComplexTypeElement); // XElement xsFieldExtensionElement = XsMetaModel.extensionFor(xsFieldSimpleContentElement, "string"); // XsMetaModel.addXsNofFeatureAttributeElements(xsFieldExtensionElement, "value"); // XsMetaModel.addXsNofAttribute(xsFieldExtensionElement, "datatype", datatype); // XsMetaModel.addXsNofAttribute(xsFieldExtensionElement, "isEmpty"); // XsMetaModel.addXsNofAttribute(xsFieldExtensionElement, "annotation"); return(xsFieldElementElement); }