internal static XmlSchemaComplexType GenerateComplexTypeABIE(GeneratorContext context, XmlSchema schema, IAbie abie, string abiePrefix) { // R A4CE, R AF95: a complex type must be defined for each ABIE XmlSchemaComplexType complexTypeBIE = new XmlSchemaComplexType(); // R 9D83: the name of the ABIE must be the DictionaryEntryName with all whitespace and separators // removed. The 'Details' suffix is replaced with 'Type'. complexTypeBIE.Name = abie.Name + "Type"; if (context.Annotate) { complexTypeBIE.Annotation = GetABIEAnnotation(abie); } // create the sequence for the BBIEs within the ABIE XmlSchemaSequence sequenceBBIEs = new XmlSchemaSequence(); foreach (IBbie bbie in abie.Bbies) { // R 89A6: for every BBIE a named element must be locally declared XmlSchemaElement elementBBIE = new XmlSchemaElement(); // R AEFE, R 96D9, R9A40, R A34A are implemented in GetXsdElementNameFromBbie(...) elementBBIE.Name = NDR.GetXsdElementNameFromBbie(bbie); // R 8B85: every BBIE type must be named the property term and qualifiers and the // representation term of the basic business information entity (BBIE) it represents // with the word 'Type' appended. elementBBIE.SchemaTypeName = new XmlQualifiedName(NSPREFIX_BDT + ":" + NDR.GetXsdTypeNameFromBdt(bbie.Bdt)); // R 90F9: cardinality of elements within the ABIE elementBBIE.MinOccursString = AdjustLowerBound(bbie.LowerBound); elementBBIE.MaxOccursString = AdjustUpperBound(bbie.UpperBound); if (context.Annotate) { elementBBIE.Annotation = GetBBIEAnnotation(bbie); } // add the element created to the sequence sequenceBBIEs.Items.Add(elementBBIE); } foreach (IAsbie asbie in abie.Asbies.OrderBy(a => a.Name)) { XmlSchemaElement elementASBIE = new XmlSchemaElement(); // R A08A: name of the ASBIE elementASBIE.Name = NDR.GetXsdElementNameFromAsbie(asbie); elementASBIE.SchemaTypeName = new XmlQualifiedName(abiePrefix + ":" + asbie.AssociatedAbie.Name + "Type"); if (context.Annotate) { elementASBIE.Annotation = GetASBIEAnnotiation(asbie); } if (asbie.AggregationKind == AggregationKind.Shared) { XmlSchemaElement refASBIE = new XmlSchemaElement(); refASBIE.RefName = new XmlQualifiedName(abiePrefix + ":" + elementASBIE.Name); // every shared ASCC may only appear once in the XSD file if (!globalASBIEs.Contains(elementASBIE.Name)) { // R 9241: for ASBIEs with AggregationKind = shared a global element must be declared. schema.Items.Add(elementASBIE); globalASBIEs.Add(elementASBIE.Name); } sequenceBBIEs.Items.Add(refASBIE); } else { //R 9025: ASBIEs with Aggregation Kind = composite a local element for the // associated ABIE must be declared in the associating ABIE complex type. sequenceBBIEs.Items.Add(elementASBIE); } } // add the sequence created to the complex type complexTypeBIE.Particle = sequenceBBIEs; return(complexTypeBIE); }
///<summary> ///</summary> ///<param name="context"></param> ///<param name="bdts"></param> public static void GenerateXSD(GeneratorContext context, IEnumerable <IBdt> bdts) { var schema = new XmlSchema { TargetNamespace = context.TargetNamespace }; schema.Namespaces.Add(context.NamespacePrefix, context.TargetNamespace); schema.Namespaces.Add("xsd", "http://www.w3.org/2001/XMLSchema"); schema.Namespaces.Add("ccts", "urn:un:unece:uncefact:documentation:standard:XMLNDRDocumentation:3"); schema.Version = context.DocLibrary.VersionIdentifier.DefaultTo("1"); foreach (IBdt bdt in bdts) { var sups = new List <IBdtSup>(bdt.Sups); if (sups.Count == 0) { var simpleType = new XmlSchemaSimpleType { Name = NDR.GetXsdTypeNameFromBdt(bdt) }; var simpleTypeRestriction = new XmlSchemaSimpleTypeRestriction { BaseTypeName = GetXmlQualifiedName(bdt.Con.BasicType.Name) }; simpleType.Content = simpleTypeRestriction; if (context.Annotate) { simpleType.Annotation = GetTypeAnnotation(bdt); } schema.Items.Add(simpleType); } else { var complexType = new XmlSchemaComplexType { Name = NDR.GetXsdTypeNameFromBdt(bdt) }; var simpleContent = new XmlSchemaSimpleContent(); var simpleContentExtension = new XmlSchemaSimpleContentExtension { BaseTypeName = GetXmlQualifiedName(bdt.Con.BasicType.Name) }; foreach (IBdtSup sup in sups) { var attribute = new XmlSchemaAttribute { // Deviation from rule [R ABC1]: Using only attribute name and type as xml attribute name (instead of complete DEN), following the examples given in the specification. Name = NDR.GetXsdAttributeNameFromSup(sup), SchemaTypeName = new XmlQualifiedName(GetXSDType(sup.BasicType.Name), "http://www.w3.org/2001/XMLSchema"), }; if (context.Annotate) { attribute.Annotation = GetAttributeAnnotation(sup); } simpleContentExtension.Attributes.Add(attribute); } simpleContent.Content = simpleContentExtension; complexType.ContentModel = simpleContent; if (context.Annotate) { complexType.Annotation = GetTypeAnnotation(bdt); } schema.Items.Add(complexType); } } context.AddSchema(schema, "BusinessDataType_" + schema.Version + ".xsd"); }
static XmlSchemaElement CreateBbieSchemaElement(IBbie bbie, GeneratorContext context) { // R 89A6: for every BBIE a named element must be locally declared XmlSchemaElement elementBBIE = new XmlSchemaElement(); // R AEFE, R 96D9, R9A40, R A34A are implemented in GetXsdElementNameFromBbie(...) elementBBIE.Name = NDR.GetXsdElementNameFromBbie(bbie); // R 8B85: every BBIE type must be named the property term and qualifiers and the // representation term of the basic business information entity (BBIE) it represents // with the word 'Type' appended. if (bbie.Bdt != null && bbie.Bdt.Con != null) { if (bbie.Bdt.Con.BasicType != null && bbie.Bdt.Con.BasicType.IsEnum) { //figure out if the set of values is restricted var basicEnum = bbie.Bdt.Con.BasicType.Enum as UpccEnum; //use this method only if there are values specified in the basic enum. If not then we simply use the type if (basicEnum != null && basicEnum.CodelistEntries.Any()) { var sourceEnum = basicEnum.SourceElement as UpccEnum; if (sourceEnum != null) { var restrictedtype = new XmlSchemaComplexType(); var sympleContent = new XmlSchemaSimpleContent(); var restriction = new XmlSchemaSimpleContentRestriction(); restriction.BaseTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetXsdTypeNameFromBdt(bbie.Bdt)); addEnumerationValues(restriction, basicEnum); //add restriction to simplecontent sympleContent.Content = restriction; //add the restriction to the simple type restrictedtype.ContentModel = sympleContent; //set the type of the BBIE elementBBIE.SchemaType = restrictedtype; } } } if (bbie.Bdt.isDirectXSDType) { var XSDtype = bbie.Bdt.xsdType; if (!string.IsNullOrEmpty(XSDtype)) { if (bbie.Bdt.Con.AllFacets.Any()) { //add facets var restrictedtype = new XmlSchemaSimpleType(); var restriction = new XmlSchemaSimpleTypeRestriction(); restriction.BaseTypeName = new XmlQualifiedName(NSPREFIX_XSD + ":" + XSDtype); NDR.addFacets(restriction, bbie.Bdt.Con.AllFacets); //add the restriction to the simple type restrictedtype.Content = restriction; //set the type of the BBIE elementBBIE.SchemaType = restrictedtype; } else { elementBBIE.SchemaTypeName = new XmlQualifiedName(NSPREFIX_XSD + ":" + XSDtype); } } } if (bbie.Facets.Any()) { //add facets if (bbie.Bdt.Sups.Any()) { //create a complex type var complexType = new XmlSchemaComplexType(); //add the simple content extension var simpleContent = new XmlSchemaSimpleContent(); var restriction = new XmlSchemaSimpleContentRestriction(); restriction.BaseTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetXsdTypeNameFromBdt(bbie.Bdt)); //add the facets NDR.addFacets(restriction, bbie.Facets); //add the simple content to the complex object simpleContent.Content = restriction; complexType.ContentModel = simpleContent; //add the complex type to the element elementBBIE.SchemaType = complexType; } else { //create a simple type var restrictedtype = new XmlSchemaSimpleType(); var restriction = new XmlSchemaSimpleTypeRestriction(); restriction.BaseTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetXsdTypeNameFromBdt(bbie.Bdt)); NDR.addFacets(restriction, bbie.Facets); //add the restriction to the simple type restrictedtype.Content = restriction; //set the type of the BBIE elementBBIE.SchemaType = restrictedtype; } } if (elementBBIE.SchemaType == null && elementBBIE.SchemaTypeName.IsEmpty) { //use type without facets elementBBIE.SchemaTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetXsdTypeNameFromBdt(bbie.Bdt)); } } // R 90F9: cardinality of elements within the ABIE elementBBIE.MinOccursString = AdjustLowerBound(bbie.LowerBound); elementBBIE.MaxOccursString = AdjustUpperBound(bbie.UpperBound); return(elementBBIE); }
public static void GenerateXSD(GeneratorContext context, XmlSchema schema) { var enums = new List <IEnum>(); var generatedBDTs = new List <string>(); //loop the bdt's foreach (IBdt bdt in context.Elements .OfType <IBdt>().Where(x => !x.isDirectXSDType)) { var xsdBdtName = NDR.GetXsdTypeNameFromBdt(bdt); //get the enum from the CON attribute and add it to the enums list. var enumToAdd = bdt.Con?.BasicType?.Enum; if (enumToAdd != null && !enums.Any(x => x.Name == enumToAdd.Name)) { enums.Add(enumToAdd); } //make sure we don't generate two BDT's witht he same xsdBdtName if (!generatedBDTs.Contains(xsdBdtName)) { //add the xsdBdtName to the list generatedBDTs.Add(xsdBdtName); var sups = new List <IBdtSup>(bdt.Sups); if (!sups.Any()) { var simpleType = new XmlSchemaSimpleType { Name = xsdBdtName }; var simpleTypeRestriction = new XmlSchemaSimpleTypeRestriction(); simpleTypeRestriction.BaseTypeName = GetXmlQualifiedName(NDR.getConBasicTypeName(bdt), context, bdt.Con?.BasicType); simpleType.Content = simpleTypeRestriction; if (bdt.Con != null && bdt.Con.BasicType != null && bdt.Con.BasicType.Prim != null) { var XSDtype = bdt.Con.BasicType.Prim.xsdType; if (!string.IsNullOrEmpty(XSDtype)) { simpleTypeRestriction.BaseTypeName = new XmlQualifiedName(NSPREFIX_XSD + ":" + XSDtype); } } if (context.Annotate) { simpleType.Annotation = GetTypeAnnotation(bdt); } schema.Items.Add(simpleType); } else { //create the complex type var complexType = new XmlSchemaComplexType(); complexType.Name = xsdBdtName; //add the simple content extension var simpleContent = new XmlSchemaSimpleContent(); var simpleContentExtension = new XmlSchemaSimpleContentExtension(); //get the xsd type if the con is a primitive if (bdt.Con.BasicType != null && bdt.Con.BasicType.Prim != null) { simpleContentExtension.BaseTypeName = GetXmlQualifiedName(bdt.Con.BasicType.Prim.xsdType, context, bdt.Con.BasicType); } else { var basicEnum = bdt.Con?.BasicType?.Enum; if (basicEnum != null) { //enum was already added tot he list above simpleContentExtension.BaseTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetBasicTypeName(basicEnum)); } else { simpleContentExtension.BaseTypeName = GetXmlQualifiedName(NDR.getConBasicTypeName(bdt), context, bdt.Con.BasicType); } } foreach (IBdtSup sup in sups) { var attribute = new XmlSchemaAttribute(); // Deviation from rule [R ABC1]: Using only attribute name and type as xml attribute name (instead of complete DEN), following the examples given in the specification. attribute.Name = sup.Name; //set optional or required attribute.Use = sup.IsOptional() ? XmlSchemaUse.Optional : XmlSchemaUse.Required; //set the type of the attribute if (sup.BasicType != null && sup.BasicType.IsEnum) { //figure out if the set of values is restricted var basicEnum = sup.BasicType.Enum as UpccEnum; //add the enum to the list if (!enums.Any(x => x.Name == basicEnum.Name)) { enums.Add(basicEnum); } if (basicEnum.CodelistEntries.Any()) { //add the restrictions var restrictedtype = new XmlSchemaSimpleType(); var restriction = new XmlSchemaSimpleTypeRestriction(); restriction.BaseTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetBasicTypeName(basicEnum)); addEnumerationValues(restriction, basicEnum); //add the restriction to the simple type restrictedtype.Content = restriction; //set the type of the attribute attribute.SchemaType = restrictedtype; } else { attribute.SchemaTypeName = new XmlQualifiedName(context.NamespacePrefix + ":" + NDR.GetBasicTypeName(basicEnum)); } } //set regular type name if not restricted if (attribute.SchemaTypeName.IsEmpty && attribute.SchemaType == null) { attribute.SchemaTypeName = GetXmlQualifiedName(NDR.GetBasicTypeName(sup as UpccAttribute), context, sup.BasicType); } //annotate if needed if (context.Annotate) { attribute.Annotation = GetAttributeAnnotation(sup); } //add the attribute simpleContentExtension.Attributes.Add(attribute); } simpleContent.Content = simpleContentExtension; complexType.ContentModel = simpleContent; if (context.Annotate) { complexType.Annotation = GetTypeAnnotation(bdt); } schema.Items.Add(complexType); } } } context.AddElements(enums); }