2 // System.Xml.Schema.XmlSchemaSimpleType.cs
\r
5 // Dwivedi, Ajay kumar Adwiv@Yahoo.com
\r
6 // Atsushi Enomoto ginga@kit.hi-ho.ne.jp
\r
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
30 using System.Xml.Serialization;
\r
32 using Mono.Xml.Schema;
\r
34 namespace System.Xml.Schema
\r
37 /// Summary description for XmlSchemaSimpleType.
\r
39 public class XmlSchemaSimpleType : XmlSchemaType
\r
41 const string xmlname = "simpleType";
\r
42 private static XmlSchemaSimpleType schemaLocationType;
\r
44 private XmlSchemaSimpleTypeContent content;
\r
46 internal bool islocal = true; // Assuming local means we have to specify islocal=false only in XmlSchema
\r
47 private bool recursed;
\r
48 private XmlSchemaDerivationMethod variety;
\r
51 // predefined simple types
\r
52 internal static readonly XmlSchemaSimpleType XsAnySimpleType;
\r
53 internal static readonly XmlSchemaSimpleType XsString;
\r
54 internal static readonly XmlSchemaSimpleType XsBoolean;
\r
55 internal static readonly XmlSchemaSimpleType XsDecimal;
\r
56 internal static readonly XmlSchemaSimpleType XsFloat;
\r
57 internal static readonly XmlSchemaSimpleType XsDouble;
\r
58 internal static readonly XmlSchemaSimpleType XsDuration;
\r
59 internal static readonly XmlSchemaSimpleType XsDateTime;
\r
60 internal static readonly XmlSchemaSimpleType XsTime;
\r
61 internal static readonly XmlSchemaSimpleType XsDate;
\r
62 internal static readonly XmlSchemaSimpleType XsGYearMonth;
\r
63 internal static readonly XmlSchemaSimpleType XsGYear;
\r
64 internal static readonly XmlSchemaSimpleType XsGMonthDay;
\r
65 internal static readonly XmlSchemaSimpleType XsGDay;
\r
66 internal static readonly XmlSchemaSimpleType XsGMonth;
\r
67 internal static readonly XmlSchemaSimpleType XsHexBinary;
\r
68 internal static readonly XmlSchemaSimpleType XsBase64Binary;
\r
69 internal static readonly XmlSchemaSimpleType XsAnyUri;
\r
70 internal static readonly XmlSchemaSimpleType XsQName;
\r
71 internal static readonly XmlSchemaSimpleType XsNotation;
\r
72 internal static readonly XmlSchemaSimpleType XsNormalizedString;
\r
73 internal static readonly XmlSchemaSimpleType XsToken;
\r
74 internal static readonly XmlSchemaSimpleType XsLanguage;
\r
75 internal static readonly XmlSchemaSimpleType XsNMToken;
\r
76 internal static readonly XmlSchemaSimpleType XsNMTokens;
\r
77 internal static readonly XmlSchemaSimpleType XsName;
\r
78 internal static readonly XmlSchemaSimpleType XsNCName;
\r
79 internal static readonly XmlSchemaSimpleType XsID;
\r
80 internal static readonly XmlSchemaSimpleType XsIDRef;
\r
81 internal static readonly XmlSchemaSimpleType XsIDRefs;
\r
82 internal static readonly XmlSchemaSimpleType XsEntity;
\r
83 internal static readonly XmlSchemaSimpleType XsEntities;
\r
84 internal static readonly XmlSchemaSimpleType XsInteger;
\r
85 internal static readonly XmlSchemaSimpleType XsNonPositiveInteger;
\r
86 internal static readonly XmlSchemaSimpleType XsNegativeInteger;
\r
87 internal static readonly XmlSchemaSimpleType XsLong;
\r
88 internal static readonly XmlSchemaSimpleType XsInt;
\r
89 internal static readonly XmlSchemaSimpleType XsShort;
\r
90 internal static readonly XmlSchemaSimpleType XsByte;
\r
91 internal static readonly XmlSchemaSimpleType XsNonNegativeInteger;
\r
92 internal static readonly XmlSchemaSimpleType XsUnsignedLong;
\r
93 internal static readonly XmlSchemaSimpleType XsUnsignedInt;
\r
94 internal static readonly XmlSchemaSimpleType XsUnsignedShort;
\r
95 internal static readonly XmlSchemaSimpleType XsUnsignedByte;
\r
96 internal static readonly XmlSchemaSimpleType XsPositiveInteger;
\r
98 internal static readonly XmlSchemaSimpleType XdtUntypedAtomic;
\r
99 internal static readonly XmlSchemaSimpleType XdtAnyAtomicType;
\r
100 internal static readonly XmlSchemaSimpleType XdtYearMonthDuration;
\r
101 internal static readonly XmlSchemaSimpleType XdtDayTimeDuration;
\r
104 static XmlSchemaSimpleType ()
\r
106 // This is not used in the meantime.
\r
107 XmlSchemaSimpleType st = new XmlSchemaSimpleType ();
\r
108 XmlSchemaSimpleTypeList list = new XmlSchemaSimpleTypeList ();
\r
109 list.ItemTypeName = new XmlQualifiedName ("anyURI", XmlSchema.Namespace);
\r
111 st.BaseXmlSchemaTypeInternal = null;
\r
112 st.variety = XmlSchemaDerivationMethod.List;
\r
113 schemaLocationType = st;
\r
116 // Built-In schema types
\r
117 XsAnySimpleType = BuildSchemaType ("anySimpleType", null);
\r
118 XsString = BuildSchemaType ("string", "anySimpleType");
\r
119 XsBoolean = BuildSchemaType ("boolean", "anySimpleType");
\r
120 XsDecimal = BuildSchemaType ("decimal", "anySimpleType");
\r
121 XsFloat = BuildSchemaType ("float", "anySimpleType");
\r
122 XsDouble = BuildSchemaType ("double", "anySimpleType");
\r
123 XsDuration = BuildSchemaType ("duration", "anySimpleType");
\r
124 XsDateTime = BuildSchemaType ("dateTime", "anySimpleType");
\r
125 XsTime = BuildSchemaType ("time", "anySimpleType");
\r
126 XsDate = BuildSchemaType ("date", "anySimpleType");
\r
127 XsGYearMonth = BuildSchemaType ("gYearMonth", "anySimpleType");
\r
128 XsGYear = BuildSchemaType ("gYear", "anySimpleType");
\r
129 XsGMonthDay = BuildSchemaType ("gMonthDay", "anySimpleType");
\r
130 XsGDay = BuildSchemaType ("gDay", "anySimpleType");
\r
131 XsGMonth = BuildSchemaType ("gMonth", "anySimpleType");
\r
132 XsHexBinary = BuildSchemaType ("hexBinary", "anySimpleType");
\r
133 XsBase64Binary = BuildSchemaType ("base64Binary", "anySimpleType");
\r
134 XsAnyUri = BuildSchemaType ("anyURI", "anySimpleType");
\r
135 XsQName = BuildSchemaType ("QName", "anySimpleType");
\r
136 XsNotation = BuildSchemaType ("NOTATION", "anySimpleType");
\r
138 XsNormalizedString = BuildSchemaType ("normalizedString", "string");
\r
139 XsToken = BuildSchemaType ("token", "normalizedString");
\r
140 XsLanguage = BuildSchemaType ("language", "token");
\r
141 XsNMToken = BuildSchemaType ("NMTOKEN", "token");
\r
142 XsName = BuildSchemaType ("Name", "token");
\r
143 XsNCName = BuildSchemaType ("NCName", "Name");
\r
145 XsID = BuildSchemaType ("ID", "NCName");
\r
146 XsIDRef = BuildSchemaType ("IDREF", "NCName");
\r
147 XsEntity = BuildSchemaType ("ENTITY", "NCName");
\r
149 XsInteger = BuildSchemaType ("integer", "decimal");
\r
150 XsNonPositiveInteger = BuildSchemaType ("nonPositiveInteger", "integer");
\r
151 XsNegativeInteger = BuildSchemaType ("negativeInteger", "nonPositiveInteger");
\r
152 XsLong = BuildSchemaType ("long", "integer");
\r
153 XsInt = BuildSchemaType ("int", "long");
\r
154 XsShort = BuildSchemaType ("short", "int");
\r
155 XsByte = BuildSchemaType ("byte", "short");
\r
156 XsNonNegativeInteger = BuildSchemaType ("nonNegativeInteger", "integer");
\r
157 XsUnsignedLong = BuildSchemaType ("unsignedLong", "nonNegativeInteger");
\r
158 XsUnsignedInt = BuildSchemaType ("unsignedInt", "unsignedLong");
\r
159 XsUnsignedShort = BuildSchemaType ("unsignedShort", "unsignedInt");
\r
160 XsUnsignedByte = BuildSchemaType ("unsignedByte", "unsignedShort");
\r
161 XsPositiveInteger = BuildSchemaType ("positiveInteger", "nonNegativeInteger");
\r
164 XdtAnyAtomicType = BuildSchemaType ("anyAtomicType", "anySimpleType", true, false);
\r
165 XdtUntypedAtomic = BuildSchemaType ("untypedAtomic", "anyAtomicType", true, true);
\r
166 XdtDayTimeDuration = BuildSchemaType ("dayTimeDuration", "duration", true, false);
\r
167 XdtYearMonthDuration = BuildSchemaType ("yearMonthDuration", "duration", true, false);
\r
169 // NMTOKENS, IDREFS, ENTITIES - lists
\r
170 XsIDRefs = new XmlSchemaSimpleType ();
\r
171 XmlSchemaSimpleTypeList sl = new XmlSchemaSimpleTypeList ();
\r
172 sl.ItemType = XsIDRef;
\r
173 XsIDRefs.Content = sl;
\r
174 XsEntities = new XmlSchemaSimpleType ();
\r
175 sl = new XmlSchemaSimpleTypeList ();
\r
176 sl.ItemType = XsEntity;
\r
177 XsEntities.Content = sl;
\r
178 XsNMTokens = new XmlSchemaSimpleType ();
\r
179 sl = new XmlSchemaSimpleTypeList ();
\r
180 sl.ItemType = XsNMToken;
\r
181 XsNMTokens.Content = sl;
\r
186 private static XmlSchemaSimpleType BuildSchemaType (string name, string baseName)
\r
188 return BuildSchemaType (name, baseName, false, false);
\r
191 private static XmlSchemaSimpleType BuildSchemaType (string name, string baseName, bool xdt, bool baseXdt)
\r
193 string ns = xdt ? "http://www.w3.org/2003/11/xpath-datatypes" : XmlSchema.Namespace;
\r
194 string ns2 = baseXdt ? "http://www.w3.org/2003/11/xpath-datatypes" : XmlSchema.Namespace;
\r
195 XmlSchemaSimpleType st = new XmlSchemaSimpleType ();
\r
196 st.QNameInternal = new XmlQualifiedName (name, ns);
\r
197 if (baseName != null)
\r
198 st.BaseXmlSchemaTypeInternal = XmlSchemaType. GetBuiltInSimpleType (new XmlQualifiedName (baseName, ns2));
\r
199 st.DatatypeInternal = XmlSchemaDatatype.FromName (st.QualifiedName);
\r
204 internal static XsdAnySimpleType AnySimpleType {
\r
205 get { return XsdAnySimpleType.Instance; }
\r
208 internal static XmlSchemaSimpleType SchemaLocationType {
\r
209 get { return schemaLocationType; }
\r
212 public XmlSchemaSimpleType ()
\r
216 [XmlElement("restriction",typeof(XmlSchemaSimpleTypeRestriction))]
\r
217 [XmlElement("list",typeof(XmlSchemaSimpleTypeList))]
\r
218 [XmlElement("union",typeof(XmlSchemaSimpleTypeUnion))]
\r
219 public XmlSchemaSimpleTypeContent Content
\r
221 get{ return content; }
\r
222 set{ content = value; }
\r
225 internal XmlSchemaDerivationMethod Variety
\r
227 get{ return variety; }
\r
231 /// For a simple Type:
\r
232 /// 1. Content must be present
\r
233 /// 2. id if present, must have be a valid ID
\r
234 /// a) If the simpletype is local
\r
235 /// 1- are from <xs:complexType name="simpleType"> and <xs:complexType name="localSimpleType">
\r
236 /// 1. name is prohibited
\r
237 /// 2. final is prohibited
\r
238 /// b) If the simpletype is toplevel
\r
239 /// 1- are from <xs:complexType name="simpleType"> and <xs:complexType name="topLevelSimpleType">
\r
240 /// 1. name is required, type must be NCName
\r
241 /// 2. Content is required
\r
242 /// 3. final can have values : #all | (list | union | restriction)
\r
243 /// 4. If final is set, finalResolved is same as final (but within the values of b.3)
\r
244 /// 5. If final is not set, the finalDefault of the schema (ie. only #all and restriction)
\r
245 /// 6. Base type is:
\r
246 /// 4.1 If restriction is chosen,the base type of restriction or elements
\r
247 /// 4.2 otherwise simple ur-type
\r
249 internal override int Compile(ValidationEventHandler h, XmlSchema schema)
\r
251 // If this is already compiled this time, simply skip.
\r
252 if (this.IsComplied (schema.CompilationId))
\r
255 if (Content != null)
\r
256 Content.Parent = this;
\r
261 if(this.islocal) // a
\r
263 if(this.Name != null) // a.1
\r
264 error(h,"Name is prohibited in a local simpletype");
\r
266 this.QNameInternal = new XmlQualifiedName(this.Name,schema.TargetNamespace);
\r
267 if(this.Final != XmlSchemaDerivationMethod.None) //a.2
\r
268 error(h,"Final is prohibited in a local simpletype");
\r
272 if(this.Name == null) //b.1
\r
273 error(h,"Name is required in top level simpletype");
\r
274 else if(!XmlSchemaUtil.CheckNCName(this.Name)) // b.1.2
\r
275 error(h,"name attribute of a simpleType must be NCName");
\r
277 this.QNameInternal = new XmlQualifiedName(this.Name,schema.TargetNamespace);
\r
279 //NOTE: Although the FinalResolved can be Empty, it is not a valid value for Final
\r
280 //DEVIATION: If an error occurs, the finaldefault is always consulted. This deviates
\r
281 // from the way MS implementation works.
\r
282 switch(this.Final) //b.3, b.4
\r
284 case XmlSchemaDerivationMethod.All:
\r
285 this.finalResolved = XmlSchemaDerivationMethod.All;
\r
287 case XmlSchemaDerivationMethod.List:
\r
288 case XmlSchemaDerivationMethod.Union:
\r
289 case XmlSchemaDerivationMethod.Restriction:
\r
290 this.finalResolved = Final;
\r
293 error(h,"The value of final attribute is not valid for simpleType");
\r
294 goto case XmlSchemaDerivationMethod.None;
\r
295 // use assignment from finaldefault on schema.
\r
296 case XmlSchemaDerivationMethod.None: // b.5
\r
297 XmlSchemaDerivationMethod flags =
\r
298 (XmlSchemaDerivationMethod.Restriction | XmlSchemaDerivationMethod.List |
\r
299 XmlSchemaDerivationMethod.Extension | XmlSchemaDerivationMethod.Union );
\r
300 switch (schema.FinalDefault) {
\r
301 case XmlSchemaDerivationMethod.All:
\r
302 finalResolved = XmlSchemaDerivationMethod.All;
\r
304 case XmlSchemaDerivationMethod.None:
\r
305 finalResolved = XmlSchemaDerivationMethod.Empty;
\r
308 finalResolved = schema.FinalDefault & flags;
\r
315 XmlSchemaUtil.CompileID(Id,this,schema.IDCollection,h);
\r
317 if (Content != null)
\r
318 Content.OwnerType = this;
\r
320 if(this.Content == null) //a.3,b.2
\r
321 error(h,"Content is required in a simpletype");
\r
322 else if(Content is XmlSchemaSimpleTypeRestriction)
\r
324 this.resolvedDerivedBy = XmlSchemaDerivationMethod.Restriction;
\r
325 errorCount += ((XmlSchemaSimpleTypeRestriction)Content).Compile(h,schema);
\r
327 else if(Content is XmlSchemaSimpleTypeList)
\r
329 this.resolvedDerivedBy = XmlSchemaDerivationMethod.List;
\r
330 errorCount += ((XmlSchemaSimpleTypeList)Content).Compile(h,schema);
\r
332 else if(Content is XmlSchemaSimpleTypeUnion)
\r
334 this.resolvedDerivedBy = XmlSchemaDerivationMethod.Union;
\r
335 errorCount += ((XmlSchemaSimpleTypeUnion)Content).Compile(h,schema);
\r
338 this.CompilationId = schema.CompilationId;
\r
342 internal void CollectBaseType (ValidationEventHandler h, XmlSchema schema)
\r
344 if (Content is XmlSchemaSimpleTypeRestriction) {
\r
345 object o = ((XmlSchemaSimpleTypeRestriction) Content).GetActualType (h, schema, false);
\r
346 BaseXmlSchemaTypeInternal = o as XmlSchemaSimpleType;
\r
347 if (BaseXmlSchemaTypeInternal != null)
\r
348 DatatypeInternal = BaseXmlSchemaTypeInternal.Datatype;
\r
350 DatatypeInternal = o as XmlSchemaDatatype;
\r
352 // otherwise, actualBaseSchemaType is null
\r
354 DatatypeInternal = XmlSchemaSimpleType.AnySimpleType;
\r
357 internal override int Validate(ValidationEventHandler h, XmlSchema schema)
\r
359 // 3.14.6 Properties Correct.
\r
361 // 1. Post Compilation Properties
\r
362 // {name}, {target namespace} => QNameInternal. Already Compile()d.
\r
363 // {base type definition} => baseSchemaTypeInternal
\r
364 // {final} => finalResolved. Already Compile()d.
\r
365 // {variety} => resolvedDerivedBy. Already Compile()d.
\r
367 // 2. Should be checked by "recursed" field.
\r
369 if(IsValidated (schema.ValidationId))
\r
373 error (h, "Circular type reference was found.");
\r
378 CollectBaseType (h, schema);
\r
380 if (content != null)
\r
381 errorCount += content.Validate (h, schema);
\r
384 // BaseSchemaType property
\r
385 BaseXmlSchemaTypeInternal = content.ActualBaseSchemaType as XmlSchemaType;
\r
386 if (this.BaseXmlSchemaTypeInternal == null)
\r
387 this.DatatypeInternal = content.ActualBaseSchemaType as XmlSchemaDatatype;
\r
390 // Datatype property
\r
391 XmlSchemaSimpleType simple = BaseXmlSchemaType as XmlSchemaSimpleType;
\r
392 if (simple != null)
\r
393 this.DatatypeInternal = simple.Datatype;
\r
395 // DatatypeInternal = BaseSchemaType as XmlSchemaDatatype;
\r
398 XmlSchemaSimpleType baseSType = BaseXmlSchemaType as XmlSchemaSimpleType;
\r
399 if (baseSType != null) {
\r
400 if ((baseSType.FinalResolved & this.resolvedDerivedBy) != 0)
\r
401 error (h, "Specified derivation is prohibited by the base simple type.");
\r
405 if (this.resolvedDerivedBy == XmlSchemaDerivationMethod.Restriction &&
\r
407 this.variety = baseSType.Variety;
\r
409 this.variety = this.resolvedDerivedBy;
\r
411 // 3.14.6 Derivation Valid (Restriction, Simple)
\r
412 XmlSchemaSimpleTypeRestriction r = Content as XmlSchemaSimpleTypeRestriction;
\r
413 object baseType = BaseXmlSchemaType != null ? (object) BaseXmlSchemaType : Datatype;
\r
415 ValidateDerivationValid (baseType, r.Facets, h, schema);
\r
417 // TODO: describe which validation term this belongs to.
\r
418 XmlSchemaSimpleTypeList l = Content as XmlSchemaSimpleTypeList;
\r
420 XmlSchemaSimpleType itemSimpleType = l.ValidatedListItemType as XmlSchemaSimpleType;
\r
421 if (itemSimpleType != null && itemSimpleType.Content is XmlSchemaSimpleTypeList)
\r
422 error (h, "List type must not be derived from another list type.");
\r
426 ValidationId = schema.ValidationId;
\r
430 // 3.14.6 Derivation Valid (RestrictionSimple)
431 internal void ValidateDerivationValid (object baseType, XmlSchemaObjectCollection facets,
432 ValidationEventHandler h, XmlSchema schema)
435 XmlSchemaSimpleType baseSimpleType = baseType as XmlSchemaSimpleType;
436 switch (this.Variety) {
438 case XmlSchemaDerivationMethod.Restriction:
440 if (baseSimpleType != null && baseSimpleType.resolvedDerivedBy != XmlSchemaDerivationMethod.Restriction)
441 error (h, "Base schema type is not either atomic type or primitive type.");
443 if (baseSimpleType != null &&
444 (baseSimpleType.FinalResolved & XmlSchemaDerivationMethod.Restriction) != 0)
445 error (h, "Derivation by restriction is prohibited by the base simple type.");
446 // TODO: 1.3 facet restriction valid.
448 case XmlSchemaDerivationMethod.List:
450 XmlSchemaSimpleTypeList thisList = Content as XmlSchemaSimpleTypeList;
451 // 2.1 item list type not allowed
452 if (baseSimpleType != null && baseSimpleType.resolvedDerivedBy == XmlSchemaDerivationMethod.List)
453 error (h, "Base list schema type is not allowed.");
454 XmlSchemaSimpleTypeUnion baseUnion = baseSimpleType.Content as XmlSchemaSimpleTypeUnion;
455 if (baseUnion != null) {
456 bool errorFound = false;
457 foreach (object memberType in baseUnion.ValidatedTypes) {
458 XmlSchemaSimpleType memberST = memberType as XmlSchemaSimpleType;
459 if (memberST != null && memberST.resolvedDerivedBy == XmlSchemaDerivationMethod.List)
463 error (h, "Base union schema type should not contain list types.");
466 // 2.2 facets limited
468 foreach (XmlSchemaFacet facet in facets) {
469 if (facet is XmlSchemaLengthFacet ||
470 facet is XmlSchemaMaxLengthFacet ||
471 facet is XmlSchemaMinLengthFacet ||
472 facet is XmlSchemaEnumerationFacet ||
473 facet is XmlSchemaPatternFacet)
476 error (h, "Not allowed facet was found on this simple type which derives list type.");
479 case XmlSchemaDerivationMethod.Union:
484 foreach (XmlSchemaFacet facet in facets) {
485 if (facet is XmlSchemaEnumerationFacet ||
486 facet is XmlSchemaPatternFacet)
489 error (h, "Not allowed facet was found on this simple type which derives list type.");
495 // 3.14.6 Type Derivation OK (Simple)
496 internal bool ValidateTypeDerivationOK (object baseType,
497 ValidationEventHandler h, XmlSchema schema, bool raiseError)
500 // Note that anyType should also be allowed as anySimpleType.
501 if (this == baseType || baseType == XmlSchemaSimpleType.AnySimpleType ||
502 baseType == XmlSchemaComplexType.AnyType)
506 XmlSchemaSimpleType baseSimpleType = baseType as XmlSchemaSimpleType;
507 if (baseSimpleType != null &&
508 (baseSimpleType.FinalResolved & resolvedDerivedBy) != 0) {
510 error (h, "Specified derivation is prohibited by the base type.");
515 if (BaseXmlSchemaType == baseType || Datatype == baseType)
519 XmlSchemaSimpleType thisBaseSimpleType = BaseXmlSchemaType as XmlSchemaSimpleType;
520 if (thisBaseSimpleType != null) {
521 if (thisBaseSimpleType.ValidateTypeDerivationOK (baseType, h, schema, false))
527 case XmlSchemaDerivationMethod.Union:
528 case XmlSchemaDerivationMethod.List:
529 if (baseType == XmlSchemaSimpleType.AnySimpleType)
534 // 2.2.4 validly derived from one of the union member type.
535 if (baseSimpleType != null && baseSimpleType.Variety == XmlSchemaDerivationMethod.Union) {
536 foreach (object memberType in ((XmlSchemaSimpleTypeUnion) baseSimpleType.Content).ValidatedTypes)
537 if (this.ValidateTypeDerivationOK (memberType, h, schema, false))
542 error(h, "Invalid simple type derivation was found.");
546 internal string Normalize (string s, XmlNameTable nt, XmlNamespaceManager nsmgr)
548 return Content.Normalize (s, nt, nsmgr);
552 // final = (#all | (list | union | restriction))
\r
555 // {any attributes with non-schema namespace . . .}>
\r
556 // Content: (annotation?, (restriction | list | union))
\r
558 internal static XmlSchemaSimpleType Read(XmlSchemaReader reader, ValidationEventHandler h)
\r
560 XmlSchemaSimpleType stype = new XmlSchemaSimpleType();
\r
561 reader.MoveToElement();
\r
563 if(reader.NamespaceURI != XmlSchema.Namespace || reader.LocalName != xmlname)
\r
565 error(h,"Should not happen :1: XmlSchemaGroup.Read, name="+reader.Name,null);
\r
570 stype.LineNumber = reader.LineNumber;
\r
571 stype.LinePosition = reader.LinePosition;
\r
572 stype.SourceUri = reader.BaseURI;
\r
574 while(reader.MoveToNextAttribute())
\r
576 if(reader.Name == "final")
\r
579 stype.Final = XmlSchemaUtil.ReadDerivationAttribute(reader, out innerex, "final",
\r
580 XmlSchemaUtil.FinalAllowed);
\r
581 if(innerex != null)
\r
582 error(h, "some invalid values not a valid value for final", innerex);
\r
584 else if(reader.Name == "id")
\r
586 stype.Id = reader.Value;
\r
588 else if(reader.Name == "name")
\r
590 stype.Name = reader.Value;
\r
592 else if((reader.NamespaceURI == "" && reader.Name != "xmlns") || reader.NamespaceURI == XmlSchema.Namespace)
\r
594 error(h,reader.Name + " is not a valid attribute for simpleType",null);
\r
598 XmlSchemaUtil.ReadUnhandledAttribute(reader,stype);
\r
602 reader.MoveToElement();
\r
603 if(reader.IsEmptyElement)
\r
606 // Content: (annotation?, (restriction | list | union))
\r
608 while(reader.ReadNextElement())
\r
610 if(reader.NodeType == XmlNodeType.EndElement)
\r
612 if(reader.LocalName != xmlname)
\r
613 error(h,"Should not happen :2: XmlSchemaSimpleType.Read, name="+reader.Name,null);
\r
616 if(level <= 1 && reader.LocalName == "annotation")
\r
618 level = 2; //Only one annotation
\r
619 XmlSchemaAnnotation annotation = XmlSchemaAnnotation.Read(reader,h);
\r
620 if(annotation != null)
\r
621 stype.Annotation = annotation;
\r
626 if(reader.LocalName == "restriction")
\r
629 XmlSchemaSimpleTypeRestriction restriction = XmlSchemaSimpleTypeRestriction.Read(reader,h);
\r
630 if(restriction != null)
\r
631 stype.content = restriction;
\r
634 if(reader.LocalName == "list")
\r
637 XmlSchemaSimpleTypeList list = XmlSchemaSimpleTypeList.Read(reader,h);
\r
639 stype.content = list;
\r
642 if(reader.LocalName == "union")
\r
645 XmlSchemaSimpleTypeUnion union = XmlSchemaSimpleTypeUnion.Read(reader,h);
\r
647 stype.content = union;
\r
651 reader.RaiseInvalidElementError();
\r